From c9e803216ff08d82050bd5c6cfca8a5d2f9cc4ca Mon Sep 17 00:00:00 2001 From: Tangent Date: Thu, 27 Nov 2025 23:11:14 -0700 Subject: [PATCH] tried toy flightmodel and that does not work either --- flightmodel/main.lua | 144 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 flightmodel/main.lua diff --git a/flightmodel/main.lua b/flightmodel/main.lua new file mode 100644 index 0000000..d857fe4 --- /dev/null +++ b/flightmodel/main.lua @@ -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