From fd2ef11b05d5681324297ca7acc406d8eb489d88 Mon Sep 17 00:00:00 2001 From: Martin Felis Date: Sun, 9 Oct 2022 19:36:08 +0200 Subject: [PATCH] Improved highlighting on water --- scenes/HexGrid3DTest.tscn | 50 ++++++++++++++++++++++----------------- scenes/World.gd | 38 ++++++++++++++++------------- 2 files changed, 49 insertions(+), 39 deletions(-) diff --git a/scenes/HexGrid3DTest.tscn b/scenes/HexGrid3DTest.tscn index 799f27d..6a38dcc 100644 --- a/scenes/HexGrid3DTest.tscn +++ b/scenes/HexGrid3DTest.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=13 format=2] +[gd_scene load_steps=15 format=2] [ext_resource path="res://entities/PlayerEntity.gd" type="Script" id=1] [ext_resource path="res://scenes/HexGrid3DTest.gd" type="Script" id=2] @@ -16,7 +16,18 @@ radial_segments = 16 radius = 0.25 height = 0.5 -[sub_resource type="HeightMapShape" id=6] +[sub_resource type="CylinderMesh" id=7] +top_radius = 0.5 +bottom_radius = 0.5 +height = 0.1 +radial_segments = 6 +rings = 1 + +[sub_resource type="SpatialMaterial" id=8] +render_priority = 1 +flags_transparent = true +albedo_color = Color( 1, 1, 1, 0.407843 ) +roughness = 0.0 [sub_resource type="PlaneMesh" id=1] subdivide_width = 24 @@ -110,6 +121,8 @@ shader_param/uv_offset_amplitude = 1.2 shader_param/texture_scale = Vector2( 8, 8 ) shader_param/texturemap = ExtResource( 5 ) +[sub_resource type="HeightMapShape" id=6] + [node name="HexGrid3DTest" type="Spatial"] script = ExtResource( 2 ) @@ -189,32 +202,25 @@ generate_flag = true [node name="Tiles" type="Spatial" parent="World"] +[node name="Highlight" type="MeshInstance" parent="World"] +transform = Transform( -1.62921e-07, 0, 1, 0, 1, 0, -1, 0, -1.62921e-07, 0, 0.2, 0 ) +cast_shadow = 0 +mesh = SubResource( 7 ) +material/0 = SubResource( 8 ) + +[node name="Water" type="MeshInstance" parent="World"] +transform = Transform( 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, -0.1, 0 ) +cast_shadow = 0 +mesh = SubResource( 1 ) +skeleton = NodePath("../..") +material/0 = SubResource( 3 ) + [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="."] - -[node name="Water" type="MeshInstance" parent="Water"] -transform = Transform( 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, -0.1, 0 ) -mesh = SubResource( 1 ) -skeleton = NodePath("../..") -material/0 = SubResource( 3 ) - -[node name="Water2" type="MeshInstance" parent="Water"] -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 ) - -[node name="Water3" type="MeshInstance" parent="Water"] -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/World.gd b/scenes/World.gd index c541b87..c80eb57 100644 --- a/scenes/World.gd +++ b/scenes/World.gd @@ -4,6 +4,7 @@ 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 highlight = $Highlight onready var tiles = $Tiles var has_tiles_initialized = false @@ -11,7 +12,7 @@ var tile_map = {} var active_tile = null var island_count = 5 -export var size = [50, 50] +export var size = Vector2(20, 20) export var generate_flag: bool = false setget do_generate func _ready(): @@ -57,8 +58,8 @@ func generate(): 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) + rand_range(-size.x / 2, size.x / 2), + rand_range(-size.y / 2, size.y / 2) )) mark_sand_tiles() @@ -71,8 +72,8 @@ func generate(): 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): + for i in range (-size.x / 2, size.x / 2): + for j in range (-size.y / 2, size.y / 2): var tile = GameTile.new() tile.type = GameTile.TileType.Water tile.offset_coords = Vector2(i,j) @@ -116,8 +117,8 @@ func mark_sand_tiles(): 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): + for i in range ((-size.x / 2) + 1, (size.x / 2) - 1): + for j in range ((-size.y / 2) + 1, (size.y / 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)] @@ -125,19 +126,19 @@ func smooth_water_tiles(): if current.game_tile.type != GameTile.TileType.Water: continue - current.transform.origin[1] = (prev.transform.origin[1] + next.transform.origin[1]) * 0.5 + current.transform.origin[1] = min(-0.2, (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): + for i in range ((-size.x / 2) + 1, (size.x / 2) - 1): + for j in range ((-size.y / 2) + 1, (size.y / 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 + + current.transform.origin[1] = min(-0.2, (prev.transform.origin[1] + next.transform.origin[1]) * 0.5) func do_generate(flag: bool): @@ -147,14 +148,17 @@ func do_generate(flag: bool): func _on_ClckArea_input_event(_camera, _event, position, _normal, _shape_idx): - var offset_coords = HexGrid.get_hex_at(position).offset_coords + var hex_at_position = HexGrid.get_hex_at(position) + var offset_coords = hex_at_position.offset_coords + var hex_center = HexGrid.get_hex_center_from_offset(offset_coords) + highlight.transform.origin = Vector3 (hex_center.x, 0.0, hex_center.y) 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() + pass if active_tile == world_tile: return @@ -163,12 +167,12 @@ func _on_ClckArea_input_event(_camera, _event, position, _normal, _shape_idx): return active_tile = world_tile - active_tile._on_Area_mouse_entered() func _on_ClckArea_mouse_entered(): - pass # Replace with function body. + highlight.visible = true func _on_ClckArea_mouse_exited(): - pass # Replace with function body. + highlight.visible = false +