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() # 让当前状态处理输入/动画
相关推荐
不灭锦鲤2 小时前
网络安全学习第50天(文件包含)更新
学习
CWM-183125336392 小时前
士模微CM4101:低噪声精密运算放大器完美替代OP27
嵌入式硬件·音视频
BUG创建者2 小时前
uniapp 开发app时播放实时视频海康ws的流数据
前端·javascript·vue.js·uni-app·html·音视频
微露清风2 小时前
系统性学习Linux-第八讲-进程间通信
java·linux·学习
ID_180079054732 小时前
python采集小红书笔记详情API接口,json数据返回
笔记·python·json
Be for thing2 小时前
Android 传感器硬件原理 + 功耗测试与异常定位实战(手表 / IoT / 手机通用)
android·学习·智能手机
问水っ2 小时前
Qt Creator快速入门 第三版 第四章 布局管理
开发语言·qt·学习
EasyGBS2 小时前
零成本守护监控画质:国标GB28181平台EasyGBS视频质量诊断覆盖11类画质异常
人工智能·音视频·蓝屏·画面冻结·花屏检测·画面抖动·画面模糊
A923A2 小时前
【Vue3大事件 | 项目笔记】第四天
前端·vue.js·笔记·前端项目