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

news/2024/11/28 2:55:26/

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

配置环境就不讲了,前面已经讲过了,没看的可以翻看一下。

打开vscode,建好文件夹,新建main.c直接撸好以下代码,就像直觉一样:

#include <genesis.h>int main()
{while (1){VDP_waitVSync();}return 0;
}

前面没有讲这个while循环是什么意思,在这里补充一下,如果没有while循环,即使你写了显示某些信息的代码,也只会一闪而过,然后就是黑屏,写过控制台的都知道这个事情了,不用做多解释。

要说接受输入控制呢,就不得不介绍一下手柄的键值,没有键值就无法知道按的是哪个键了嘛,直接看下图:

代码中都是用十进制的整数表示的,前面的16进制不看也罢,了解一下也无妨,重点是后面我写的注释,更加的一目了然。

看到这几个常量很自然的我们就会想问哪个函数会返回这些个数值呢?看下面的api解释:

u16  JOY_readJoypad(u16 joy);*  \简介*      获取手柄状态.**  \参数 joy*      我们需要查询的手柄端口:1P,2P,3P,4P... ...*      1P:JOY_1*      2P:JOY_2*      3P:JOY_3*      依次类推... ...最多到8P,也可以写JOY_ALL,就是所有的手柄。*      8P只有在连接两个手柄4分插的时候才有效,4分插这东西淘宝可不便宜,属于天价理财产品。*      具体内容可以看joy.h头文件里面的描述。*  \返回值 u16是SGDK自己定义的类型,实际是unsigned short*      BUTTON_UP    *      BUTTON_DOWN  *      BUTTON_LEFT  *      BUTTON_RIGHT *      BUTTON_A    *      BUTTON_B*      BUTTON_C*      BUTTON_START *      BUTTON_X     *      BUTTON_Y     *      BUTTON_Z     *      BUTTON_MODE  

知道这个函数以后那就很好办了,相信不用我说大家都已经想到了,直接看代码吧:

#include <genesis.h>int main()
{while (1){//接收键值,返回值是所有1P按键返回值的和,A键是64,B键是16,那么同时按下AB,key = 80u16 key = JOY_readJoypad(JOY_1);//新建一个数组用来存放字符串char msg[40] = {0};//把键值转成字符串存到msg数组中sprintf(msg, "total key = %4d", key);//在屏幕上的(1,1)位置打印出键值(这里的位置不是像素的位置,而是以8x8为一个单位划分成若干网格的位置)VDP_drawText(msg, 1, 1);//这里的 & 简单解释一下,二进制按位与,(0 & 任意数)都是0,(64 & 64)还是64,(其他键值 & 64)是0,//64用二进制表示是 0100 0000//         &运算 0100 0000  (上下两个数都是1才是1,其他都是0)//----------------------------//        结果: 0100 0000//如果BUTTON_A 的值是64,if (key & BUTTON_A){//按下了A键VDP_drawText("pressed A button.", 1, 2);}else{//没按A键,清空屏幕上的 "pressed A button."VDP_clearText(1, 2, 40);}if (key & BUTTON_B){//按下了B键VDP_drawText("pressed B button.", 1, 3);}else{VDP_clearText(1, 3, 40);}if (key & BUTTON_C){//按下了C键VDP_drawText("pressed C button.", 1, 4);}else{VDP_clearText(1, 4, 40);}}VDP_waitVSync();return 0;
}

Ctrl+Shift+B编译一下,运行结果如下图:

什么都不按,total key = 0;

ABC都按下,total key = 64+16+32 = 112

剩下的也没有什么好说的了,没有比代码更加直观的了,要是有的话那就是自己亲自去写一下运行一下了。

未完待续。。。

复古游戏开发群:879063892


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

相关文章

世嘉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; 怎么处理图…

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

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

世嘉MD游戏开发【十二】:伪3D地面,Pseudo-3D

终于讲到伪3D效果了&#xff0c;这一块比较棘手&#xff0c;我从github上下载的老外写的例子一点点研究&#xff0c;研究了两三天才研究出原理&#xff0c;其实原理很TM简单&#xff0c;主要是那个老外写的代码太烂了&#xff0c;写了很多没用的东西&#xff0c;而且算法上还啰…