【极简】Godot 4.4 有限状态机

【Godot4自学手册】第四节动画状态机-AnimationTree Godot引擎通过AnimationPlay节点实现了最灵活的动画系统,它几乎可以给godot中的任意节点的任意属性添加动画,而且它还有专用的变换函数,bezier曲线,函数回调,声音控制和子动画轨道(sub-animation track)等的特性。 阅读详情
AI摘要

本文介绍了在 Godot 4.4 中实现简易有限状态机,包括空闲、行走、跳跃状态。详细说明了复刻过程,如节点结构、独立资源/脚本、附加脚本的设置,还提及其他设置,如导入资产、新建动画、添加碰撞等,最后进行运行测试,并提供免费开源资产包下载链接。

无望其速成,无诱于势利。

一、展示

本文实现简易有限状态机—— 空闲/行走/跳跃。

请添加图片描述

二、复刻

(一)节点结构

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

在这里插入图片描述
在这里插入图片描述

(二)独立资源/脚本

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() -> void:
	parent_name = get_parent().name
	
	# 获取状态管理器下所有状态
	# 加入字典、连接信号
	for child in get_children():
		if child is State:
			states[child.name.to_lower()] = child
			child.transition.connect(transition_to)
	
	# 进入初始状态
	if initial_state:
		initial_state._on_enter()
		current_state = initial_state
		current_state_name = current_state.name.to_lower()


# _process 和 _physics_process
# 执行当前状态的行为(如空闲:播放空闲动画)
func _process(delta : float) -> void:
	if current_state:
		current_state._on_process(delta)


func _physics_process(delta: float) -> void:
	if current_state:
		current_state._on_physics_process(delta)
		current_state._on_next_transitions()
		#print(parent_name, " Current State: ", current_state_name)


# 状态转变信号的回调函数
# 状态转换
func transition_to(state_name : String) -> void:
	if state_name == current_state.name.to_lower():
		return
	
	var new_state = states.get(state_name.to_lower())
	
	if !new_state:
		return
	
	if current_state:
		current_state._on_exit()
	
	new_state._on_enter()
	
	current_state = new_state
	current_state_name = current_state.name.to_lower()
	#print("Current State: ", current_state_name)

3. idle.gd

附加到player.tscn中的 Idle(Node)节点:

extends State
## 空闲状态

@export var player: Player
@export var animated_sprite_2d: AnimatedSprite2D


func _on_process(_delta : float) -> void:
	pass


func _on_physics_process(delta : float) -> void:
	# 播放空闲动画
	if player.direction != 0.0:
		animated_sprite_2d.flip_h = player.direction < 0
	
	animated_sprite_2d.play("idle")
	# 添加重力
	if not player.is_on_floor():
		player.velocity += player.get_gravity() * delta
	

	player.move_and_slide()
	
func _on_next_transitions() -> void:
	# 按下跳跃键转为跳跃状态
	if Input.is_action_just_pressed("jump") and player.is_on_floor():
		transition.emit("jump")
	# 有方向输入转为行走状态
	elif GameInput.is_movement_input():
		transition.emit("Run")


func _on_enter() -> void:
	pass


func _on_exit() -> void:
	animated_sprite_2d.stop()

4. run.gd

附加到player.tscn中的 Run(Node)节点:

extends State
## 行走状态

@export var player: Player
@export var animated_sprite_2d: AnimatedSprite2D


func _on_process(_delta : float) -> void:
	pass


func _on_physics_process(delta : float) -> void:
	# 获取输入
	var direction: float = GameInput.movement_input()
	
	# 播放移动动画
	if direction != 0:
		animated_sprite_2d.flip_h = direction < 0
		player.direction = direction
	
	animated_sprite_2d.play("run")
		
	# 控制移动
	if direction:
		player.velocity.x = direction * player.SPEED
	else:
		player.velocity.x = 0
	
	# 添加重力
	if not player.is_on_floor():
		player.velocity += player.get_gravity() * delta
		
	player.move_and_slide()


func _on_next_transitions() -> void:
	# 按下跳跃键转为跳跃状态
	if Input.is_action_just_pressed("jump") and player.is_on_floor():
		transition.emit("jump")
	# 无方向输入转为空闲状态
	elif not GameInput.is_movement_input():
		transition.emit("idle")


func _on_enter() -> void:
	pass


func _on_exit() -> void:
	animated_sprite_2d.stop()

5. jump.gd

附加到player.tscn中的 Jump(Node)节点:

extends State
## 跳跃状态

@export var player: Player
@export var animated_sprite_2d: AnimatedSprite2D

const JUMP_VELOCITY = -300.0


func _on_process(_delta : float) -> void:
	pass


func _on_physics_process(delta : float) -> void:
	# 添加重力
	player.velocity += player.get_gravity() * delta
	
	player.move_and_slide()
	
	
func _on_next_transitions() -> void:
	# 着陆后根据输入选择状态
	if player.is_on_floor():
		if GameInput.is_movement_input():
			transition.emit("run")
		else:
			transition.emit("idle")

func _on_enter() -> void:
	# 播放跳跃动画
	animated_sprite_2d.flip_h = player.direction < 0
	animated_sprite_2d.play("jump")
	# 控制跳跃
	player.velocity.y = JUMP_VELOCITY
	
	
func _on_exit() -> void:
	animated_sprite_2d.stop()
	player.velocity.x = 0

(四)其他设置

0. 导入资产

从文末链接下载资产源后,导入Godot引擎。

1. 新建动画

选中 player.tscn 场景下的 AnimateSprite2D 节点,在检查器中新建SpriteFrames;

在这里插入图片描述
以 从精灵表添加帧 的方式:
新建 idle 动画;

在这里插入图片描述
新建 run 动画;

在这里插入图片描述
新建 jump 动画;

在这里插入图片描述

2. 添加角色碰撞

选中 player.tscn 场景下的 CollisionShape2D 节点,在检查器中为角色添加圆形碰撞;

在这里插入图片描述

3. 添加碰撞平台

选中 test_scene.tscn 场景下的 CollisionShape2D 节点,在检查器中设置碰撞 WorldBoundaryShape2D ,并拖动到合适位置;

在这里插入图片描述

4. 显示碰撞区域

调试->显示碰撞区域,勾选后可见碰撞体;

在这里插入图片描述

5. 添加导出属性

选中 player.tscn 场景下的 StateMachine 节点,在检查器中选择Idle节点;

在这里插入图片描述
分别选中 player.tscn 场景下的 Idle、Run、Jump 节点,在检查器中选择Player、AnimateSprite2D节点;

在这里插入图片描述

6. 设置输入映射

项目设置->输入映射:添加 A、W、D 控制左右移动和跳跃;

在这里插入图片描述

7. 显示画面太小

在项目设置->显示->窗口:缩放设置为4.0;

在这里插入图片描述

8. 画面模糊

在项目设置->渲染->纹理->画布纹理:默认纹理过滤设置为Nearest;

在这里插入图片描述

三、运行测试

搭建测试场景如下:
请添加图片描述
测试完成!

四、自查对照

问题现象关键检查点解决方案
The InputMap action “left” doesn’t exist. Did you mean “ui_down”?检查输入映射是否存在left,right,jump动作项目设置→输入映射→添加left,right,jump并绑定键盘A、D、W键
画面太小检查项目设置->常规->显示->拉伸->缩放调整缩放大小
角色像素纹理不清晰检查项目设置->渲染->纹理->画布纹理->默认纹理过滤在默认纹理过滤设置为Nearest
@ _on_physics_process(): There is no animation with name ‘idle’.检查AnimateSprite2D的底栏动画是否创建,若已创建,则查看命名有无问题创建idle动画,或者修改动画名为idle

五、免费开源资产包

某开源网站精灵图资源包链接: 点击此处

  1. 进入链接后点击下图按钮

下载

  1. 然后点击【No thanks,just take me to the downloads】(不了谢谢,只想下载)

No thanks,just take me to the downloads

  1. 最后点击下图按钮完成下载(注意导入前需解压缩)

下载

【实战】Godot 4.4 有限状态机:从零构建2D角色控制器 本文详细介绍了如何在Godot 4.4中使用有限状态机(FSM)构建2D角色控制器。通过分离角色行为状态(如空闲、奔跑、跳跃)为独立模块,实现代码的模块化和易维护性。文章包含场景搭建、动画配置、核心脚本编写及调试技巧,帮助开发者高效创建复杂的角色控制系统。 阅读详情

相关推荐

Godot 4.6 手写有限状态机:从零搭建可扩展角色控制架构

有限状态机(FSM)是游戏开发中梳理角色行为逻辑的经典模型,核心思想是将实体划分为多个独立状态,以事件驱动状态迁移,让每个状态只关注自身行为。相较 if/else 和枚举分支,状态机把条件判断与行为执行解耦,显著降低代码复杂度,尤其适合角色控制这类需要频繁增改动作的模块。在 Godot 4.6 中,开发者可以利用节点树天然的生命周期和可视化能力,通过自定义 PlayerState 基类与 StateMachine 调度中心搭建可扩展的角色状态机架构,新增冲刺、攻击、攀爬等状态时只需添加节点并补充切换条件,无

weixin_31115195的博客 296

【杂谈】Godot 游戏开发:有限状态机

本文针对游戏开发中角色状态管理的复杂性,提出基于 ​​有限状态机(FSM)​​ 的Godot实现方案。通过 ​​状态基类(State)定义统一的生命周期方法(进入/退出/更新),配合状态管理器(StateMachine)集中调度状态转换。

ForBigData的博客 2250

Godot引擎开发:动作系统设计_动画树与状态机

动画树是一种节点系统,用于管理和混合多个动画片段。通过动画树,我们可以创建复杂的动画逻辑,例如在不同状态下平滑地过渡动画,或者根据不同的输入条件混合多个动画。动画树的核心节点是和,它们可以连接在一起形成一个树状结构。状态机是一种用于管理不同状态和状态之间切换的工具。在动作游戏中,状态机可以用来管理角色的不同动作状态,例如站立、行走、跳跃等。通过状态机,我们可以确保角色在不同的游戏情境下执行正确的动画和动作。通过动画树和状态机,我们可以实现复杂且平滑的角色动画和动作系统。

chenlz2007的博客 1434

Godot决策系统:有限状态机与行为树

在游戏开发中,非玩家角色(NPC)的智能行为是提升游戏体验的关键因素。你是否曾经遇到过这样的困境: - NPC行为逻辑混乱,代码难以维护 - 角色状态切换生硬,缺乏自然过渡 - 复杂行为难以模块化和重用 - 调试困难,难以追踪行为执行路径 Godot引擎提供了强大的工具集来解决这些问题,其中有限状态机(Finite State Machine, FSM)和行为树(Behavior Tree)是...

gitblog_00533的博客 1025

【Godot4自学手册】第二十七节自定义状态机完成看守地宫怪物

本节,我将使用自定义状态机实现看守地宫怪物,完成了基础类State,状态机类StateMachine的编码,实现了怪物的闲置巡逻类、追踪类和攻击类,以及对应动画等。这节代码有点多,不过还好,代码比较简单。

zhaoyang314的博客 3009

Godot4开发2D游戏,动画状态机-AnimationTree代码

Godot4开发2D游戏,动画状态机-AnimationTree代码,和AnimatedSpritetoAnimationPlayerConvertor4.0插件。

从零开始的 Godot 之旅 — EP9:有限状态机(一)

本文介绍了在Godot游戏引擎中实现角色攻击功能并引入有限状态机(FSM)设计模式的过程。首先详细讲解了如何制作攻击动画、配置输入映射和定义攻击规则,包括触发条件、持续时间和状态限制等。然后分析了当前代码结构存在的问题,如逻辑耦合、可维护性差等,提出了使用有限状态机的解决方案。 有限状态机将角色行为分解为独立的状态(如待机、移动、攻击等),每个状态处理自己的逻辑,通过预定义规则进行状态转换。文章阐述了状态机的核心组件:状态机(StateMachine)、状态(State)和状态转换条件(StateTrans

luckyrui123的博客 1357

银行客户投诉预测模型优化

在实际操作中,银行可以使用这个优化后的模型来识别那些可能引起客户不满的因素,并采取预防措施。例如,如果模型表明退款金额是一个很强的预测因子,银行可能会审查其退款政策,以确保它对客户是公平和透明的。在银行业务中,客户投诉是一个重要的指标,它直接关系到客户满意度和银行服务质量。某一个指标,比如:退款金额,本文假设退款金额对于预测投诉的权重应该高于赔偿金额。在每次迭代中,本文使用当前的权重组合来训练模型,并计算在测试集上的准确率。的可能值来搜索最佳的权重组合,并输出最佳准确率及对应的权重。来寻找最佳的权重组合。

weixin_57499254的博客 1707

从零开始的 Godot 之旅 — EP10:有限状态机(二)

本文介绍了如何在Godot游戏引擎中实现有限状态机(FSM)并应用于玩家角色控制。作者首先重构了项目结构,创建了state_machine、state、state_transition和state_loader四个核心脚本文件。然后在玩家场景中添加StateMachine节点并配置参数,创建idle、walk、attack三个具体状态节点。文章展示了如何启动状态机,并调整player.gd脚本使之与状态机协同工作,移除旧逻辑,由各状态脚本接管角色行为控制。通过状态机架构,实现了更清晰的角色行为管理和动画控制

luckyrui123的博客 1099

STM32(H7)学习记录-14 XSPI连接DDR SDRAM(HyperBus)

主控芯片是STM32H7S7 ,HyperBusRAM芯片是W956D8MBYA5I。*DQS0(这个引脚是作为RWDS)使用的CubeMX版本是6.13.0。

m0_71918616的博客 1072

从零开始用STM32驱动RGB屏:配置PCLK、DE同步信号的避坑指南

本文详细介绍了如何使用STM32驱动RGB接口LCD屏幕,重点解析了PCLK配置、同步信号极性和DE使能等关键参数的设置方法。通过实战代码示例和常见问题排查指南,帮助开发者避免常见配置错误,实现稳定的显示效果。特别针对800x480 IPS屏提供了优化建议和调试技巧。

sky77的博客 539

【亲测免费】 探索游戏开发新境界:Godot引擎的有限状态机插件

探索游戏开发新境界:Godot引擎的有限状态机插件 在游戏开发和复杂交互设计中,有限状态机(FSM)扮演着不可或缺的角色。今天,我们为大家带来一款专为Godot引擎量身打造的开源插件——Godot FSM Plugin,它极大地简化了状态管理的过程,使得开发者可以更加专注于游戏逻辑的设计,而非繁琐的状态切换实现。 项目介绍 Godot FSM Plugin是一款旨在优化Godot引擎内部状态管理的...

gitblog_00856的博客 1278

极速建站!用1Panel面板一键部署Halo博客的保姆级教程 | 企业官网/个人博客搭建教程

个人博客是一种在互联网上发布自己的文章、图片、视频等内容的平台,通常以文字为主要形式,但也可以包含其他媒体。个人博客的用途非常广泛。它可以用来记录博主的日常生活、分享自己的知识和经验、展示自己的作品和技能,以及交流自己的观点和看法。通过个人博客,博主可以与读者建立联系,分享自己的见解和体验,同时也可以从读者那里获得反馈和建议。

zeruns的博客 1830

Godot 4 NPC行为系统实战:基于有限状态机的巡逻追踪攻击实现

游戏AI的核心并非让角色像人类一样思考,而是通过规则驱动使其对环境和自身状态做出合理反馈。有限状态机(FSM)正是实现这一目标的经典模型,它将行为拆分为状态、事件和动作,每个状态独立成模块,大幅提升代码的可扩展性与可维护性。相比复杂的if-else嵌套,FSM在NPC巡逻、追踪、攻击等场景中表现尤为突出,广泛应用于动作游戏、塔防和模拟经营项目。本文基于Godot 4与GDScript,从状态基类设计到完整状态机框架搭建,一步步实现NPC的巡逻、追踪与攻击三个核心状态,并探讨状态切换的工程化技巧,为开发者提供

weixin_42697475的博客 244

手把手教你五种方案配置Obsidian免费同步,全平台通用(支持Alist/OpenList)

Obsidian是一款优秀的Markdown笔记工具,但官方同步服务每年近700元让人望而却步💸 本文整理了5种免费同步方案,涵盖苹果生态专属方案、多网盘插件同步、版本管理同步、点对点同步、自建实时同步等不同场景📱💻 每种方案都附有详细配置步骤,助你找到最适合的同步方式✨

XiaoqiangClub的博客 1832

ppt保存时嵌入字体,但找不到字体使用的位置的解决办法

摘要 当PPT提示无法保存嵌入字体时,可通过VBA代码快速定位使用该字体的文本。具体步骤如下: 按ALT+F11打开VBA编辑器,新建模块并粘贴提供的代码; 运行代码后输入目标字体名称(如“方正兰亭黑简体”); 程序将列出所有使用该字体的幻灯片编号及对应文本内容; 修改这些文本的字体即可解决保存问题。该方法高效精准,适用于排查PPT字体嵌入失败的情况。(150字)

智慧空间实验室 1396

Godot 4.4 有限状态机(FSM)实战:构建可维护的2D角色控制器

有限状态机(FSM)是一种用于管理对象在有限状态间转换的设计模式,其核心原理是将复杂的行为逻辑分解为离散的、独立的状态,并通过明确的转换规则进行调度。在游戏开发领域,FSM的技术价值在于它能极大提升代码的可维护性、可扩展性,并减少因状态混乱引发的Bug。其典型应用场景包括管理游戏角色的行为(如站立、奔跑、跳跃)、敌人AI、UI流程以及动画状态。本文将以**Godot 4.4**引擎为例,深入探讨如何为2D平台跳跃游戏角色构建一个生产级可用的状态机框架,涵盖从核心架构设计、基础状态(闲置、移动、跳跃、下落)实

weixin_30882895的博客 322

基于深度学习的推荐系统设计与实现

基于深度学习的推荐系统设计与实现 作者:禅与计算机程序设计艺术 / Zen and the Art of Computer Programming / TextGenWebUILLM 基于深度学习的推荐系统设计与实现 关键词:深度学习, 推荐系统, 用

AI天才研究院 1078

Godot 4有限状态机实战:打造清晰的NPC行为AI

有限状态机(FSM)是一种将复杂行为拆解为清晰状态与转换条件的经典建模方法。它通过状态、事件和动作的协作,把散落在条件判断中的决策逻辑集中管理,显著降低多行为系统的心智负担。在游戏开发中,FSM 常用于 NPC 的巡逻、追击、攻击等行为控制,相比纯 if-else 堆叠更易扩展和维护。行为树虽然适合更复杂的决策,但对多数中小型项目而言,FSM 已是性价比最高的选择。以 Godot 4 和 GDScript 为例,从零实现一个带巡逻、追击、攻击、返回四状态的智能 NPC 示例,并演示从枚举匹配到状态模式的重构

weixin_29021291的博客 340

【论文硬核拆解】Ctx2Skill:让大模型自己跟自己玩,从上下文里「进化」出可复用技能

论文选择自然语言技能可解释性:技能是人类可读的 Markdown 文件,可以审查、编辑、调试可迁移性:即插即用,从一个模型到另一个模型无需参数访问:对闭源模型友好这比 SKILL0/SkillRL 等参数内化方法更实用,尤其是在商业 API 场景。

步子哥的博客 151

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Godot 4.x有限状态机实战:为NPC打造智能巡逻追击行为系统

游戏AI设计是提升NPC表现力的关键,而有限状态机(FSM)是其中最经典且轻量级的工程方案。它通过将复杂行为拆分为独立状态,配合条件触发的状态切换,让NPC在不同情境下做出合理反应。本文基于Godot 4.x引擎,从状态机设计原理出发,讲解了如何使用GDScript实现待机、巡逻、追击、返回等核心状态,并探讨了批量NPC复用与扩展行为树的路径。这套方案不需要外部AI服务或GPU训练,能有效解决NPC反应迟钝、逻辑混乱等常见痛点,适用于2D/3D动作、RPG及塔防等游戏类型的NPC行为控制。

weixin_27379781的博客 310

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Godot 4游戏AI开发:有限状态机与行为树混合架构实战

在游戏开发中,AI行为管理是构建智能角色的核心技术。其原理基于对复杂逻辑的模块化与层次化组织,通过将行为分解为离散的决策单元来实现可控的智能表现。这一技术的核心价值在于提升代码的可维护性、可复用性与调试效率,使开发者能够专注于游戏玩法设计而非底层逻辑纠缠。有限状态机(FSM)擅长管理具有明确模式切换的宏观行为,如角色的闲置、移动、攻击等状态;行为树(BT)则专注于处理具有优先级和序列的微观任务规划,如NPC的巡逻、寻敌、战斗决策。在实际应用场景中,将两者嵌套使用可以灵活应对不同粒度的AI需求,例如在FSM的

weixin_30887919的博客 256

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

告别复杂状态管理:Godot Engine AI有限状态机实战指南

你是否还在为游戏角色的AI行为逻辑混乱而头疼?是否在角色切换状态时遭遇过难以调试的bug?本文将带你使用Godot Engine内置的状态机系统,通过枚举实现简洁高效的AI行为管理,让你的游戏角色行为逻辑一目了然。读完本文,你将掌握状态机的核心设计思想、枚举类型的最佳实践,以及如何在Godot中快速搭建可靠的AI行为系统。 ## 什么是有限状态机 有限状态机(Finite State Mach...

gitblog_00471的博客 649

推荐:Godot 4 的BehaviourToolkit插件 —— 创新行为设计的利器

推荐:Godot 4 的BehaviourToolkit插件 —— 创新行为设计的利器 在游戏开发中,为角色和对象赋予智能和复杂行为是提升游戏体验的关键。今天我们要向你推荐的是专为Godot 4.x游戏引擎打造的开源项目——BehaviourToolkit。这个强大的插件集成了多种行为架构工具,让你能够轻松构建定制化和复杂的游戏逻辑。 项目介绍 BehaviourToolkit是一个创新的工具包...

gitblog_00025的博客 919

Godot 3 有限状态机示例解析:游戏编程中的状态模式应用

在游戏开发中,状态模式(State Pattern)是一种极其重要的设计模式,它允许对象在其内部状态改变时改变其行为。这个来自gdquest-demos/godot-3-demos项目的示例展示了如何在GDScript中实现状态模式,包括层次状态和自动下推机(Pushdown Automaton)的应用。 ## 状态模式的核心优势 1. **行为分离与简化管理** 通过将每个行为及其...

gitblog_00005的博客 742
上一篇: 【转载】GDScript 编写规范
下一篇: 【杂谈】Godot 游戏开发:有限状态机
ForBigData
博客等级 码龄7年 221粉丝 41原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ForBigData

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值