欢迎光临散文网 会员登陆 & 注册

梦开始的地方——FC游戏开发指南(3)引擎循环

2021-10-12 15:41 作者:皮皮关做游戏  | 我要投稿

(本系列是一个回归电子游戏原点的特别系列,作者 @goodorc_gamedev

本节介绍FC的游戏主循环编写方法。

首先说明,任何实时刷新画面的电子游戏,都有一个亘古不变的循环流程:

游戏引擎循环

无论什么游戏引擎,UE也好,Unity也好,都需要按上图进行每一帧的流程。

咱们的FC当然也不例外,也必须符合上图的原则。

1、FC主循环

有趣的地方在于——FC本身没有引擎层,就像一张白纸没有任何要求,我们可以随意搞一个while循环来代替引擎循环。返璞归真的感觉。

我改动了示例工程《移动》并加了一些注释。




对速度很快的现代电脑来说,在循环中应该有某种时间控制机制。

FC的CPU很慢,恰好是每扫描一行执行一条指令,所以可以用更简单的方式控制游戏速度,比如写个空循环。

有了引擎循环,循环中要考虑几件事:输入,逻辑,渲染,帧时间控制

输入需要研究FC手柄原理,逻辑可以直接写C语言代码,渲染是半自动的暂时不用考虑,时间控制也需要研究FC计时机制。

好在不用那么麻烦,“FC游戏大师”提供的项目里已经写好了大部分基础功能。

2、引入常用代码库

“FC游戏大师”里的《迷宫不迷》示例工程已经做出了很好的示范,所有基本功能全写到了"mylib.c"源文件中,将该工程的"mylib.c"文件拷贝到移动工程里就能直接用了。

拷贝到工程目录以后,在"移动.c"源码中包含它,之前的<conio.h>不需要了。




3、输入逻辑

接下来演示手柄输入怎么写。




运行后可以按方向键移动文字,但是由于旧的位置不清除,试验效果如图:

代码重点:

  1. u8就是unsigned char,8位,取值范围0~255。

  2. 输入相关的两个变量名为key和okey,它们的用法都是固定的。

  3. 上面的代码中,X轴是连续输入,Y轴是按一下动一下,看看写法有什么不同。(和Unity写法是类似的)

  4. 每一帧结尾okey被赋值,如果okey忘了赋值那么判断downkey的功能会出问题。

  5. 相对正确的延迟一帧方法:wait_VBlank()。 它一样是让CPU进行死循环,但是当PPU状态变化(代表一帧结束)就跳出循环。

这样,一个麻雀虽小,五脏俱全的游戏循环就写好了。

当然,一般的游戏会有一个开始界面、一个GameOver界面,一般做成独立场景。

有多个场景,想切换场景怎么办呢?最简单的办法:再加一个while循环就行,游戏主循环未必只能有一个,怎么方便怎么写。

只不过切换场景的时候要关闭显示、切换背景。这块的内容以后再说。

4、补充:输入详解

FC手柄有8个按钮:上下左右,选择暂停,AB。为什么上面只用一个u8 key 变量就够了呢?

因为FC的硬件设计就是用8个bit,也就是8位来表示这8个按键的,正好用一个u8变量装下。判断某个键要用二进制技巧。如果想深入了解,可以看mylib.c中downkey的具体写法。

换句话说,FC手柄想加一个键都不容易,从硬件层面基本都定死了。


本期文章介绍了游戏主循环与手柄输入,下次介绍显示背景的方法。

(本文作者 @goodorc_gamedev 。欢迎加入游戏开发群:1082025059

对游戏开发感兴趣的童鞋可去到这里进一步了解:http://www.levelpp.com/)



梦开始的地方——FC游戏开发指南(3)引擎循环的评论 (共 条)

分享到微博请遵守国家法律