From fccef572109d55d441283f6ae3b2bbcadfc5100e Mon Sep 17 00:00:00 2001 From: Antti Hakkarainen Date: Sun, 12 Feb 2023 19:12:27 +0200 Subject: [PATCH] chunk class was missing set_tileset() ... --- project.godot | 4 ++-- scenes/Chunk.gd | 16 ++++++++-------- scenes/Chunk.tscn | 1 + scenes/Main.tscn | 11 +---------- scripts/ChunkHandler.gd | 37 +++++++++++++++++++------------------ scripts/Globals.gd | 4 +++- scripts/Main.gd | 16 +++++----------- 7 files changed, 39 insertions(+), 50 deletions(-) diff --git a/project.godot b/project.godot index d65016d..c73b0b8 100644 --- a/project.godot +++ b/project.godot @@ -25,8 +25,8 @@ gdscript/warnings/integer_division=0 [display] -window/size/viewport_width=1920 -window/size/viewport_height=1080 +window/size/viewport_width=2560 +window/size/viewport_height=1440 window/size/resizable=false [input] diff --git a/scenes/Chunk.gd b/scenes/Chunk.gd index 14d8c08..33b6ef7 100644 --- a/scenes/Chunk.gd +++ b/scenes/Chunk.gd @@ -7,18 +7,18 @@ var y:int = -1 # Called when the node enters the scene tree for the first time. func _init(xpos:int, ypos:int): self.x = xpos - self.y = ypos - -func _draw(): - draw_circle(Vector2(x,y), 25.0, Color(0,0,0)) + self.y = ypos + self.name = "Chunk [%d,%d]" % [x, y] + self.set_tileset(Globals.TILESET_TERRAIN) + self.position = Vector2i( + x*Globals.CHUNK_SIZE*Globals.TILE_SIZE_X, + y*Globals.CHUNK_SIZE*Globals.TILE_SIZE_Y + ) func generate_chunk() -> void: for row in Globals.CHUNK_SIZE: for col in Globals.CHUNK_SIZE: - var tile_data: Array = Globals.map_tile_data[row+y*Globals.CHUNK_SIZE][col+x*Globals.CHUNK_SIZE] - #var msg = "%s %s %s" - #print(msg % [tile_data, row, col]) - + var tile_data: Array = Globals.map_tile_data[row+y*Globals.CHUNK_SIZE][col+x*Globals.CHUNK_SIZE] # layer | tile coords at tilemap | tilemap id | coords of the tile at tileset | alternative tile self.set_cell( Globals.LAYER_TERRAIN, diff --git a/scenes/Chunk.tscn b/scenes/Chunk.tscn index 040f771..40efe6c 100644 --- a/scenes/Chunk.tscn +++ b/scenes/Chunk.tscn @@ -6,4 +6,5 @@ [node name="Chunk" type="TileMap"] tile_set = ExtResource("1_x70ay") format = 2 +layer_0/tile_data = PackedInt32Array(0, 0, 65536, -1, 0, 65536) script = ExtResource("1_lawsj") diff --git a/scenes/Main.tscn b/scenes/Main.tscn index ed31510..6bd6210 100644 --- a/scenes/Main.tscn +++ b/scenes/Main.tscn @@ -1,22 +1,13 @@ -[gd_scene load_steps=7 format=3 uid="uid://nfayf78xiuap"] +[gd_scene load_steps=5 format=3 uid="uid://nfayf78xiuap"] [ext_resource type="Script" path="res://scripts/Main.gd" id="1_ysxum"] -[ext_resource type="Script" path="res://scripts/ChunkHandler.gd" id="2_2e0t1"] [ext_resource type="Script" path="res://scripts/Control.gd" id="3_1t1c8"] -[ext_resource type="Texture2D" uid="uid://cxn2fno1j7vf5" path="res://icon.svg" id="3_c64oi"] [ext_resource type="PackedScene" uid="uid://2we3txfr812u" path="res://scenes/Camera_zoom_2d.tscn" id="4_rx82t"] [ext_resource type="Script" path="res://scripts/EntityPlacer.gd" id="5_8jju5"] [node name="Main" type="Node2D"] script = ExtResource("1_ysxum") -[node name="ChunkHandler" type="Node2D" parent="."] -script = ExtResource("2_2e0t1") - -[node name="Sprite2D" type="Sprite2D" parent="ChunkHandler"] -position = Vector2(952, 536) -texture = ExtResource("3_c64oi") - [node name="EntityPlacer" type="Control" parent="."] layout_mode = 3 anchors_preset = 0 diff --git a/scripts/ChunkHandler.gd b/scripts/ChunkHandler.gd index 58fe173..fdcd0a6 100644 --- a/scripts/ChunkHandler.gd +++ b/scripts/ChunkHandler.gd @@ -9,35 +9,36 @@ extends Node2D # This is done to speed up game loading and avoiding setting one large tilemap in one go # which is extremely slow in godot 4.0, 4096x4096 takes minutes to fill with set_cell() commands +var map_tiles:Array[Array] = [[]] var chunks:Dictionary = {} var unused_chunks:Dictionary = {} +func _init() -> void: + self.name = "ChunkHandler" + func _ready(): #thread = Thread.new() pass -#var map_tiles:Array[Array] = [[]] -# -#func start_handler() -> void: -# # Initialize the map tile array with enough chunks to cover the whole map -# map_tiles.resize(Globals.map_size/Globals.CHUNK_SIZE) -# for y in map_tiles.size(): -# map_tiles[y].resize(Globals.map_size/Globals.CHUNK_SIZE) -# for x in map_tiles.size(): -# map_tiles[y][x] = chunk.instantiate() + + +func start_handler() -> void: + # Initialize the map tile array with enough chunks to cover the whole map + map_tiles.resize(Globals.map_size/Globals.CHUNK_SIZE) + for y in map_tiles.size(): + map_tiles[y].resize(Globals.map_size/Globals.CHUNK_SIZE) -func add_chunk(x:int, y:int): +func add_chunk(x:int, y:int): var chunk = Chunk.new(x,y) + + var start = Time.get_ticks_usec() + chunk.generate_chunk() self.add_child(chunk) - - chunk.generate_chunk() - chunk.set_position(Vector2(x*Globals.CHUNK_SIZE,y*Globals.CHUNK_SIZE)) - chunk.set_visible(true) + var end = Time.get_ticks_usec() + print("generate a chunk ", (end-start)/1000.0, "ms") - - print("nodes in children: ", self.get_children()[0].get_used_cells(Globals.LAYER_TERRAIN).size()) - print("chunk visible in tree? : ", self.get_children()[0].is_visible_in_tree()) - print("handler visible? ", self.is_visible_in_tree()) + #chunk.set_position(Vector2(x*Globals.CHUNK_SIZE,y*Globals.CHUNK_SIZE)) + #map_tiles[chunk_pos.y][chunk_pos.x].clear() diff --git a/scripts/Globals.gd b/scripts/Globals.gd index 6dc1938..2741e75 100644 --- a/scripts/Globals.gd +++ b/scripts/Globals.gd @@ -4,7 +4,7 @@ extends Node # world map chunk size -const CHUNK_SIZE:int = 128 +const CHUNK_SIZE:int = 16 # tilemap tile types enum {TILE_WATER, TILE_TERRAIN, TILE_FOREST, TILE_BOG} @@ -12,6 +12,8 @@ enum {TILE_WATER, TILE_TERRAIN, TILE_FOREST, TILE_BOG} # tilemap layers enum {LAYER_TERRAIN, LAYER_BUILDINGS} +const TILESET_TERRAIN:TileSet = preload("res://scenes/Chunk.tres") + func are_coords_valid(value:int, bounds:Vector2i, errmsg:String) -> bool: if bounds.x > value or value > bounds.y: errmsg = errmsg % [value, bounds.x, bounds.y] diff --git a/scripts/Main.gd b/scripts/Main.gd index 49e453c..25d8a4b 100644 --- a/scripts/Main.gd +++ b/scripts/Main.gd @@ -40,13 +40,11 @@ func _ready(): var result = _world_generator.generate_world(map_filename) if result: - #_chunk_handler.start_handler() - _chunk_handler.set_visible(true) - _chunk_handler.add_chunk(0, 0) - #_chunk_handler.show() - #_chunk_handler.set_visible(true) - print("main visible? ", is_visible_in_tree()) - + _chunk_handler.start_handler() + for y in Globals.map_size/Globals.CHUNK_SIZE: + for x in Globals.map_size/Globals.CHUNK_SIZE: + if (y + x) % 2 == 0: + _chunk_handler.add_chunk(x, y) else: push_error("World generation failed :-(") @@ -56,10 +54,6 @@ func _ready(): Vector2(Globals.map_size / 2.0 * Globals.TILE_SIZE_X, Globals.map_size / 2.0 * Globals.TILE_SIZE_Y) ) - -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(_delta): - pass func quit_game(): get_tree().get_root().propagate_notification(NOTIFICATION_WM_CLOSE_REQUEST)