Open dustpg opened 6 years ago
为什么我只能按一次,按完了就不能继续按了呢
@buzai
为什么我只能按一次,按完了就不能继续按了呢
这说法太笼统了,不过猜测是没有复位。简单地说就是按下去是 true
, 弹起来是 false
, 可以从这个方法着手检查
@dustpg 我是在osx,重新用 sdl2 实现了图像部分,其他部分都是直接复制的你的,但是我用clion 通过cmake build的
监控到按钮事件就调用的 user_input 函数,打印也有,不懂为啥第二次按下就不动了。
if (event.key.keysym.sym == SDLK_UP) { printf("SDLK_UP\n"); user_input(4, 1); }
@buzai
if (event.key.keysym.sym == SDLK_UP) { printf("SDLK_UP\n"); user_input(4, 1); }
这个只有1
啊, 项目中默认 user_input(index, msg == WM_KEYDOWN);
, windows中WM_KEYDOWN
是按下, WM_KEYUP
是弹起,
这里来看 应该user_input(index, event.type == SDL_KEYDOWN);
@dustpg 弄好了,谢谢🙏,果然是这里的问题。
STEP5: 手柄输入
为了让这个测试ROM能够通过, 我们加入手柄输入试试吧.
一般来说最少得有1个手柄, 不然只能看着马大叔被板栗弄死.
最高可支持4个手柄输入, 比如这个款游戏: 油管 - 4 Player Madness - RC PRO-AM 2 (NES)
但是是通过特殊装置接驳上去的.
标准输入
先支持普通双手柄吧, 最后完善测试再说其他情况.
Controller port registers
根据文档, NES(欧美版) 和 Famicom(日版) 存在区别:
同4人手柄, 扩展端口就直接...所以实现基本输入就行, 反正绝大数游戏都是支持的 —— 也就是最低位.
strobe(选通)乍一看! 还以为是string.h的一个函数... 对于这里输入来说, 是一种重置手段:
也就是说读取按钮状态应该这样:
READ重复8次(拥有8个按钮)
按钮序列如下:
读取大概就是这样:
写入大概这样:
黑匣子
之前提到用户输入的黑匣子函数, 现在详细说说.
用户输入时调用, index是0-15, 前面8个是手柄1, 后面8个是手柄2. 不过, 我记得二号手柄没有select/start键? 键盘映射如下:
输出效果
按下'I'键(Start)就能测试了. 历时这么久, 终于把基础指令测试通过了! 即便没有实现BRK和CLI!
同时, 也宣告着这个ROM的使命完成了. 感谢ROM作者kevtris.
这一节很简单! 主要当然只是实现了基本的输入而已. 项目地址Github-StepFC-Step5
作业
REF