godot2D游戏教程系列二(16)

前言:

完成目标:

成功编写状态机核心脚本,实现:

  • 初始化所有状态
  • 设置默认状态为 Idle
  • 每帧自动更新当前状态

一、创建状态机脚本

  • 新建 StateMachine.gd
  • 继承 Node
  • 定义变量 currentState 用来存储当前状态

作用:

状态机负责"记录现在处于什么状态"。


二、在 _ready() 中初始化所有状态

  • 遍历所有子节点(Idle、Run 等)
  • 确保它们是 State 类型
  • 告诉每个状态:"你的父节点是我"
  • 调用它们自己的初始化方法

作用:

让所有状态提前准备好。


三、设置默认状态

  • 默认选择第一个子节点(Idle)
  • 调用 Enter() 方法

效果:

游戏一开始角色自动进入待机状态,并播放待机动画。


四、每帧更新当前状态

  • ​_physics_process(delta)​ → 调用当前状态的物理更新(移动、重力)
  • ​_process(delta)​ → 调用当前状态的逻辑更新(输入、切换状态)

作用:

状态机只负责"转发",

真正的逻辑写在各个状态里面。


最终效果

现在:

  • 游戏启动 → 自动进入 Idle
  • 每帧自动调用当前状态逻辑
  • 状态机负责管理
  • 各状态各司其职

玩家状态系统正式开始运作。

实现过程:

  • 编写状态机脚本,在ready函数中初始化所有的状态脚本,将待机状态设置为初始进入游戏的默认状态。
  • 状态机的概念
  • 想象你在玩一个 RPG 游戏:
  • 状态机是"大脑",决定角色现在该做什么(站立、跑步、攻击)。
  • 状态是具体的行为:
  • IdleState:播放站立动画,检测"按方向键→跑步"。
  • RunState:播放跑步动画,检测"松开方向键→站立"。
  • 初始化:游戏开始时,角色默认进入 IdleState。
  • 每帧更新:
  • 物理更新(_physics_process):处理移动、重力。
  • 逻辑更新(_process):检查输入、切换状态。
  • 代码
  • (1) 创建状态机脚本
  • 新建一个脚本 StateMachine.gd,继承自 Node(因为要挂到场景树上)。
  • 声明一个变量 currentState,用来存储当前状态。
  • extends Node
  • class_name StateMachine # 允许其他脚本通过"StateMachine"这个名字引用它
  • var currentState: State # 存储当前状态(假设State是所有状态的基类)
  • (2) 初始化所有状态
  • 在 _ready() 里遍历所有子节点(Idle、Walk、Attack)。
  • 对每个子节点说:"你的父状态机是我",并调用它的初始化方法。
  • func _ready():
  • for child in get_children(): # 遍历所有子状态(Idle、Walk等)
  • var childState = child as State # 确保子节点是"状态"类型
  • childState.parentStateMachine = self # 告诉子状态:"我是你爹(状态机)"
  • childState.Ready() # 让子状态自己初始化(比如加载动画)
  • (3) 设置初始状态
  • 默认把第一个子状态(比如 Idle)设为当前状态。
  • 调用初始状态的 Enter() 方法(比如播放"站立"动画)。
  • currentState = get_child(0) # 第一个子状态是初始状态
  • currentState.Enter() # 进入该状态(比如播放动画)
  • (4) 每帧更新当前状态
  • 在 physicsprocess 里告诉当前状态:"处理物理逻辑"(比如移动角色)。
  • 在 _process 里告诉当前状态:"处理普通逻辑"(比如检测输入)。
  • func physicsprocess(delta):
  • currentState.UpdatePhysics(delta) # 让当前状态处理物理(如重力、移动)
  • func _process(delta):
  • currentState.Update() # 让当前状态处理输入/动画
相关推荐
知产xiao_xin7 小时前
知识产权入门 —— 相关权(邻接权)
经验分享·笔记·知识产权
自小吃多7 小时前
DXF文件导入与PCB板框定义笔记
笔记·嵌入式硬件
是隼人8 小时前
buuctf-pwn xdctf2015_pwn200题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
jike_20269 小时前
iPhone采访录音同时拍现场照片的APP:图片音频同步记录实测
笔记·智能手机·音视频·语音识别
大衛說9 小时前
《Python 从入门到精通》系列总览与学习路线
开发语言·python·学习
小猴子爱上树9 小时前
跨境电商翻译工具推荐:批量图片翻译、视频字幕翻译、智能抠图一站式搞定
人工智能·python·音视频
林澈在路上9 小时前
AI翻唱软件哪个好 2026国产AI写歌工具对比推荐
大数据·人工智能·深度学习·github·aigc·音视频·音频
吃好睡好便好10 小时前
查找函数的使用
学习·算法·matlab·生活·查找函数
学运维的Kysan10 小时前
暑假运维学习打卡第二十九天8.29
学习
————A10 小时前
Agent 接收用户上传文件
人工智能·笔记·python·状态模式