运动状态实现
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)
我正在使用戈多的运动力学样本。
处理状态的一种简单方法是使用 enum
和 match
。
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 章节。
我正在制作一款角色扮演游戏,玩家可以使用 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)
我正在使用戈多的运动力学样本。
处理状态的一种简单方法是使用 enum
和 match
。
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 章节。