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() # 让当前状态处理输入/动画
相关推荐
yangyanping201088 小时前
Go语言学习之对象关系映射GORM
jvm·学习·golang
网络工程小王8 小时前
【Transformer架构详解】(学习笔记)
笔记·学习
北风toto8 小时前
前端CSS样式详细笔记
前端·css·笔记
Heartache boy9 小时前
野火STM32_HAL库版课程笔记-手动建立工程模板与CubeMX后续用法(重要)
笔记·stm32·单片机·嵌入式硬件
倒酒小生10 小时前
今日算法学习小结
学习
starvapour10 小时前
Ubuntu系统下基于终端的音频相关命令
linux·ubuntu·音视频
醇氧10 小时前
【学习】【说人话版】子网划分
学习
不灭锦鲤11 小时前
网络安全学习(面试)
学习·安全·web安全
世人万千丶12 小时前
Flutter 框架跨平台鸿蒙开发 - 鸿蒙版本五子棋游戏应用
学习·flutter·游戏·华为·harmonyos·鸿蒙
Aktx20FNz12 小时前
一文学习 Spring AOP 源码全过程
java·学习·spring