beginning of orbital mechanics

This commit is contained in:
2025-11-27 21:58:51 -07:00
parent 3c324e0f76
commit b794fdf4f7
+63 -31
View File
@@ -83,13 +83,13 @@ local ore_types = { "iron ore", "copper ore", "warp fuel", }
-- the "zero relative velocity" key will be a burn whatever amount of fuel/acceleration necessary to match local acceleration
-- which.. since the currently stored velocity is a COMPLETELY SEPARATE SYSTEM - is literally just zeroing velocity which makes it even simpler to execute
local player_ship = {
position_x = screen_width / 2,
position_y = screen_height / 2,
position_x = 100,
position_y = 100,
velocity_x = 0,
velocity_y = 0,
acceleration = 100,
radar_size = 10,
radar_size = 4,
cargo_max_space = 100,
cargo_free_space = 75,
@@ -103,42 +103,54 @@ local player_ship = {
}
local resource_points = {} -- NOTE they're "planets" but I intend for them to be multiple things tbh
local function make_resource_point(x, y)
local current_point = {
position_x = x or math.random() * screen_width / 2,
position_y = y or math.random() * screen_height / 2,
radar_size = 7,
cargo_max_space = 100000,
cargo_free_space = 100000,
cargo_contents = {},
}
-- TODO exclude orbits that would collide
current_point.orbital_radius = math.sqrt(current_point.position_x^2 + current_point.position_y^2)
current_point.rotation_offset = math.atan2(current_point.position_y, current_point.position_x)
-- NOTE can select literally anything
local selected_type = ore_types[math.random(#ore_types)]
local cargo_amount = math.random() * 10000
transfer_cargo(nil, current_point, selected_type, cargo_amount)
local closest_object, distance_squared_to_object = get_closest_object(resource_points, current_point)
if closest_object and distance_squared_to_object <= (closest_object.radar_size^2 + current_point.radar_size^2) * 1.5 then
return
end
table.insert(resource_points, current_point)
return true
end
local function add_resource_points(point_count)
for i = 1, point_count do
local function make_resource_point()
local current_point = {
position_x = math.random() * screen_width,
position_y = math.random() * screen_height,
radar_size = 10,
cargo_max_space = 100000,
cargo_free_space = 100000,
cargo_contents = {},
}
-- NOTE can select literally anything
local selected_type = ore_types[math.random(#ore_types)]
local cargo_amount = math.random() * 10000
transfer_cargo(nil, current_point, selected_type, cargo_amount)
local closest_object, distance_squared_to_object = get_closest_object(resource_points, current_point)
if closest_object and distance_squared_to_object <= (closest_object.radar_size^2 + current_point.radar_size^2) * 1.5 then
return
end
table.insert(resource_points, current_point)
return true
end
if not make_resource_point() then
i = i - 1
end
end
end
add_resource_points(math.random(5))
add_resource_points(8)
-- DEBUG hardcoded points to compare against (except they can still fail to spawn if something else is too close)
make_resource_point(10, 0)
make_resource_point(screen_width / 2 - 10, 0)
local last_message = ""
local game_time = 0
-- local orbital_speed_constant = 1 -- ironically, I think 1 is exactly the speed I want
local orbital_speed_constant = 50
function love.update(dt)
game_time = game_time + dt
-- NOTE this control scheme makes diagonal travel faster than horizontal/vertical
if love.keyboard.isDown("w") or love.keyboard.isDown("up") then
player_ship.velocity_y = player_ship.velocity_y - player_ship.acceleration * dt
@@ -171,6 +183,19 @@ function love.update(dt)
player_ship.position_x = player_ship.position_x + player_ship.velocity_x * dt
player_ship.position_y = player_ship.position_y + player_ship.velocity_y * dt
local player_radius = math.sqrt(player_ship.position_x^2 + player_ship.position_y^2)
local player_rotation_offset = math.atan2(player_ship.position_y, player_ship.position_x)
local x, y = math.cos(dt / player_radius / (1 / orbital_speed_constant) + player_rotation_offset), math.sin(dt / player_radius / (1 / orbital_speed_constant) + player_rotation_offset)
player_ship.position_x = x * player_radius
player_ship.position_y = y * player_radius
for i = 1, #resource_points do
local current_point = resource_points[i]
local x, y = math.cos(game_time / current_point.orbital_radius / (1 / orbital_speed_constant) + current_point.rotation_offset), math.sin(game_time / current_point.orbital_radius / (1 / orbital_speed_constant) + current_point.rotation_offset)
current_point.position_x = x * current_point.orbital_radius
current_point.position_y = y * current_point.orbital_radius
end
-- TODO make this toggleable instead of requiring holding a key
if love.keyboard.isDown("space") then
local function collect_resource()
@@ -208,13 +233,20 @@ local font_height = font:getHeight()
function love.draw()
love.graphics.setColor(1, 1, 1, 1)
-- local camera_offset = {
-- x = screen_width / 2 - player_ship.position_x,
-- y = screen_height / 2 - player_ship.position_y,
-- }
local camera_offset = { x = screen_width / 2, y = screen_height / 2, }
love.graphics.translate(camera_offset.x, camera_offset.y)
love.graphics.rectangle("line", player_ship.position_x - player_ship.radar_size / 2, player_ship.position_y - player_ship.radar_size / 2, player_ship.radar_size, player_ship.radar_size)
for i = 1, #resource_points do
local resource_point = resource_points[i]
love.graphics.circle("line", resource_point.position_x, resource_point.position_y, resource_point.radar_size)
local current_point = resource_points[i]
love.graphics.circle("line", current_point.position_x, current_point.position_y, current_point.radar_size)
end
love.graphics.translate(-camera_offset.x, -camera_offset.y)
love.graphics.print(last_message, 1, 1)
local inventory_status = {}