(我发过一个类似的帖子,只是我决定切换到 godot,这样我就可以比在 flash 中更轻松地制作游戏,因为它已经过时了)
我制作了一个玩家可以控制的角色,它通过瓷砖和瓷砖地图移动,我想让玩家在按下箭头键时可以永远移动(并移动到所述箭头键的方向),直到它进入接触不可行走瓷砖的可行走瓷砖
您可以给我任何有关如何操作的提示,以下是代码:
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)
有多种可能的解决方案。我的建议是创建一个全局变量来存储玩家的当前方向。然后,不要调用 move(direction),而是更改 player_direction 变量并调用与方向无关的 move() 函数。
半伪代码示例: