无望其速成,无诱于势利。
目录
一、展示
本文实现简易有限状态机—— 空闲/行走/跳跃。

二、复刻
(一)节点结构
1. player.tscn
- Player(CharacterBody2D)
- AnimateSprite2D
- CollisionShape2D
- NodeState(Node)
- Idle(Node)
- Walk(Node)
- Jump(Node)
2. test_scene.tscn
- TestScene(Node2D)
- Player(player.tscn):见1
- Camera2D
- StaticBody2D
- CollisionShape2D
- Player(player.tscn):见1


(二)独立资源/脚本
1. state.gd(状态基类)
功能:被所有状态子类继承的父类模板,状态子类在此基础上重写方法
class_name State
extends Node
## 状态基类
## 用于状态模式中表示一个状态,子类应继承此类并实现具体状态逻辑
@warning_ignore("unused_signal")
signal transition # 当前状态发出转换信号
# 状态处理函数(每帧调用)
func _on_process(_delta : float) -> void:
pass
# 物理处理函数(固定时间步长调用)
func _on_physics_process(_delta : float) -> void:
pass
# 状态转换条件检测(由状态管理器定期调用)
func _on_next_transitions() -> void:
pass
# 状态进入时回调
# 当状态到此状态时自动调用,用于初始化状态相关逻辑
func _on_enter() -> void:
pass
# 状态退出时回调
# 当状态机切换出此状态时自动调用,用于清理状态相关资源
func _on_exit() -> void:
pass
2. game_input.gd
功能:管理游戏输入逻辑
class_name GameInput
extends Node
static func movement_input() ->float:
# 获取键盘输入方向:-1/0/1
var direction = Input.get_axis("left", "right")
return direction
static func is_movement_input() ->bool:
if movement_input() == 0.0:
return false
return true
(三)附加脚本
1. player.gd(玩家脚本)
附加到player.tscn中的 Player(CharacterBody2D)节点:
class_name Player
extends CharacterBody2D
const SPEED: float = 100.0
var direction: float
2. state_machine.gd(状态管理器)
附加到player.tscn中的 StateMachine(Node)节点:
class_name StateMachine
extends Node
@export var initial_state : State
var states : Dictionary = {
}
var current_state : State
var current_state_name : String
var parent_name: String
func _ready()

最低0.47元/天 解锁文章
1281

被折叠的 条评论
为什么被折叠?



