player can now be clicked
This commit is contained in:
parent
ec82ede20a
commit
2c26275966
Binary file not shown.
@ -51,6 +51,7 @@ 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():
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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
|
||||
|
||||
# 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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user