这一节讲一下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 = 80
u16 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