世嘉MD游戏开发进阶篇【二】:C语言实现有限状态机
有限状态机应用是非常广泛的,比如关卡的切换、角色动画状态的切换等等,我自己写了个有限状态机,开发世嘉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语言实现有限状态机相关推荐
- 世嘉MD游戏开发进阶篇【三】:向量归一化的实现及应用
向量归一化是非常有用的,游戏中经常能用到,就说大家都见过的,FC魂斗罗的敌人发射子弹就能用到了,敌人向玩家发射子弹首先要获取到向量,这个向量不能直接作为方向去用,必须要经过归一化处理才行,经过归一化处 ...
- 世嘉MD游戏开发进阶篇【四】:向量点乘的计算
向量点乘有时候是很有用的,在Unity等游戏引擎里向量点乘都是自带函数的,直接调用就可以,但是在世嘉MD这种简陋的平台,什么运算都得自己去实现,向量点乘也不例外. 直接看公式: //如果是三维向量的话 ...
- 世嘉MD游戏开发【四】:输入控制(下)
上一节讲了世嘉MD两种输入控制当中的一种,也是比较容易理解的一种,这一节讲一下剩下的这种控制方式:回调函数式. 建好文件夹,用vscode打开,新建main.c,依然是直觉一般的写下如下代码: #in ...
- 世嘉MD游戏开发【七】:绘制图片,drawImage
这一期讲绘制图片. 上一期讲的是绘制tile,还要用那个不怎么好用的工具导出数组数据,很繁琐,这次就不用那个蹩脚的工具了,随便一个图片用photoshop处理一下就可以了,对于图片的要求有这么几点: ...
- 世嘉MD游戏开发【五】:显示Tile图块
显示Tile图块,首先要有tile图块,这就要用到一个小工具了,叫Sega Genesis Tile Designer,软件界面如下: 看起来很复杂,其实自己亲自操作一下几分钟就能搞懂了,都是些很基础 ...
- 世嘉MD游戏开发【六】:矩形填充Tile图块
上节课讲了如何显示一个Tile图块,这节课我来讲一下Tile图块的矩形填充. 打开Sega Genesis Tile Designer,设置tile宽度为4tiles,高度也是4tiles: 随便绘制 ...
- 世嘉MD游戏开发【三】:输入控制(上)
这一节讲一下SGDK中的输入控制,SGDK提供了两种输入控制方式,一种是用回调函数接收输入信息,很自然的另一种就没有用回调函数了(貌似废话-.-!),成上下两节,这一节讲不用回调函数来接收输入信息. ...
- 世嘉MD游戏开发【九】:Sprite精灵
终于讲到Sprite精灵了,我自己也很希望快点讲精灵,但是欲速则不达,自己要是还没研究透彻这个知识点就去讲下一个,感觉文章肯定是写不好的. 我用下图来做演示,SFC幽游白书-魔界最强列传里的雷禅: 怎 ...
- 世嘉MD游戏开发【八】:淡入和淡出
淡入淡出,很好理解,淡入就是画面由黑过渡到彩色,淡出就是画面由彩色过渡到黑色,其实也不一定必须是黑色,看你自己需求了. 注:淡入淡出的功能可以完成非常多的游戏玩法设计哦~打开脑洞就有惊喜~ 效果图如下 ...
- 【游戏开发进阶】教你Unity通过Jenkins实现自动化打包,打包这种事情就交给策划了(保姆级教程 | 命令行打包 | 自动构建)
文章目录 一.前言 二.Jenkins简介 三.Jenkins的下载与安装 1.JDK下载与安装 2.Jenkins下载 3.Jenkins安装 4.Jenkins初始化 四.Jenkins的基本操作 ...
最新文章
- HTML5 canvas画图
- 1049. Counting Ones (30)
- linux内核 漏洞扫描,Linux kernel中存在15年的漏洞
- .net框架读书笔记---基础类型
- map的extract 是更换 map 的键而不重分配的唯一方式:
- 三字经带拼音a4打印版_人教版八年级下册英语6单元重点单词带音标打印版
- beautifulsoup_BeautifulSoup爬虫了解一下
- layui图片上传按钮按着没反应_关于layui动态生成文件上传按钮后点击无效的解决办法...
- 问题二十二:C++中怎么添加log开关
- MySQL OCP备考
- 13到21年蓝桥杯真题及解析
- 抽象代数基础教程(a first course in abstract algebra) 英文版 pdf下载
- IDEA2020版本下载、安装
- 黑苹果声卡HDA无声问题
- 百度ai开放平台体验
- WinForm中用C#实现左侧导航菜单(1)——概览
- AndroidSDK目录和源码目录详解
- linux usb网卡驱动 ko,qf9700 USB网卡在x86 linux和arm linux上的驱动安装以及配置
- 在C语言二级考试中编程题编译,二级C语言上机编程题
- 关于JavaWeb JSP的思维导图