diff --git a/scenes/game.tscn b/scenes/game.tscn index 686b580..29397af 100644 --- a/scenes/game.tscn +++ b/scenes/game.tscn @@ -49,16 +49,18 @@ rotation_smoothing_speed = 15.0 shape = SubResource("CircleShape2D_lnu2h") debug_color = Color(0.9686392, 0, 0.4696517, 0.41960785) -[node name="Asteroid" parent="." instance=ExtResource("3_lnu2h")] +[node name="Unloadables" type="Node2D" parent="."] + +[node name="Asteroid" parent="Unloadables" instance=ExtResource("3_lnu2h")] position = Vector2(-42, -173) -[node name="Asteroid2" parent="." instance=ExtResource("3_lnu2h")] +[node name="Asteroid2" parent="Unloadables" instance=ExtResource("3_lnu2h")] position = Vector2(227, 37) -[node name="Asteroid3" parent="." instance=ExtResource("3_lnu2h")] +[node name="Asteroid3" parent="Unloadables" instance=ExtResource("3_lnu2h")] position = Vector2(-216, 134) -[node name="Asteroid4" parent="." instance=ExtResource("3_lnu2h")] +[node name="Asteroid4" parent="Unloadables" instance=ExtResource("3_lnu2h")] position = Vector2(-192, -427) [node name="UI" type="CanvasLayer" parent="."] diff --git a/scripts/game.gd b/scripts/game.gd index daf1abd..25d300a 100644 --- a/scripts/game.gd +++ b/scripts/game.gd @@ -1,4 +1,69 @@ extends Node2D +var chunk_tick_timer = 0 +var chunks = {} +var chunk_process_distance = 6 + +var asteroid_scene = preload("res://scenes/asteroid.tscn") + +func world_to_chunk(position: Vector2) -> Vector2: + return Vector2(floori(position.x / 1024), floori(position.y / 1024)) + +func chunk_to_world(position: Vector2) -> Vector2: + return Vector2(floori(position.x * 1024), floori(position.y * 1024)) + func _process(delta: float) -> void: $UI/Control/BoostText.text = "BOOST: " + str($Player.boost) + chunk_tick_timer -= delta + + if chunk_tick_timer < 0: + chunk_tick_timer = 1 + + var player_chunk = world_to_chunk($Player.position) + + var valid_chunks = [] + + var x_mod = -chunk_process_distance + + while x_mod <= chunk_process_distance: + var y_mod = -chunk_process_distance + + while y_mod <= chunk_process_distance: + var chunk_position = Vector2(player_chunk.x - x_mod, player_chunk.y - y_mod) + + valid_chunks.push_front(chunk_position) + + if !chunks.has(chunk_position): + chunks[chunk_position] = { + "loaded": true, + "time_to_unload": 0, + } + + var amount = 4 + + var i = 0 + + while i < amount: + var asteroid = asteroid_scene.instantiate() + + asteroid.rotation = randf_range(-5.0, 5.0) + asteroid.position = chunk_to_world(chunk_position) + Vector2(randi_range(0, 1024), randi_range(0, 1024)) + + $Unloadables.add_child(asteroid) + + i += 1 + + y_mod += 1 + + x_mod += 1 + + for n in chunks.keys(): + if !valid_chunks.has(n): + chunks.erase(n) + + for n in $Unloadables.get_children(): + var n_pos = world_to_chunk(n.position) + if abs(n_pos.x - player_chunk.x) > chunk_process_distance: + n.queue_free() + elif abs(n_pos.y - player_chunk.y) > chunk_process_distance: + n.queue_free()