(eu fiz um post parecido com esse, só que decidi mudar para o godot para poder tornar os jogos mais fáceis do que no flash, já que ele está desatualizado)
Eu criei um personagem que o jogador pode controlar e ele se move por meio de tiles e tilemap, eu quero fazer com que o jogador possa se mover para sempre quando uma tecla de seta for pressionada (e se mover na direção da tecla de seta) até que ele entre em um tile caminhável que esteja tocando em um tile não caminhável
você pode me dar alguma dica de como fazer isso, aqui está o código:
extends Sprite2D
class_name PacMan
@export var move_speed: float = 1
@onready var tile_map: TileMap = $"../TileMap"
@onready var sprite_2d: Sprite2D = $Sprite2D
@onready var animation_player: AnimationPlayer = $Sprite2D/AnimationPlayer
var is_moving = false
func _physics_process(delta: float) -> void:
if is_moving == false:
return
if global_position == sprite_2d.global_position:
is_moving = false
return
sprite_2d.global_position = sprite_2d.global_position.move_toward(global_position, move_speed)
func _ready() -> void:
animation_player.play("chomping")
func _process(delta: float) -> void:
if is_moving:
return
if Input.is_action_pressed("up"):
rotation_degrees = 90
move(Vector2.UP)
is_moving = true
elif Input.is_action_pressed("down"):
rotation_degrees = 270
move(Vector2.DOWN)
is_moving = true
elif Input.is_action_pressed("left"):
rotation_degrees = 0
move(Vector2.LEFT)
is_moving = true
elif Input.is_action_pressed("right"):
rotation_degrees = 180
move(Vector2.RIGHT)
is_moving = true
func move(direction: Vector2):
var current_tile: Vector2i = tile_map.local_to_map(global_position)
var target_tile: Vector2i = Vector2i(
current_tile.x + direction.x,
current_tile.y + direction.y,
)
var tile_data: TileData = tile_map.get_cell_tile_data(0, target_tile)
if tile_data.get_custom_data("walk_tiles") == false:
return
#Player movement
is_moving = true
global_position = tile_map.map_to_local(target_tile)
sprite_2d.global_position = tile_map.map_to_local(current_tile)
Várias soluções possíveis. Minha recomendação seria criar uma variável global para armazenar a direção atual do jogador. Então, em vez de chamar move(direction), altere a variável player_direction e faça uma chamada para uma função move() independente de direção.
Exemplo de semi-pseudocódigo: