Godot Version
4.4.1,
Question
`The problem is, is that when spawning in and when stopping moving the character is looking up. What I want to do is when the character stops moving it keeps it’s direction but it switch to that direction’s idle animation. I’m using click to move AStarGrid movement. On the side my script doesn’t have variable character speed which I’d like to implement. Thanks
extends Node2D
@onready var tile_map: TileMapLayer = $"../TileMap"
@onready var sprite_2d: Sprite2D = $Sprite2D
@onready var animation_player: AnimationPlayer = $AnimationPlayer
var astar_grid: AStarGrid2D
var current_id_path: Array[Vector2i]
var current_point_path: PackedVector2Array
var target_position: Vector2
var is_moving: bool
enum FacingDirection {
LEFT, RIGHT, DOWN, UP
}
func _ready():
astar_grid = AStarGrid2D.new()
astar_grid.region = tile_map.get_used_rect()
astar_grid.cell_size = Vector2(32, 32)
astar_grid.diagonal_mode = AStarGrid2D.DIAGONAL_MODE_NEVER
astar_grid.update()
for x in tile_map.get_used_rect().size.x:
for y in tile_map.get_used_rect().size.y:
var tile_position = Vector2i(
x+tile_map.get_used_rect().position.x,
y+tile_map.get_used_rect().position.y
)
var tile_data = tile_map.get_cell_tile_data(tile_position)
if tile_position == null or tile_data.get_custom_data("Walkable") == false:
astar_grid.set_point_solid(tile_position)
func _input(event):
if event.is_action_pressed("move") == false:
return
var id_path
if is_moving:
id_path = astar_grid.get_id_path(
tile_map.local_to_map(target_position),
tile_map.local_to_map(get_global_mouse_position())
)
else:
id_path = astar_grid.get_id_path(
tile_map.local_to_map(global_position),
tile_map.local_to_map(get_global_mouse_position())
)
if id_path.is_empty() == false:
current_id_path = id_path
current_point_path = astar_grid.get_point_path(
tile_map.local_to_map(target_position),
tile_map.local_to_map(get_global_mouse_position())
)
for i in current_id_path.size():
current_point_path[i] = current_point_path[i] + Vector2(16, 16)
func _physics_process(_delta):
if current_id_path.is_empty():
return
if is_moving == false:
target_position = tile_map.map_to_local(current_id_path.front())
is_moving = true
global_position = global_position.move_toward(target_position, 1)
if global_position == target_position:
current_id_path.pop_front()
if current_id_path.is_empty() == false:
target_position = tile_map.map_to_local(current_id_path.front())
else:
is_moving = false
var walking_direction = target_position - global_position
var facing_direction
if (abs(walking_direction.x) > abs(walking_direction.y)):
if walking_direction.x > 0: #walking x axis
facing_direction = FacingDirection.RIGHT
animation_player.play("walking_right")
else:
facing_direction = FacingDirection.LEFT
animation_player.play("walking_left")
else: #walking y axis
if walking_direction.y > 0:
facing_direction = FacingDirection.DOWN
animation_player.play("walking_down")
else:
facing_direction = FacingDirection.UP
animation_player.play("walking_up")
func _on_pressed():
pass
`