Chunk-based world generation
This commit is contained in:
parent
53e0e535f0
commit
1053468a71
2 changed files with 71 additions and 4 deletions
|
|
@ -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="."]
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
Loading…
Reference in a new issue