From 6069a0914a64af5ca8994e7ef952e24f0c321981 Mon Sep 17 00:00:00 2001 From: gdz Date: Sat, 6 Dec 2025 15:18:58 +0100 Subject: [PATCH] Terrain generation on Player exit implemented. There is still a bug with that. --- tile_map_layer.gd | 51 +++++++++++++++++++++++++++------------------ tile_map_layer.tscn | 37 ++++++++++++++++++++++++++------ 2 files changed, 62 insertions(+), 26 deletions(-) diff --git a/tile_map_layer.gd b/tile_map_layer.gd index 677a157..a81cb15 100644 --- a/tile_map_layer.gd +++ b/tile_map_layer.gd @@ -1,20 +1,42 @@ extends Node -const CHUNK_SIZE: int = 12; +const TERRAIN_LAYER_ID: int = 0 +const OBSTACLE_LAYER_ID: int = 1 +const TERRAIN_SOURCE_ID: int = 1 +const OBSTACLE_SOURCE_ID: int = 2 +const CHUNK_SIZE: int = 15 +const CLEAN_UP_EVERY: int = 3 +const OBSTACLE_PROBABILITY: float = 0.01 + +var _source: TileSetAtlasSource +var _obstacle_source: TileSetAtlasSource +var _tile_probabilities: Dictionary +var _obstacle_probabilities: Dictionary +var _clean_up_counter: int + const CHUNK_DOUBLE: int = CHUNK_SIZE*2; -const GREEN_TILE = Vector2i(1, 1) +const GREEN_TILE: Vector2i = Vector2i(1, 1) var tilemap: TileMap; +@onready var Player = $Player/AnimatedSprite2D +@onready var GroundLayer: TileMapLayer = $Ground + func _get_player_position() -> Vector2i: - var playerPosition: Vector2i = $Ground.local_to_map($Player/AnimatedSprite2D.global_position) + var playerPosition: Vector2i = GroundLayer.local_to_map(Player.global_position) print("Playerposition is " + str(playerPosition)) return playerPosition # Called when the node enters the scene tree for the first time. func _ready() -> void: - _populate_terrain() + _source = $Ground.tile_set.get_source(TERRAIN_SOURCE_ID) as TileSetAtlasSource + var grid_size: Vector2i = _source.get_atlas_grid_size() + for i in range(grid_size.x): + for j in range(grid_size.y): + var atlas_coords: Vector2i = Vector2i(i, j) + var has_tile: bool = _source.has_tile(atlas_coords) + _tile_probabilities[atlas_coords] = (_source.get_tile_data(atlas_coords, 0).probability if has_tile else 0.0) # Called every frame. 'delta' is the elapsed time since the previous frame. @@ -22,7 +44,8 @@ func _process(delta: float) -> void: pass func _on_exited_chunk(): - $VisibleOnScreenNotifier2D.global_position = (get_tree().get_first_node_in_group("Player").global_position) + print("Chunk exited...") + $VisibleOnScreenNotifier2D.global_position = Player.global_position var thread: Thread = Thread.new() thread.start(func(): _populate_terrain()) @@ -37,29 +60,17 @@ func _populate_terrain(): if _is_empty(pos): _populate_cell(pos, 1, _pick_random_tile()) -#func _populate_cell(pos: Vector2i, tile: Vector2i) -> void: - #$Ground.set_cell.call_deferet(pos, 1, tile, 0) func _populate_cell(coords: Vector2i, source_id: int, atlas_coords: Vector2i) -> void: - var alternativeTilesCount: int = $Ground.tile_set.get_source(source_id).get_alternative_tiles_count(atlas_coords) + var alternativeTilesCount: int = GroundLayer.tile_set.get_source(source_id).get_alternative_tiles_count(atlas_coords) var alternativeTileId: int = 0 if alternativeTilesCount > 0: alternativeTileId = randi_range(0, alternativeTilesCount-1) # set_cell(coords: Vector2i, source_id: int = -1, atlas_coords: Vector2i = Vector2i(-1, -1), alternative_tile: int = 0) - $Ground.set_cell.call_deferred(coords, source_id, atlas_coords, alternativeTileId) + GroundLayer.set_cell.call_deferred(coords, source_id, atlas_coords, alternativeTileId) -func _populate_cell_ds(layer_id: int, coords: Vector2i, source_id: int, atlas_coords: Vector2i) -> void: - var alternative_tiles_count = ( - tilemap.tile_set.get_source(source_id).get_alternative_tiles_count(atlas_coords) - ) - var alternative_tile_id = 0 - if alternative_tiles_count > 0: - alternative_tile_id = randi_range(0, alternative_tiles_count - 1) - - tilemap.set_cell.call_deferred(layer_id, coords, source_id, atlas_coords, alternative_tile_id) - func _pick_random_tile() -> Vector2i: # Make all Tiles green @@ -67,4 +78,4 @@ func _pick_random_tile() -> Vector2i: func _is_empty(pos: Vector2i) -> bool: # Check if the cell is empty (source_id is -1) - return true if $Ground.get_cell_source_id(pos) == -1 else false; + return true if GroundLayer.get_cell_source_id(pos) == -1 else false; diff --git a/tile_map_layer.tscn b/tile_map_layer.tscn index cab5eda..2ea360c 100644 --- a/tile_map_layer.tscn +++ b/tile_map_layer.tscn @@ -1,8 +1,12 @@ -[gd_scene load_steps=6 format=3 uid="uid://bjsl1pit6rusp"] +[gd_scene load_steps=9 format=4 uid="uid://bjsl1pit6rusp"] [ext_resource type="TileSet" uid="uid://duodt2t14xjc8" path="res://Resource/UrbanKitTileMap.tres" id="1_0ugm7"] [ext_resource type="Script" uid="uid://dneqmqsd8yj4p" path="res://tile_map_layer.gd" id="1_vqaso"] +[ext_resource type="Script" uid="uid://q6cxagn6igja" path="res://player.gd" id="3_c3an2"] [ext_resource type="Texture2D" uid="uid://04ecsvg7ausn" path="res://icon.svg" id="3_uuaxm"] +[ext_resource type="Script" uid="uid://bapvlrx6dm7gu" path="res://visible_on_screen_notifier_2d.gd" id="3_vjcy3"] + +[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_vjcy3"] [sub_resource type="SpriteFrames" id="SpriteFrames_c3an2"] animations = [{ @@ -16,32 +20,53 @@ animations = [{ }] [sub_resource type="RectangleShape2D" id="RectangleShape2D_vjcy3"] +size = Vector2(32, 32) [node name="Map" type="Node"] script = ExtResource("1_vqaso") [node name="Ground" type="TileMapLayer" parent="."] +tile_map_data = PackedByteArray("AAAAAAAAAQAJAAEAAAAAAAEAAQAJAAEAAAAAAAIAAQAJAAEAAAAAAAMAAQAJAAEAAAAAAAQAAQAJAAEAAAAAAAUAAQAJAAIAAAABAAAAAQAJAAEAAAABAAEAAQAJAAEAAAABAAIAAQAJAAEAAAABAAMAAQAJAAEAAAABAAQAAQAJAAEAAAABAAUAAQAJAAIAAAACAAAAAQAJAAEAAAACAAEAAQAJAAEAAAACAAIAAQAJAAEAAAACAAMAAQAJAAEAAAACAAQAAQAJAAEAAAACAAUAAQAJAAIAAAADAAAAAQAKAAEAAAADAAEAAQAKAAEAAAADAAIAAQAKAAEAAAADAAMAAQAKAAEAAAADAAQAAQAKAAEAAAADAAUAAQAKAAIAAAAEAAAAAQABAAEAAAAEAAEAAQABAAEAAAAEAAIAAQABAAEAAAAEAAMAAQABAAEAAAAEAAQAAQABAAEAAAAEAAUAAQABAAEAAAAFAAAAAQABAAEAAAAFAAEAAQABAAEAAAAFAAIAAQABAAEAAAAFAAMAAQABAAEAAAAFAAQAAQABAAEAAAAFAAUAAQABAAEAAAAGAAAAAQABAAEAAAAGAAEAAQABAAEAAAAGAAIAAQABAAEAAAAGAAMAAQABAAEAAAAGAAQAAQABAAEAAAAGAAUAAQABAAEAAAAAAAYAAQABAAEAAAABAAYAAQABAAEAAAACAAYAAQABAAEAAAADAAYAAQABAAEAAAAEAAYAAQABAAEAAAAFAAYAAQABAAEAAAAGAAYAAQABAAEAAADv/+P/AQAAAAEAAADv/+T/AQAAAAEAAADv/+X/AQAAAAEAAADv/+b/AQAAAAEAAADv/+f/AQAAAAEAAADv/+j/AQAAAAEAAADv/+n/AQAAAAEAAADv/+r/AQAAAAEAAADv/+v/AQAAAAEAAADv/+z/AQAAAAEAAADv/+3/AQAAAAEAAADv/+7/AQAAAAEAAADv/+//AQAAAAEAAADv//D/AQAAAAEAAADv//H/AQAAAAEAAADv//L/AQAAAAEAAADv//P/AQAAAAEAAADv//T/AQAAAAEAAADv//X/AQAAAAEAAADv//b/AQAAAAEAAADv//f/AQAAAAEAAADv//j/AQAAAAEAAADv//n/AQAAAAEAAADv//r/AQAAAAEAAADv//v/AQAAAAEAAADv//z/AQAAAAEA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AAAMAOL/AQABAAAAAAANAOL/AQABAAAAAAAOAOL/AQABAAAAAAAPAOL/AQABAAAAAAAQAOL/AQACAAAAAADv/+L/AQAAAAAAAADv/x0AAQAAAAIAAAAQAB0AAQACAAIAAAD8//r/AQAIAAAAAAD8//v/AQAIAAEAAAD8//z/AQAIAAEAAAD8//3/AQAIAAEAAAD8//7/AQAIAAEAAAD8////AQAIAAEAAAD8/wAAAQAIAAEAAAD8/wEAAQAIAAEAAAD8/wIAAQAIAAEAAAD8/wMAAQAIAAEAAAD8/wQAAQAIAAEAAAD8/wUAAQAIAAIAAAD9//r/AQAJAAAAAAD9//v/AQAJAAEAAAD9//z/AQAJAAEAAAD9//3/AQAJAAEAAAD9//7/AQAJAAEAAAD9////AQAJAAEAAAD9/wAAAQAJAAEAAAD9/wEAAQAJAAEAAAD9/wIAAQAJAAEAAAD9/wMAAQAJAAEAAAD9/wQAAQAJAAEAAAD9/wUAAQAJAAIAAAD+//r/AQAJAAAAAAD+//v/AQAJAAEAAAD+//z/AQAJAAEAAAD+//3/AQAJAAEAAAD+//7/AQAJAAEAAAD+////AQAJAAEAAAD+/wAAAQAJAAEAAAD+/wEAAQAJAAEAAAD+/wIAAQAJAAEAAAD+/wMAAQAJAAEAAAD+/wQAAQAJAAEAAAD+/wUAAQAJAAIAAAD///r/AQAJAAAAAAD///v/AQAJAAEAAAD///z/AQAJAAEAAAD///3/AQAJAAEAAAD///7/AQAJAAEAAAD/////AQAJAAEAAAD//wAAAQAJAAEAAAD//wEAAQAJAAEAAAD//wIAAQAJAAEAAAD//wMAAQAJAAEAAAD//wQAAQAJAAEAAAD//wUAAQAJAAIAAAAAAPr/AQAJAAAAAAAAAPv/AQAJAAEAAAAAAPz/AQAJAAEAAAAAAP3/AQAJAAEAAAAAAP7/AQAJAAEAAAAAAP//AQAJAAEAAAABAPr/AQAJAAAAAAABAPv/AQAJAAEAAAABAPz/AQAJAAEAAAABAP3/AQAJAAEAAAABAP7/AQAJAAEAAAABAP//AQAJAAEAAAACAPr/AQAJAAAAAAACAPv/AQAJAAEAAAACAPz/AQAJAAEAAAACAP3/AQAJAAEAAAACAP7/AQAJAAEAAAACAP//AQAJAAEAAAADAPr/AQAKAAAAAAADAPv/AQAKAAEAAAADAPz/AQAKAAEAAAADAP3/AQAKAAEAAAADAP7/AQAKAAEAAAADAP//AQAKAAEAAAA=") tile_set = ExtResource("1_0ugm7") +metadata/_edit_lock_ = true [node name="Roads" type="TileMapLayer" parent="."] tile_set = ExtResource("1_0ugm7") +metadata/_edit_lock_ = true [node name="Buildings" type="TileMapLayer" parent="."] tile_set = ExtResource("1_0ugm7") +metadata/_edit_lock_ = true [node name="Details" type="TileMapLayer" parent="."] tile_set = ExtResource("1_0ugm7") +metadata/_edit_lock_ = true [node name="VisibleOnScreenNotifier2D" type="VisibleOnScreenNotifier2D" parent="."] -position = Vector2(576, 324) -rect = Rect2(0, 0, 32, 32) +rect = Rect2(0, 0, 100, 100) +script = ExtResource("3_vjcy3") +metadata/_edit_lock_ = true +metadata/_edit_group_ = true -[node name="Player" type="Area2D" parent="." groups=["Player"]] -position = Vector2(100, 100) +[node name="Sprite2D" type="Sprite2D" parent="VisibleOnScreenNotifier2D"] +position = Vector2(50, 50) +scale = Vector2(10, 10) +texture = SubResource("PlaceholderTexture2D_vjcy3") + +[node name="Player" type="Area2D" parent="." groups=["player"]] +script = ExtResource("3_c3an2") +metadata/_edit_group_ = true +metadata/_edit_lock_ = true [node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="Player"] -scale = Vector2(0.165, 0.165) +position = Vector2(4.76837e-07, -4.76837e-07) +scale = Vector2(0.25, 0.25) sprite_frames = SubResource("SpriteFrames_c3an2") [node name="CollisionShape2D" type="CollisionShape2D" parent="Player"] shape = SubResource("RectangleShape2D_vjcy3") + +[node name="Camera2D" type="Camera2D" parent="Player"] +zoom = Vector2(4, 4) + +[connection signal="screen_exited" from="VisibleOnScreenNotifier2D" to="." method="_on_exited_chunk"]