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

news/2024/11/28 1:37:04/

有限状态机应用是非常广泛的,比如关卡的切换、角色动画状态的切换等等,我自己写了个有限状态机,开发世嘉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

 


http://www.ppmy.cn/news/535665.html

相关文章

世嘉MD游戏开发【十一】:背景卷轴滚动(视差滚动)Parallax Scroll和摄像机

背景卷轴这个名字现在比较少听到了&#xff0c;现在的游戏引擎都不用这项技术了&#xff0c;或者可以轻松实现这个功能不值一提了&#xff0c;又或者不用这个技术照样也可以等等原因&#xff0c;大家基本听不到了。 玩过世嘉MD模拟器的可能对图层分层显示这个功能有印象&#…

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

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

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

上节课讲了如何显示一个Tile图块&#xff0c;这节课我来讲一下Tile图块的矩形填充。 打开Sega Genesis Tile Designer&#xff0c;设置tile宽度为4tiles&#xff0c;高度也是4tiles&#xff1a; 随便绘制几个tile块&#xff0c;下面我用我自己绘制的作为例子&#xff1a; 导出…

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

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

世嘉MD游戏开发进阶篇【一】:两点之间的距离

开发游戏免不了要计算两个坐标之间的距离&#xff0c;计算两点之间的距离我们可以用勾股定理&#xff0c;比如说A代表直角三角形的一条直角边&#xff0c;B代表另一条直角边&#xff0c;C代表斜边&#xff0c;得到公式ABC。C也就是两点之间的距离&#xff0c;根据公式可计算出C…

世嘉MD游戏开发【十】:精灵动画,Sprite Animation

能在世嘉MD上显示自己做的精灵动画实在是一件令人兴奋的事啊&#xff0c;今天就来讲一下如何在MD上显示精灵动画。 先准备好一张精灵图片序列&#xff0c;有这么几点要求&#xff1a; 1.单个精灵的像素宽x高不能超过16384&#xff0c;(以tile为单位的话&#xff0c;就是16x16…

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

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

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

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