player can now be clicked
This commit is contained in:
parent
ec82ede20a
commit
2c26275966
Binary file not shown.
@ -51,7 +51,8 @@ func _input(event: InputEvent) -> void:
|
|||||||
# Set a player reference
|
# Set a player reference
|
||||||
func set_player(player):
|
func set_player(player):
|
||||||
player_controller = IsometricPlayerController.new(player, map_data, map_renderer)
|
player_controller = IsometricPlayerController.new(player, map_data, map_renderer)
|
||||||
|
player.set_map_renderer(map_renderer)
|
||||||
|
|
||||||
# Initialize player position
|
# Initialize player position
|
||||||
func init_player():
|
func init_player():
|
||||||
return player_controller.init_player()
|
return player_controller.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_X = 32 # in px
|
||||||
var TILE_SIZE_ISOMETRIC_Y = 16 # 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
|
# Initialize with reference to a map data object and a tilemap to use as template
|
||||||
func _init(map_data_ref, tilemap_template):
|
func _init(map_data_ref, tilemap_template):
|
||||||
map_data = map_data_ref
|
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 hover_tile_position = isometric_map_layers[0].local_to_map(mouse_position)
|
||||||
var new_highlighted_tiles = {} # Will store tiles to highlight this frame
|
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
|
# First find all tiles that should be highlighted
|
||||||
for z in map_data.GRID_SIZE_HEIGHT:
|
for z in map_data.GRID_SIZE_HEIGHT:
|
||||||
for x in map_data.GRID_SIZE_WIDTH:
|
for x in map_data.GRID_SIZE_WIDTH:
|
||||||
|
|||||||
@ -4,9 +4,16 @@ extends CharacterBody2D
|
|||||||
@onready var animated_sprite: AnimatedSprite2D = $AnimatedSprite2D
|
@onready var animated_sprite: AnimatedSprite2D = $AnimatedSprite2D
|
||||||
@onready var player: CharacterBody2D = $"."
|
@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 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():
|
func _ready():
|
||||||
|
|
||||||
@ -18,12 +25,30 @@ func _ready():
|
|||||||
hover_sprite.z_index = 100
|
hover_sprite.z_index = 100
|
||||||
player.add_child(hover_sprite)
|
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 = {
|
var player_data = {
|
||||||
"stats": {
|
"stats": {
|
||||||
"health": 100,
|
"health": 100,
|
||||||
|
"mana": 100,
|
||||||
"speed": 3,
|
"speed": 3,
|
||||||
"attack": 10,
|
"attack": 10,
|
||||||
"defense": 5
|
"defense": 5,
|
||||||
|
"actionpoints": 5,
|
||||||
},
|
},
|
||||||
"inventory": [],
|
"inventory": [],
|
||||||
"name": "Hero"
|
"name": "Hero"
|
||||||
@ -32,13 +57,20 @@ func _input(event):
|
|||||||
if event is InputEventMouseMotion:
|
if event is InputEventMouseMotion:
|
||||||
check_hover()
|
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():
|
func check_hover():
|
||||||
var mouse_pos = get_global_mouse_position()
|
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:
|
if hovered:
|
||||||
hovered_unit.get_node("HoverIndicator").visible = false
|
hovered.get_node("HoverIndicator").visible = false
|
||||||
hovered_unit = null
|
hovered = null
|
||||||
|
|
||||||
if player.has_node("CollisionShape2D"):
|
if player.has_node("CollisionShape2D"):
|
||||||
var collision = player.get_node("CollisionShape2D")
|
var collision = player.get_node("CollisionShape2D")
|
||||||
@ -50,21 +82,28 @@ func check_hover():
|
|||||||
var extents = shape.extents
|
var extents = shape.extents
|
||||||
if local_pos.x >= -extents.x and local_pos.x <= extents.x and \
|
if local_pos.x >= -extents.x and local_pos.x <= extents.x and \
|
||||||
local_pos.y >= -extents.y and local_pos.y <= extents.y:
|
local_pos.y >= -extents.y and local_pos.y <= extents.y:
|
||||||
hovered_unit = player
|
hovered = player
|
||||||
player.get_node("HoverIndicator").visible = true
|
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):
|
func set_unit_position(x, y, z):
|
||||||
var z_layer = z
|
var z_layer = z
|
||||||
#var x_position = x
|
|
||||||
var x_position = x + 16
|
var x_position = x + 16
|
||||||
var y_position = y
|
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
|
# Update the visual z-index directly
|
||||||
animated_sprite.z_index = z_layer
|
animated_sprite.z_index = z_layer
|
||||||
animated_sprite.position = Vector2i(x_position, y_position)
|
# Keep sprite centered at node position
|
||||||
print("Palyer Global Pos: ", animated_sprite.position)
|
animated_sprite.position = Vector2.ZERO
|
||||||
print("Palyer Z-Layer: ", z_layer)
|
|
||||||
|
print("Player Z-Layer: ", z_layer)
|
||||||
|
print("Player position updated to: ", global_position)
|
||||||
|
|
||||||
func get_sprite_size():
|
func get_sprite_size():
|
||||||
return collision_shape_2d.shape
|
return collision_shape_2d.shape
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user