基于状态机的游戏框架

一 定义

有限状态机就是一个具有有限数量状态,

并且能够根据相应的操作从一个状态变换到另一个状态,

而在同一时刻只能处在一种状态下的智能体。

英文:Finite State Machine

简称:FSM

二 最简单的状态机

最简单的状态机:if-else

实际上if-else就是一个最有两种状态的状态机,分别是true和false

三 伪状态机

当两种情况不能满足我们的需求时,我们可以用if-else if -...-else,

不过,为了方便,我们可以使用switch-case代替

首先,定义一组不同的状态,我们可以使用宏定义或者枚举:

enum EState{
	eState_Min,		// 未初始化状态
	eState_One,
	eState_Two,
	...
	eState_Max,		// 用于异常检测
};

定义一个对象,保存当前的状态:

EState curState = eState_Min;

现在,就可以在switch中检测当前的状态,并做出相应的处理

void update(){
	switch(curState){
	case eState_One:
		onStateOne();
		break;
	case eState_Min:
		onStateTwo();
		break;
	...

	case eState_Max:
		break;

	default:
		// 报错
	}
}

然后对每种状态做不同的处理,

void onStateOne(){

}

void onStateTwo(){

}
...

例如,对于一个野怪,状态一时,可以让它来回走动,并检测是否有英雄单位靠近,

当检测到有英雄靠近时,转换为状态二,攻击英雄。

所有,我们还需要一个转换状态的函数

void converToState(EState dstState){
	curState = dstState;
}

上面的状态机是基于C语言的实现方式,当出现一个新的状态时,需要修改相应的代码,

这种游戏框架结构,使用与一般的小游戏。当游戏规模较大,逻辑很复杂后,在switch结构就会变得很复杂。

三 真正的状态机

下面是一种用利用面向对象的多态性实现的一种状态机。

首先,我们需要定义一个状态的基类,并定义一个纯虚函数。

这个纯虚函数用来处理当前状态的一些逻辑。

class BaseState{
public:
	virtual ~BaseState() = 0;
	virtual void execute() = 0;

	BaseState::~BaseState(){}
};

然后,我们定义一个状态机类,来控制状态的转换

class FSM{
public:
	void converToState(BaseState *state){
		if state then
			delete m_curState;
			m_curState = NULL;
		end
		m_curState = state;
	}

	void update(){
		m_curState->onState()
	}
protected:
 	BaseState* m_curState;
};

这样的话我们如果需要添加一个新的状态,只需要新加一个类,继承自BaseState就可以了。

例如:定义一个Monster

class Monster{
public:
	void update(){
		m_SFM->update()
	}

protected:
	FSM* m_SFM;
};

再定义两个状态类,在其中执行当前状态的函数,并检测状态是否发生变化,

如果状态变化了,则切换到其他状态。

class StateMove:BaseState{
public:
	~BaseState(){}
	void execute(){
		// move,check
	}
};

class StateFight:BaseState{
public:
	~BaseState(){}
	void execute(){
		// fight,check
	}
};

这样,一个基于状态机的游戏框架就OK了。

时间: 2024-11-12 21:27:08

基于状态机的游戏框架的相关文章

libgdx游戏框架介绍

libgdx作为上层为java,底层c和c++的游戏引擎.简直是优秀得一塌糊涂.  这个游戏框架最初只有1个人在维护,现在已经加入不少人了,越来越给力. libgdx的架构 很清晰, 我们先从包的结构分析: assets 代表资源包,用于资源加载等管理. audio 音频包,游戏需要播放声音时用. files 文件处理包,内部主要对象是FileHandle ,如果你用过Libgdx肯定对次很熟悉,libgdx加载纹理图片等都是通过此对象. graphics 绘画相关,就是我们要把游戏中的控件或者

JS写小游戏(一):游戏框架

前言 前一阵发现一个不错的网站,都是一些用html5+css+js写的小游戏,于是打算学习一番,写下这个系列博客主要是为了加深理解,当然也有一些个人感悟,如果英文好可以直接Click Here. 概述 一般,小游戏都要关注两个问题:刷新和交互.因为游戏一般是动态的,所以需要不断刷新.JavaScript是单线程,如果用C语言写过贪吃蛇之类的小游戏,应该知道,单线程一般是挂起一个时间来达到动态效果.比如C语言的Sleep(),JS的setInterval()等.但是js还有一种更高性能的方法req

基于SEDA的异步框架设计与实现

基于SEDA的异步框架设计与实现 二.为什么使用SEDA 目前,面对并发环境,主流互联网服务器编程模型有两种:多线程模型以及事件驱动模型.但是这两个模型都不足以解决这个问题.我们来首先看一下这两种编程模型. 1.多线程并发模型 多线程并发模型是目前最普遍的服务器编程模型,该模型的架构如下图所示:        该模型针对每一个请求,会为其创建并分配一个线程.该线程负责这个请求的处理.该模型的优点:执行粒度是整个完整的处理流程.处理逻辑清晰,容易开发.但与此同时缺点也很明显:如果处理过程中某一步骤

C#游戏框架uFrame

C#游戏框架uFrame兼谈游戏架构设计 c#语言规范 阅读目录 1.概览 2.基本概念 3.依赖注入 4.Manager of Managers 5.利用UniRX实现响应式编程 6.研究总结 回到目录 1.概览 uFrame是提供给Unity3D开发者使用的一个框架插件,它本身模仿了MVVM这种架构模式(事实上并不包含Model部分,且多出了Controller部分).因为用于Unity3D,所以它向开发者提供了一套基于Editor的可视化编辑工具,可以用来管理代码结构等.需要指出的是它的一

【读书笔记《Android游戏编程之从零开始》】10.游戏开发基础(View 游戏框架)

对于玩家来说,游戏是动态的:对于游戏开发人员来说,游戏是静态的,只是不停地播放不通的画面,让玩家看到了动态的效果. 进入Android之前,首先要熟悉三个重要的类:View(视图).Canvas(画布).Paint(画笔).通过画笔,可以在画布上画出各种精彩的图形.图片等等,然后通过视图可以将画布上的内容展现在手机屏幕上. 其次要熟悉“刷屏”的概念.绘制在画布中的图像不管是图片还是图形,都是静态的,只有通过不断的展现不同的画布,才能实现动态的效果.在手机上,画布永远只是一张,所以不可能通过不断地

[Android游戏开发]游戏框架的搭建

通常情况下,游戏开发的基本框架中,一般包括以下模块: 窗口管理(Window management):该模块负责在Android平台上创建.运行.暂停.恢复游戏界面等功能. 输入模块(Input):该模块和视窗管理模块是密切相关的,用来监测追踪用户的输入(比如触摸事件.按键事件.加速计事件等). 文件输入输出(File I/O):此模块用来读取assets文件下图片.音频等资源. 图像模块(Graphics):在实际游戏开发中,这个模块或许是最复杂的部分.它负责加载图片并把它们绘制到屏幕上. 音

cocos游戏框架--1

Cocos2d-x3.2教程——[我所认识的Cocos2d-x] 三.Cocos2d-x项目的游戏框架搭建 游戏与应用项目其实差别不是很大,甚至有许多地方都是一样的,无非侧重点不同,手机游戏更侧重于用户的体验,更加的娱乐化.情感化.让玩家感觉“爽”.而手机应用更侧重于简单.明了,优先完成业务为重.    在以Cocos2d-x引擎为基础上,其实我们要做的准备工作还是很多的:    一.分析项目    首先,我们要知道,我们这个游戏是什么样类型的游戏,游戏机制是什么,按照目前市场上来说可以分成如下

Swift版iOS游戏框架Sprite Kit基础教程下册

Swift版iOS游戏框架Sprite Kit基础教程下册 试读下载地址:http://pan.baidu.com/s/1qWBdV0C 介绍:本教程是国内唯一的Swift版的Spritekit教程.本教程基于Xcode 6.1+iOS 8.1开发环境,采用Swift语言,详细讲解Sprite Kit游戏开发的各种知识,帮助读者尽快iOS游戏开发的技能. 目录 第7章  音频和视频 1 7.1  背景音乐 1 7.1.1  添加背景音乐 1 7.1.2  控制背景音乐 5 7.1.3  设置音乐

iOS游戏框架Sprite Kit基础教程——Swift版上册

iOS游戏框架Sprite Kit基础教程--Swift版上册 试读下载地址:http://pan.baidu.com/s/1qWBdV0C  介绍:本教程是国内唯一的Swift版的Spritekit教程.本教程基于Xcode 6.1+iOS 8.1开发环境,采用Swift语言,详细讲解Sprite Kit游戏开发的各种知识,帮助读者尽快iOS游戏开发的技能. 目录 目  录 第1章  编写第一个Sprite Kit程序 1 1.1  Sprite Kit介绍 1 1.1.1  什么是Sprit