有限状态机应用是非常广泛的,比如关卡的切换、角色动画状态的切换等等,我自己写了个有限状态机,开发世嘉MD游戏的朋友可以用得到,对于解耦还是有点帮助的,不必挤在一个文件里。

没有学过MD游戏开发基础的可以翻看我写的基础篇教程。

C语言开发世嘉MD游戏-基础篇

https://blog.csdn.net/qq272508839/category_9528531.html

//=================================================

FSM.c文件代码如下:

#include <genesis.h>
#include "FSM.h"void initStateMgr(StateMgr *_stateMgr, u8 _stateCount)
{_stateMgr->preState = NULL;_stateMgr->curState = NULL;_stateMgr->stateList = MEM_alloc(sizeof(State) * _stateCount);for (u8 i = 0; i < _stateCount; i++){_stateMgr->stateList[i].ID = i;_stateMgr->stateList[i].enter = NULL;_stateMgr->stateList[i].stay = NULL;_stateMgr->stateList[i].exit = NULL;}_stateMgr->stateCount = _stateCount;
}void regStateEvent(StateMgr *_stateMgr, u8 _stateIndex, void (*_enter)(), void (*_stay)(), void (*_exit)())
{_stateMgr->stateList[_stateIndex].enter = _enter;_stateMgr->stateList[_stateIndex].stay = _stay;_stateMgr->stateList[_stateIndex].exit = _exit;
}void changeState(StateMgr *_stateMgr, u8 _stateIndex)
{if (_stateIndex < 0 || _stateIndex > _stateMgr->stateCount - 1)return;if (_stateMgr->stateList == NULL)return;if (_stateMgr->stateList[_stateIndex].enter == NULL)return;_stateMgr->preState = _stateMgr->curState;if (_stateMgr->preState != NULL && _stateMgr->preState->exit != NULL)_stateMgr->preState->exit();_stateMgr->curState = &(_stateMgr->stateList[_stateIndex]);if (_stateMgr->curState != NULL)_stateMgr->curState->enter();
}void updateState(StateMgr *_stateMgr)
{if (_stateMgr->curState != NULL)_stateMgr->curState->stay();
}

FSM.h头文件代码如下:

#ifndef _FSM_H_
#define _FSM_H_#include <genesis.h>typedef struct state
{u8 ID;void (*enter)(void);void (*stay)(void);void (*exit)(void);
} State;typedef struct statemgr
{u8 stateCount;State *preState;State *curState;State *stateList;
} StateMgr;//初始化状态管理,给_stateMgr分配内存
void initStateMgr(StateMgr *_stateMgr, u8 _stateCount);
//注册状态事件:enter,stay,exit
//_stateIndex是状态索引值
void regStateEvent(StateMgr *_stateMgr, u8 _stateIndex, void (*_enter)(), void (*_stay)(), void (*_exit)());
//改变状态
void changeState(StateMgr *_stateMgr, u8 _stateIndex);
//状态update
void updateState(StateMgr *_stateMgr);#endif

世嘉MD游戏开发进阶篇【二】:C语言实现有限状态机相关推荐

  1. 世嘉MD游戏开发进阶篇【三】:向量归一化的实现及应用

    向量归一化是非常有用的,游戏中经常能用到,就说大家都见过的,FC魂斗罗的敌人发射子弹就能用到了,敌人向玩家发射子弹首先要获取到向量,这个向量不能直接作为方向去用,必须要经过归一化处理才行,经过归一化处 ...

  2. 世嘉MD游戏开发进阶篇【四】:向量点乘的计算

    向量点乘有时候是很有用的,在Unity等游戏引擎里向量点乘都是自带函数的,直接调用就可以,但是在世嘉MD这种简陋的平台,什么运算都得自己去实现,向量点乘也不例外. 直接看公式: //如果是三维向量的话 ...

  3. 世嘉MD游戏开发【四】:输入控制(下)

    上一节讲了世嘉MD两种输入控制当中的一种,也是比较容易理解的一种,这一节讲一下剩下的这种控制方式:回调函数式. 建好文件夹,用vscode打开,新建main.c,依然是直觉一般的写下如下代码: #in ...

  4. 世嘉MD游戏开发【七】:绘制图片,drawImage

    这一期讲绘制图片. 上一期讲的是绘制tile,还要用那个不怎么好用的工具导出数组数据,很繁琐,这次就不用那个蹩脚的工具了,随便一个图片用photoshop处理一下就可以了,对于图片的要求有这么几点: ...

  5. 世嘉MD游戏开发【五】:显示Tile图块

    显示Tile图块,首先要有tile图块,这就要用到一个小工具了,叫Sega Genesis Tile Designer,软件界面如下: 看起来很复杂,其实自己亲自操作一下几分钟就能搞懂了,都是些很基础 ...

  6. 世嘉MD游戏开发【六】:矩形填充Tile图块

    上节课讲了如何显示一个Tile图块,这节课我来讲一下Tile图块的矩形填充. 打开Sega Genesis Tile Designer,设置tile宽度为4tiles,高度也是4tiles: 随便绘制 ...

  7. 世嘉MD游戏开发【三】:输入控制(上)

    这一节讲一下SGDK中的输入控制,SGDK提供了两种输入控制方式,一种是用回调函数接收输入信息,很自然的另一种就没有用回调函数了(貌似废话-.-!),成上下两节,这一节讲不用回调函数来接收输入信息. ...

  8. 世嘉MD游戏开发【九】:Sprite精灵

    终于讲到Sprite精灵了,我自己也很希望快点讲精灵,但是欲速则不达,自己要是还没研究透彻这个知识点就去讲下一个,感觉文章肯定是写不好的. 我用下图来做演示,SFC幽游白书-魔界最强列传里的雷禅: 怎 ...

  9. 世嘉MD游戏开发【八】:淡入和淡出

    淡入淡出,很好理解,淡入就是画面由黑过渡到彩色,淡出就是画面由彩色过渡到黑色,其实也不一定必须是黑色,看你自己需求了. 注:淡入淡出的功能可以完成非常多的游戏玩法设计哦~打开脑洞就有惊喜~ 效果图如下 ...

  10. 【游戏开发进阶】教你Unity通过Jenkins实现自动化打包,打包这种事情就交给策划了(保姆级教程 | 命令行打包 | 自动构建)

    文章目录 一.前言 二.Jenkins简介 三.Jenkins的下载与安装 1.JDK下载与安装 2.Jenkins下载 3.Jenkins安装 4.Jenkins初始化 四.Jenkins的基本操作 ...

最新文章

  1. HTML5 canvas画图
  2. 1049. Counting Ones (30)
  3. linux内核 漏洞扫描,Linux kernel中存在15年的漏洞
  4. .net框架读书笔记---基础类型
  5. map的extract 是更换 map 的键而不重分配的唯一方式:
  6. 三字经带拼音a4打印版_人教版八年级下册英语6单元重点单词带音标打印版
  7. beautifulsoup_BeautifulSoup爬虫了解一下
  8. layui图片上传按钮按着没反应_关于layui动态生成文件上传按钮后点击无效的解决办法...
  9. 问题二十二:C++中怎么添加log开关
  10. MySQL OCP备考
  11. 13到21年蓝桥杯真题及解析
  12. 抽象代数基础教程(a first course in abstract algebra) 英文版 pdf下载
  13. IDEA2020版本下载、安装
  14. 黑苹果声卡HDA无声问题
  15. 百度ai开放平台体验
  16. WinForm中用C#实现左侧导航菜单(1)——概览
  17. AndroidSDK目录和源码目录详解
  18. linux usb网卡驱动 ko,qf9700 USB网卡在x86 linux和arm linux上的驱动安装以及配置
  19. 在C语言二级考试中编程题编译,二级C语言上机编程题
  20. 关于JavaWeb JSP的思维导图

热门文章

  1. 单网卡、单IP、双网关设置内外网同时访问
  2. 双网卡服务器实现内外网访问
  3. 如何将macOS应用程序打包为dmg文件
  4. 系统稳定性建设实践总结
  5. 【Python】利用MD5文件去重
  6. 【预测模型】基于粒子群算法优化最小二乘支持向量机lssvm实现预测附matlab源码
  7. shell脚本基础教程,快速上手
  8. IDEA 2020 配置Emmylua插件仍无法调试Lua代码问题
  9. FPGA综合项目——SDRAM控制器
  10. .net视频觉得做得最好的是天轰穿