tried toy flightmodel and that does not work either
This commit is contained in:
@@ -0,0 +1,144 @@
|
||||
local screen_width, screen_height = love.graphics.getDimensions()
|
||||
|
||||
local function distance(x1, y1, x2, y2)
|
||||
delta_x = x1 - x2
|
||||
delta_y = y1 - y2
|
||||
return math.sqrt(delta_x^2 + delta_y^2)
|
||||
end
|
||||
|
||||
orbital_speed = 0.0625 * 2500 -- I have no idea what the fuck this means
|
||||
local function new_body(orbital_radius, body_radius)
|
||||
local body = {
|
||||
orbital_radius = orbital_radius,
|
||||
body_radius = body_radius,
|
||||
rotation_offset = math.pi * 2 * love.math.random(),
|
||||
color = { love.math.random(), love.math.random(), love.math.random(), 1 },
|
||||
}
|
||||
return body
|
||||
end
|
||||
|
||||
local function get_body_position(body, time)
|
||||
local argument = time * orbital_speed / body.orbital_radius^1.337 + body.rotation_offset
|
||||
if (argument == math.huge) or (argument ~= argument) then
|
||||
argument = 0
|
||||
end
|
||||
return body.orbital_radius * math.cos(argument), body.orbital_radius * math.sin(argument)
|
||||
end
|
||||
|
||||
local function draw_body(body, time)
|
||||
local x, y = get_body_position(body, time)
|
||||
love.graphics.setColor(body.color)
|
||||
love.graphics.circle("fill", x, y, body.body_radius)
|
||||
love.graphics.setColor(1, 1, 1, 1) -- TEMP delete this if it works without it
|
||||
end
|
||||
|
||||
local function new_ship()
|
||||
local ship = {
|
||||
orbital_radius = 0,
|
||||
rotation_offset = 0,
|
||||
x = 30, y = 30,
|
||||
orbiting = false,
|
||||
time_offset = 0,
|
||||
parent = nil,
|
||||
}
|
||||
return ship
|
||||
end
|
||||
|
||||
local function get_ship_position(ship, time)
|
||||
if ship.orbiting then
|
||||
local x, y
|
||||
if ship.parent then
|
||||
x, y = get_body_position(ship.parent, time) -- WARNING this should work the same for all objects or things will suck
|
||||
else
|
||||
x, y = 0, 0
|
||||
end
|
||||
local argument = (time - ship.time_offset) * orbital_speed / ship.orbital_radius^1.337 + ship.rotation_offset
|
||||
if (argument == math.huge) or (argument ~= argument) then
|
||||
argument = 0
|
||||
end
|
||||
return x + ship.orbital_radius * math.cos(argument), y + ship.orbital_radius * math.sin(argument)
|
||||
else
|
||||
return ship.x, ship.y
|
||||
end
|
||||
end
|
||||
|
||||
local function draw_ship(ship, time)
|
||||
local x, y = get_ship_position(ship, time)
|
||||
love.graphics.rectangle("line", x - 3, y - 3, 6, 6)
|
||||
end
|
||||
|
||||
local time = os.time()
|
||||
love.math.setRandomSeed(time)
|
||||
local speed = 1
|
||||
|
||||
local bodies = {}
|
||||
table.insert(bodies, new_body(0, 25))
|
||||
for i = 1, 1 do -- TEMP only adding 1 secondary body
|
||||
table.insert(bodies, new_body(love.math.random() * 200 + 100, love.math.random() * 4 + 1))
|
||||
end
|
||||
|
||||
local ship = new_ship()
|
||||
-- ship was in bodies table; not currently possible here
|
||||
|
||||
local camera = { x = 0, y = 0, }
|
||||
function love.update(dt)
|
||||
time = time + dt * speed
|
||||
-- NOTE camera controls 200 * dt
|
||||
|
||||
if not ship.orbiting then
|
||||
if love.keyboard.isDown("w") then
|
||||
ship.y = ship.y - 100 * dt
|
||||
end
|
||||
if love.keyboard.isDown("s") then
|
||||
ship.y = ship.y + 100 * dt
|
||||
end
|
||||
if love.keyboard.isDown("a") then
|
||||
ship.x = ship.x - 100 * dt
|
||||
end
|
||||
if love.keyboard.isDown("d") then
|
||||
ship.x = ship.x + 100 * dt
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local font_size = love.graphics.getFont():getHeight()
|
||||
function love.draw()
|
||||
love.graphics.print("wasd: Move. o: Toggle orbit.", 1, screen_height - (font_size + 1))
|
||||
|
||||
love.graphics.translate(screen_width / 2 - camera.x, screen_height / 2 - camera.y)
|
||||
|
||||
for i = 1, #bodies do
|
||||
local body = bodies[i]
|
||||
draw_body(body, time)
|
||||
end
|
||||
draw_ship(ship, time)
|
||||
end
|
||||
|
||||
-- TEMP ship is always orbiting body 2
|
||||
ship.parent = bodies[2]
|
||||
|
||||
function love.keypressed(key)
|
||||
if key == "escape" then
|
||||
love.event.quit()
|
||||
-- NOTE ignoring speed control
|
||||
elseif key == "o" then
|
||||
if ship.orbiting then
|
||||
local x, y = get_ship_position(ship, time)
|
||||
ship.x = x
|
||||
ship.y = y
|
||||
ship.orbiting = false
|
||||
else
|
||||
-- only works with center (fuck)
|
||||
-- ship.orbital_radius = math.sqrt(ship.x^2 + ship.y^2)
|
||||
-- ship.rotation_offset = math.atan2(ship.y, ship.x)
|
||||
-- ship.time_offset = time
|
||||
-- ship.orbiting = true
|
||||
|
||||
local x, y = get_body_position(ship.parent, time)
|
||||
ship.orbital_radius = distance(x, ship.x, y, ship.y)
|
||||
ship.rotation_offset = math.atan2(ship.y - y, ship.x - x)
|
||||
ship.time_offset = time
|
||||
ship.orbiting = true
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user