From c4770b395a8810c402c27d982e19dcc43808fbc3 Mon Sep 17 00:00:00 2001 From: Martin Felis Date: Sat, 8 Oct 2022 14:14:20 +0200 Subject: [PATCH] Refactoring --- entities/PlayerEntity.gd | 4 +- project.godot | 8 +- scenes/HexGrid3DTest.gd | 4 +- scenes/HexGrid3DTest.tscn | 22 +++-- scenes/HexTile3D.gd | 17 ++-- scenes/HexTile3D.tscn | 5 +- scenes/Island.gd | 2 +- scenes/World.gd | 164 +++++++++++++++++++++++++++++++++++++- utils/GameTile.gd | 2 +- utils/IslandGenerator.gd | 14 ++-- 10 files changed, 207 insertions(+), 35 deletions(-) diff --git a/entities/PlayerEntity.gd b/entities/PlayerEntity.gd index d74c3a8..91d7560 100644 --- a/entities/PlayerEntity.gd +++ b/entities/PlayerEntity.gd @@ -23,7 +23,7 @@ func _ready(): movable_component.pos = self.transform.origin -func _process(delta): +func _process(_delta): if is_active and color_component: var color = Color( (sin(float(OS.get_system_time_msecs()) / 1000.0) + 1.0) / 2.0, @@ -34,7 +34,7 @@ func _process(delta): pass -func _physics_process(delta): +func _physics_process(_delta): if not collision_component: return diff --git a/project.godot b/project.godot index 7256191..040ac1b 100644 --- a/project.godot +++ b/project.godot @@ -9,17 +9,17 @@ config_version=4 _global_script_classes=[ { -"base": "Reference", +"base": "Node", "class": "ClickableComponent", "language": "GDScript", "path": "res://components/ClickableComponent.gd" }, { -"base": "Reference", +"base": "KinematicBody2D", "class": "CollisionLine", "language": "GDScript", "path": "res://utils/CollisionLine.gd" }, { -"base": "Reference", +"base": "Node", "class": "ColorComponent", "language": "GDScript", "path": "res://components/ColorComponent.gd" @@ -54,7 +54,7 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://utils/SpringDamper.gd" }, { -"base": "Reference", +"base": "Sprite", "class": "TintedSpriteComponent", "language": "GDScript", "path": "res://components/TintedSpriteComponent.gd" diff --git a/scenes/HexGrid3DTest.gd b/scenes/HexGrid3DTest.gd index d487099..cc03a03 100644 --- a/scenes/HexGrid3DTest.gd +++ b/scenes/HexGrid3DTest.gd @@ -23,7 +23,7 @@ func _ready(): node.connect("island_tile_hover", self, "on_island_tile_hover") -func _process(delta): +func _process(_delta): fps_label.text = "FPS: " + str(Performance.get_monitor(Performance.TIME_FPS)) player_pos_label.text = "Pos: " + str(player.transform.origin) @@ -37,5 +37,5 @@ func on_island_tile_selected(island, tile): print ("clicked on tile " + str(target_coordinate) + " error: " + str(position_error)) -func on_island_tile_hover(island, tile): +func on_island_tile_hover(_island, tile): tile_pos_label.text = "TilePos: " + str(tile.global_transform.origin) diff --git a/scenes/HexGrid3DTest.tscn b/scenes/HexGrid3DTest.tscn index 91a1bdb..799f27d 100644 --- a/scenes/HexGrid3DTest.tscn +++ b/scenes/HexGrid3DTest.tscn @@ -3,7 +3,6 @@ [ext_resource path="res://entities/PlayerEntity.gd" type="Script" id=1] [ext_resource path="res://scenes/HexGrid3DTest.gd" type="Script" id=2] [ext_resource path="res://scenes/DebugCamera.gd" type="Script" id=3] -[ext_resource path="res://scenes/Island.tscn" type="PackedScene" id=4] [ext_resource path="res://assets/water_diffuse.png" type="Texture" id=5] [ext_resource path="res://components/MovableComponent.tscn" type="PackedScene" id=6] [ext_resource path="res://scenes/World.gd" type="Script" id=7] @@ -17,6 +16,8 @@ radial_segments = 16 radius = 0.25 height = 0.5 +[sub_resource type="HeightMapShape" id=6] + [sub_resource type="PlaneMesh" id=1] subdivide_width = 24 subdivide_depth = 24 @@ -101,8 +102,8 @@ shader = SubResource( 2 ) shader_param/amplitude = Vector2( 0.005, 0.005 ) shader_param/frequency = Vector2( 50, 48 ) shader_param/time_factor = Vector2( 7, 8 ) -shader_param/beer_factor = 4.0 -shader_param/refraction = 0.01 +shader_param/beer_factor = 2.0 +shader_param/refraction = 0.001 shader_param/uv_offset_scale = Vector2( 0.2, 0.2 ) shader_param/uv_offset_time_scale = 0.1 shader_param/uv_offset_amplitude = 1.2 @@ -180,18 +181,21 @@ max_speed = 3 [node name="World" type="Spatial" parent="."] script = ExtResource( 7 ) +generate_flag = true [node name="Scene" type="Spatial" parent="World"] [node name="Navigation" type="Spatial" parent="World"] -[node name="Island" parent="World" instance=ExtResource( 4 )] +[node name="Tiles" type="Spatial" parent="World"] -[node name="Island2" parent="World" instance=ExtResource( 4 )] -transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -12.2668, 0, 0 ) +[node name="ClckArea" type="Area" parent="World"] + +[node name="CollisionShape" type="CollisionShape" parent="World/ClckArea"] +transform = Transform( 50, 0, 0, 0, 1, 0, 0, 0, 50, 0, 0, 0 ) +shape = SubResource( 6 ) [node name="Water" type="Spatial" parent="."] -visible = false [node name="Water" type="MeshInstance" parent="Water"] transform = Transform( 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, -0.1, 0 ) @@ -210,3 +214,7 @@ transform = Transform( -10, 0, 0, 0, 10, 0, 0, 0, 10, 20, -0.1, -0.01 ) mesh = SubResource( 1 ) skeleton = NodePath("../..") material/0 = SubResource( 3 ) + +[connection signal="input_event" from="World/ClckArea" to="World" method="_on_ClckArea_input_event"] +[connection signal="mouse_entered" from="World/ClckArea" to="World" method="_on_ClckArea_mouse_entered"] +[connection signal="mouse_exited" from="World/ClckArea" to="World" method="_on_ClckArea_mouse_exited"] diff --git a/scenes/HexTile3D.gd b/scenes/HexTile3D.gd index 8020e46..6b78418 100644 --- a/scenes/HexTile3D.gd +++ b/scenes/HexTile3D.gd @@ -3,7 +3,8 @@ class_name HexTile3D onready var is_mouse_over = false onready var mesh = $Mesh -var old_material_override = Material.new() +onready var old_material_override = preload("res://materials/SandTile.tres") +onready var game_tile = preload("res://utils/GameTile.gd").new() signal tile_selected signal tile_mouse_entered @@ -13,14 +14,16 @@ signal tile_mouse_entered func set_tiletype(type): var GameTile = load("res://utils/GameTile.gd").new() - var mesh = $Mesh + game_tile.type = type - if type == GameTile.TileType.Sand: - mesh.set_surface_material(0, preload("res://materials/SandTile.tres")) + var _mesh = $Mesh + + if type == GameTile.TileType.Sand or type== GameTile.TileType.Water: + _mesh.set_surface_material(0, preload("res://materials/SandTile.tres")) elif type == GameTile.TileType.Grass: - mesh.set_surface_material(0, preload("res://materials/GrassTile.tres")) + _mesh.set_surface_material(0, preload("res://materials/GrassTile.tres")) else: - mesh.set_surface_material(0, preload("res://materials/DeepGrassTile.tres")) + _mesh.set_surface_material(0, preload("res://materials/DeepGrassTile.tres")) func _on_Area_mouse_entered(): @@ -39,7 +42,7 @@ func _on_Area_mouse_exited(): mesh.material_override = old_material_override -func _on_Area_input_event(camera, event, position, normal, shape_idx): +func _on_Area_input_event(_camera, event, position, _normal, _shape_idx): if is_mouse_over and event is InputEventMouseButton: if event.button_index == 1 and event.pressed: emit_signal("tile_selected", self) diff --git a/scenes/HexTile3D.tscn b/scenes/HexTile3D.tscn index fd3373e..987976a 100644 --- a/scenes/HexTile3D.tscn +++ b/scenes/HexTile3D.tscn @@ -6,7 +6,7 @@ [sub_resource type="CylinderMesh" id=6] top_radius = 0.5 bottom_radius = 0.5 -height = 1.0 +height = 10.0 radial_segments = 6 rings = 1 @@ -19,13 +19,14 @@ transform = Transform( -1.62921e-07, 0, 1, 0, 1, 0, -1, 0, -1.62921e-07, 0, 0, 0 script = ExtResource( 1 ) [node name="Mesh" type="MeshInstance" parent="."] -transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0 ) +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -5, 0 ) mesh = SubResource( 6 ) material/0 = ExtResource( 2 ) [node name="Area" type="Area" parent="Mesh"] [node name="CollisionShape" type="CollisionShape" parent="Mesh/Area"] +transform = Transform( 1, 0, 0, 0, 10, 0, 0, 0, 1, 0, 0, 0 ) shape = SubResource( 5 ) [connection signal="input_event" from="Mesh/Area" to="." method="_on_Area_input_event"] diff --git a/scenes/Island.gd b/scenes/Island.gd index fdf9a00..b46be95 100644 --- a/scenes/Island.gd +++ b/scenes/Island.gd @@ -51,7 +51,7 @@ func generate(): print ("Generated island with " + str(tiles.get_child_count()) + " nodes") -func do_generate(flag: bool): +func do_generate(_flag: bool): print ("Generating Level") generate() diff --git a/scenes/World.gd b/scenes/World.gd index a3eaeba..c541b87 100644 --- a/scenes/World.gd +++ b/scenes/World.gd @@ -2,17 +2,173 @@ extends Spatial var GameTile = load("res://utils/GameTile.gd") var HexCell = preload("res://addons/gdhexgrid/HexCell.gd") +onready var HexGrid = preload("res://addons/gdhexgrid/HexGrid.gd").new() +var IslandGenerator = preload("res://utils/IslandGenerator.gd").new() +onready var tiles = $Tiles var has_tiles_initialized = false -export var size = [200, 200] +var tile_map = {} +var active_tile = null +var island_count = 5 + +export var size = [50, 50] +export var generate_flag: bool = false setget do_generate func _ready(): + assert(get_node("Tiles") != null) + generate() pass -func create_ocean_tiles(): +func _process(_delta): + pass + + +func add_tile_for_hex(game_tile): + var hexgrid = preload("res://addons/gdhexgrid/HexGrid.gd").new() + var HexTile3D = preload("res://scenes/HexTile3D.tscn") - var islands - pass + var tile = HexTile3D.instance() + var pos = hexgrid.get_hex_center_from_offset(game_tile.offset_coords) + var height = -2.0 # if game_tile.type == GameTile.TileType.Sand else 0.1 + rand_range(0.0, 0.05) + + tiles.add_child(tile) + tile_map[game_tile.offset_coords] = tile + + tile.set_tiletype(game_tile.type) + tile.transform.origin = Vector3(pos.x, height, pos.y) + tile.game_tile = game_tile + + return tile +func reset(): + var tiles = get_node("Tiles") + print ("clearing old tiles: " + str(tiles.get_child_count())) + for tile in tiles.get_children(): + tiles.remove_child(tile) + tile.queue_free() + tile_map = {} + + +func generate(): + reset() + generate_base_tiles() + + for i in range (island_count): + generate_island(Vector2( + rand_range(-size[0] / 2, size[0] / 2), + rand_range(-size[1] / 2, size[1] / 2) + )) + + mark_sand_tiles() + smooth_water_tiles() + smooth_water_tiles() + smooth_water_tiles() + smooth_water_tiles() + + +func generate_base_tiles(): + print ("generating world") + + for i in range (-size[0] / 2, size[0] / 2): + for j in range (-size[1] / 2, size[1] / 2): + var tile = GameTile.new() + tile.type = GameTile.TileType.Water + tile.offset_coords = Vector2(i,j) + + add_tile_for_hex(tile) + + +func generate_island(start_pos: Vector2): + var generated_tiles = IslandGenerator.random_walk(20, start_pos) + generated_tiles = IslandGenerator.extrude_tiles(generated_tiles) +# generated_tiles = IslandGenerator.mark_sand_tiles(generated_tiles) + + for island_tile in generated_tiles.values(): + if not island_tile.offset_coords in tile_map.keys(): + continue + var world_tile = tile_map[island_tile.offset_coords] + world_tile.transform.origin[1] = 0 + world_tile.set_tiletype(island_tile.type) + + print ("Generated island with " + str(tiles.get_child_count()) + " nodes") + + + +func mark_sand_tiles(): + for tile in tile_map.values(): + if tile.game_tile.type == GameTile.TileType.Water: + continue + + tile.set_tiletype(GameTile.TileType.Grass if randi() % 2 else GameTile.TileType.DeepGrass) + var tile_neighbours = tile.game_tile.get_all_adjacent() + + for neighbour in tile_neighbours: + var tile_on_map = neighbour.offset_coords in tile_map.keys() + if not tile_on_map: + continue + + var neighbour_tile = tile_map[neighbour.offset_coords] + if neighbour_tile.game_tile.type == GameTile.TileType.Water: + tile.set_tiletype(GameTile.TileType.Sand) + + +func smooth_water_tiles(): + # horizontal smoothing + for i in range ((-size[0] / 2) + 1, (size[0] / 2) - 1): + for j in range ((-size[1] / 2) + 1, (size[1] / 2) - 1): + var prev = tile_map[Vector2(i - 1,j)] + var current = tile_map[Vector2(i,j)] + var next = tile_map[Vector2(i + 1,j)] + + if current.game_tile.type != GameTile.TileType.Water: + continue + + current.transform.origin[1] = (prev.transform.origin[1] + next.transform.origin[1]) * 0.5 + + # vertical smoothings + for i in range ((-size[0] / 2) + 1, (size[0] / 2) - 1): + for j in range ((-size[1] / 2) + 1, (size[1] / 2) - 1): + var prev = tile_map[Vector2(i,j - 1)] + var current = tile_map[Vector2(i,j)] + var next = tile_map[Vector2(i,j + 1)] + + if current.game_tile.type != GameTile.TileType.Water: + continue + + current.transform.origin[1] = (prev.transform.origin[1] + next.transform.origin[1]) * 0.5 + + +func do_generate(flag: bool): + print ("Generating Level") + generate_flag = false + # generate() + + +func _on_ClckArea_input_event(_camera, _event, position, _normal, _shape_idx): + var offset_coords = HexGrid.get_hex_at(position).offset_coords + + var world_tile = null + if offset_coords in tile_map.keys(): + world_tile = tile_map[offset_coords] + + if active_tile != null and world_tile != active_tile: + active_tile._on_Area_mouse_exited() + + if active_tile == world_tile: + return + + if world_tile == null: + return + + active_tile = world_tile + active_tile._on_Area_mouse_entered() + + +func _on_ClckArea_mouse_entered(): + pass # Replace with function body. + + +func _on_ClckArea_mouse_exited(): + pass # Replace with function body. diff --git a/utils/GameTile.gd b/utils/GameTile.gd index e4efe57..cd304ea 100644 --- a/utils/GameTile.gd +++ b/utils/GameTile.gd @@ -1,7 +1,7 @@ extends "res://addons/gdhexgrid/HexCell.gd" class_name GameTile -enum TileType { Sand, Grass, DeepGrass, Rock, Water } +enum TileType { Water, Sand, Grass, DeepGrass, Rock } var type = TileType.Sand diff --git a/utils/IslandGenerator.gd b/utils/IslandGenerator.gd index 2e8a84e..129b4cc 100644 --- a/utils/IslandGenerator.gd +++ b/utils/IslandGenerator.gd @@ -3,6 +3,11 @@ extends Node var GameTile = load("res://utils/GameTile.gd") var HexCell = preload("res://addons/gdhexgrid/HexCell.gd") +var rng = RandomNumberGenerator.new() + + +func _ready(): + rng.randomize() func hex_cell_to_island_tile (hex: HexCell) -> GameTile: @@ -11,12 +16,11 @@ func hex_cell_to_island_tile (hex: HexCell) -> GameTile: return tile -func random_walk(walk_size): +func random_walk(walk_size, start_offset = Vector2(0,0)): var hexgrid = preload("res://addons/gdhexgrid/HexGrid.gd").new() var tiles = {} - var current_offset_coordinate = Vector2(0, 0) - var current_tile = hex_cell_to_island_tile(hexgrid.get_hex_from_offset(Vector2(0,0))) + var current_tile = hex_cell_to_island_tile(hexgrid.get_hex_from_offset(start_offset)) tiles[current_tile.offset_coords] = current_tile for i in range(walk_size - 1): @@ -24,7 +28,7 @@ func random_walk(walk_size): var tile_exists = true while tile_exists and len(neighbours) > 0: - var test_index = randi() % len(neighbours) + var test_index = rng.randi() % len(neighbours) var test_tile = hex_cell_to_island_tile(neighbours[test_index]) if test_tile.offset_coords in tiles.keys(): neighbours.remove(test_index) @@ -61,7 +65,7 @@ func extrude_tiles(tiles): func mark_sand_tiles(tiles): for tile in tiles.values(): - tile.type = GameTile.TileType.Grass if randi() % 2 else GameTile.TileType.DeepGrass + tile.type = GameTile.TileType.Grass if rng.randi() % 2 else GameTile.TileType.DeepGrass var tile_neighbours = tile.get_all_adjacent() for neighbour in tile_neighbours: