运动状态实现

Movement State Implementation

我正在制作一款角色扮演游戏,玩家可以使用 WASD 键在世界各地自由移动;但在战斗中,玩家会切换到由鼠标控制的基于战术网格的移动。我想用状态来完成这个;但我不知道如何正确地做到这一点。

这是我的运动机制代码:

extends KinematicBody2D

export (int) var speed = 250
var velocity

var states = {movement:[Over_Mov, Tile_Mov]}
var current_state = null

func _ready():
    current_state = Over_Mov

func get_input():
    velocity = Vector2()

    if Input.is_action_pressed("ui_up"):
        velocity.y -= 1
    elif Input.is_action_pressed("ui_down"):
        velocity.y += 1
    elif Input.is_action_pressed("ui_right"):
        velocity.x += 1
    elif Input.is_action_pressed("ui_left"):
        velocity.x -= 1
    velocity = velocity.normalized() * speed

func _physics_process(delta):
    get_input()
    move_and_collide(velocity*delta)

我正在使用戈多的运动力学样本。

处理状态的一种简单方法是使用 enummatch

enum State { OVER_MOV, TILE_MOV }

export(int) var speed = 250
var velocity
var current_state = OVER_MOV

func handle_over_mov_input():
    velocity = Vector2()
    if Input.is_action_pressed("ui_up"):
        velocity.y -= 1
    elif Input.is_action_pressed("ui_down"):
        velocity.y += 1
    elif Input.is_action_pressed("ui_right"):
        velocity.x += 1
    elif Input.is_action_pressed("ui_left"):
        velocity.x -= 1
    velocity = velocity.normalized() * speed

func handle_tile_mov_input():
    # .. handle tile mov input here
    pass

func _physics_process(delta):
    match current_state:
        OVER_MOV: handle_over_mov_input()
        TILE_MOV: handle_tile_mov_input()
    move_and_collide(velocity*delta)
    if some_state_changing_condition:
        current_state = other_state

如果您想更多地了解状态模式,请查看 GameProgrammingPatterns 一书中的 State 章节。