player can now be clicked

This commit is contained in:
Jonas 2025-03-30 21:59:38 +02:00
parent ec82ede20a
commit 2c26275966
4 changed files with 102 additions and 14 deletions

View File

@ -51,7 +51,8 @@ func _input(event: InputEvent) -> void:
# Set a player reference
func set_player(player):
player_controller = IsometricPlayerController.new(player, map_data, map_renderer)
player.set_map_renderer(map_renderer)
# Initialize player position
func init_player():
return player_controller.init_player()

View File

@ -8,6 +8,35 @@ var highlighted_tiles = {} # Dictionary to store all currently highlighted tile
var TILE_SIZE_ISOMETRIC_X = 32 # in px
var TILE_SIZE_ISOMETRIC_Y = 16 # in px
var unit_is_hovered = false
var darkening_active = false
var original_modulates = {}
func darken_all_except_player(player_node):
darkening_active = true
# Store original modulate values
for layer in isometric_map_layers:
original_modulates[layer] = layer.modulate
# Darken the layer
layer.modulate = Color(0.5, 0.5, 0.5, 1.0)
# Keep player at normal brightness
player_node.modulate = Color(1.0, 1.0, 1.0, 1.0)
func reset_darkening():
darkening_active = false
# Restore original modulate values
for layer in isometric_map_layers:
if layer in original_modulates:
layer.modulate = original_modulates[layer]
func set_unit_hover_state(is_hovered):
unit_is_hovered = is_hovered
# Initialize with reference to a map data object and a tilemap to use as template
func _init(map_data_ref, tilemap_template):
map_data = map_data_ref
@ -57,6 +86,25 @@ func handle_hover(mouse_position):
var hover_tile_position = isometric_map_layers[0].local_to_map(mouse_position)
var new_highlighted_tiles = {} # Will store tiles to highlight this frame
if unit_is_hovered:
# De-highlight all tiles
for tile_key in highlighted_tiles:
var tile_data = highlighted_tiles[tile_key]
var tile = map_data.get_tile(tile_data.x, tile_data.y, tile_data.z)
if tile != null and tile["visibility"] and not tile["unit"]:
if not tile["selected"]:
if tile["atlas_base_position"] != null:
isometric_map_layers[tile_data.z].set_cell(
Vector2i(tile["x"], tile["y"]),
IsometricMapSystem.MAIN_SOURCE_ID,
tile["atlas_base_position"]
)
tile["highlighted"] = false
highlighted_tiles = {}
return
# First find all tiles that should be highlighted
for z in map_data.GRID_SIZE_HEIGHT:
for x in map_data.GRID_SIZE_WIDTH:

View File

@ -4,9 +4,16 @@ extends CharacterBody2D
@onready var animated_sprite: AnimatedSprite2D = $AnimatedSprite2D
@onready var player: CharacterBody2D = $"."
var hovered_unit = null
var hovered = null
var selected = null
var hover_indicator = preload("res://assets/sprites/ui/ui_icons_green_down4.png")
var selected_indicator = preload("res://assets/sprites/ui/ui_icons_blue_down4.png")
var map_renderer = null
func set_map_renderer(renderer):
map_renderer = renderer
func _ready():
@ -18,12 +25,30 @@ func _ready():
hover_sprite.z_index = 100
player.add_child(hover_sprite)
func toggle_selection():
selected = !selected
if selected:
get_node("HoverIndicator").texture = selected_indicator
# Tell the map renderer to darken everything
if map_renderer:
map_renderer.darken_all_except_player(self)
else:
get_node("HoverIndicator").texture = hover_indicator
# Reset darkening
if map_renderer:
map_renderer.reset_darkening()
# Keep indicator visible when selected
get_node("HoverIndicator").visible = selected or hovered == player
var player_data = {
"stats": {
"health": 100,
"mana": 100,
"speed": 3,
"attack": 10,
"defense": 5
"defense": 5,
"actionpoints": 5,
},
"inventory": [],
"name": "Hero"
@ -32,13 +57,20 @@ func _input(event):
if event is InputEventMouseMotion:
check_hover()
func _unhandled_input(event):
if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT and event.pressed:
# If we're being hovered and clicked
if hovered == player:
toggle_selection()
func check_hover():
var mouse_pos = get_global_mouse_position()
print("Mouse pos: ", mouse_pos, " Player pos: ", player.position)
var was_hovered = hovered != null
# print("Mouse pos: ", mouse_pos, " Player pos: ", player.position)
if hovered_unit:
hovered_unit.get_node("HoverIndicator").visible = false
hovered_unit = null
if hovered:
hovered.get_node("HoverIndicator").visible = false
hovered = null
if player.has_node("CollisionShape2D"):
var collision = player.get_node("CollisionShape2D")
@ -50,21 +82,28 @@ func check_hover():
var extents = shape.extents
if local_pos.x >= -extents.x and local_pos.x <= extents.x and \
local_pos.y >= -extents.y and local_pos.y <= extents.y:
hovered_unit = player
hovered = player
player.get_node("HoverIndicator").visible = true
if (was_hovered != (hovered != null)) and map_renderer:
map_renderer.set_unit_hover_state(hovered != null)
func set_unit_position(x, y, z):
var z_layer = z
#var x_position = x
var x_position = x + 16
var y_position = y
#var y_position = y + get_sprite_size().size.y/2
var y_position = y
# Update the main node position
global_position = Vector2(x_position, y_position)
# Update the visual z-index directly
animated_sprite.z_index = z_layer
animated_sprite.position = Vector2i(x_position, y_position)
print("Palyer Global Pos: ", animated_sprite.position)
print("Palyer Z-Layer: ", z_layer)
# Keep sprite centered at node position
animated_sprite.position = Vector2.ZERO
print("Player Z-Layer: ", z_layer)
print("Player position updated to: ", global_position)
func get_sprite_size():
return collision_shape_2d.shape