游戏状态机的设计与实现
前言:
游戏编程中对状态机的理解和应用,是体现程序员是否对游戏编程入门的重要指标。本篇文章描述状态机的原理,以及如何实现。并探讨状态机的扩展性和易用性。
什么是状态机:
1、状态机是通过状态变量来描述不同状态
2、状态机变量是互斥的
3、状态机的分割是状态机好坏的标准
状态机的好处:
1、降低整个系统的复杂性
2、容易扩展
3、容易维护
如何实现状态机:
1、通过不同的状态分割逻辑
2、通过面向对象思想来扩展和分割逻辑
状态机简单类型:
1、定义状态机类型
enum PlayerState{INVALID,STAND,MOVE,ATTACK,DIE
};
2、实现更新状态,在不同的状态执行不同的逻辑
void Player::Update(float ts){switch(user_state_){case STAND:Stand(ts);break;case MOVE:Move(ts);break;case ATTACK:Attack(ts);break;case DIE:Die();return;default:std::cout<<"error\n";}if(hp_ <= 0){SetState(DIE);}
}
3、切换状态,在切换状态的时候做一些事情
void Player::SetState(PlayerState state){if(state == user_state_){return;}switch(state){case STAND:std::cout << "----begin stand--------\n";break;case MOVE:std::cout << "----begin move--------\n";break;case ATTACK:std::cout << "----begin attack--------\n";break;case DIE:std::cout << "----begin die--------\n";break;default:std::cout <<"the state is error";break;}user_state_ = state;
}
这种状态机小而精悍,如果在一个对象中有很多标志量来标记实例的状态,这时候该考虑下通过这种小型的状态机来实现了。但是这种状态机如果状态变量比较多,扩展性并不好。并且复杂性会随着状态机的增多,指数型增加。整个编译单元的代码量也会很大,对易读性和维护性都是负面影响。
状态机面向对象类型:
面向对象类的状态机是一种更容易扩展的新型状态机,通过单间实现方式,使用更少的内存,先看下整个状态机的uml设计图。
游戏状态机的设计与实现相关推荐
- FPGA之道(54)状态机的设计
文章目录 前言 状态机的设计 状态浅析 真正的状态 抽象的状态与中间变量 抽象状态的设计方法 抽象状态与中间变量的权衡 基本状态介绍 初始态 结束态 中继态 分支态 复位态 空闲态 多余态 状态的一些 ...
- 状态驱动的游戏智能体设计(下)
本文由恋花蝶最初发表于http://blog.csdn.net/lanphaday,欢迎转载,但必须保持全文完整,也必须包含本声明. 译者并示取得中文版的翻译授权,翻译本文只是出于研究和学习目的.任何 ...
- 状态驱动的游戏智能体设计(中)
本文由恋花蝶最初发表于http://blog.csdn.net/lanphaday,欢迎转载,但必须保持全文完整,也必须包含本声明. 译者并示取得中文版的翻译授权,翻译本文只是出于研究和学习目的.任何 ...
- 百万用户级游戏服务器架构设计
百万用户级游戏服务器架构设计 服务器结构探讨 -- 最简单的结构 所谓服务器结构,也就是如何将服务器各部分合理地安排,以实现最初的功能需求.所以,结构本无所谓正确与错误:当然,优秀的结构更有助于系统的 ...
- 状态驱动的游戏智能体设计
State-Driven Game Agent Design 状态驱动的游戏智能体设计 Mat Buckland著 赖勇浩(http://blog.csdn.net/lanphaday) 译 Note ...
- 状态驱动的游戏智能体设计(上)
本文由恋花蝶最初发表于http://blog.csdn.net/lanphaday,欢迎转载,但必须保持全文完整,也必须包含本声明. 译者并示取得中文版的翻译授权,翻译本文只是出于研究和学习目的.任何 ...
- AI设计:如何给动作游戏的敌人设计人工智能?
游戏中的AI可以简单的理解为计算机控制的智能角色,这些智能角色能够通过周遭环境或者事件的变化进行逻辑判断,从而同玩家进行产生特定的行为交互. 组成AI的三个基本元素: AI的基本逻辑,AI的基本能力, ...
- 游戏程序开发:状态驱动的游戏智能体设计 (二)
转自: 状态驱动的游戏智能体设计(一) http://edu.gamfe.com/tutor/d/30601.html 状态驱动的游戏智能体设计(二) http://edu.gamfe.com/tut ...
- 游戏UI框架设计(三) : 窗体的层级管理
游戏UI框架设计(三) ---窗体的层级管理 UI框架中UI窗体的"层级管理",最核心的问题是如何进行窗体的显示管理.窗体(预设)的显示我们前面定义了三种类型: 普通.隐藏其他.反 ...
最新文章
- Error:Execution failed for task ':app:dexDebug'. com.android.ide.common.process.ProcessException
- 如何设计 Web App 应用架构?「两分钟了解 IOING」
- PX4修改线程内存大小
- C语言写一函数交换两变量的值
- 解决 iOS 12.4 Killed: 9 的问题
- jstack命令使用
- oCam(屏幕录制) 一款小巧方便的专业屏幕录制软件 彻底解决你的录屏问题
- JSchException: Algorithm negotiation fail
- OCR文字识别算法与搭建流程
- Vim下快速删除字符串
- C语言中的int类型
- 粘贴时怎样跳过隐藏行,excel技巧
- Problem C: 点在圆内吗?
- 误人子弟的网络,谈谈HTTP协议中的短轮询、长轮询、长连接和短连接
- 一文了解各大数据库查询语言(Gremlin vs Cypher vs nGQL操作篇
- 苹果承认新一代iPad wifi问题 正调查原因
- Linux系统下海康工业相机MVS二次开发-Python
- nexus7二代刷Linux,大饱眼福: Nexus 7二代全拆解
- WebLogic安装补丁
- 肿瘤浸润淋巴细胞在病理图像上的空间组织与分子相关性
热门文章
- java正则表达式非贪婪_正则表达式贪婪与非贪婪模式(示例代码)
- uniapp(踩坑记录 持续更新)
- PHP Smarty 函数插件(自定义函数)html_checkboxes
- n个小球放入m个盒子中_N个球放入M个盒子中的情况分析
- php学习笔记-面向对象
- Flir Blackfly S 工业相机:配置多个摄像头进行同步拍摄
- 小程序源码:自带多平台解析接口短视频去水印图集-多玩法安装简单
- 移动无法访问函数不正确怎么才能把磁盘修好?
- 微信公众平台回复多条消息php,PHP微信公众平台开发 - 消息回复的封装_PHP教程...
- Kafka消息中间件(Kafka与MQTT区别)