Project1
标题: 监听键盘鼠标任意键按下的方法 [打印本页]
作者: War3Badboy 时间: 2018-12-31 23:03
标题: 监听键盘鼠标任意键按下的方法
记得十年前,我刚接触rmxp的时候,在贴吧还是哪里了问过一个沙雕问题,就是能不能“按键盘任意键”进入游戏啊?后来有大神告诉我“any key”是不行的,“press A”倒是可以,就是使用RGSS内置的Input模块trigger?方法,当时还不知道为什么。
十年后今天,我回头看rmxp自带的chm,才发现原因是内置的Input模块,对键盘检测只有Z、X、C等非常有限的键盘消息检测。而如果要实现全键盘包括鼠标的检测的话,可以调用Win32API。对应的键盘处理是在user32.dll这个动态库,对应头文件是WinUser.h(安装任意版本VS就会有这个windows SDK源文件),里面有成吨的RGSS做不到的功能包括现在我们想要的键盘检测功能,现在我们要用的是GetAsyncKeyState这个方法,代码如下:
getAsyncKeyState = Win32API.new('user32.dll', 'GetAsyncKeyState', 'i', 'i')
if (1...0xFF).any? {|i| getAsyncKeyState.call(i) != 0}
print("Any Key DOWN !")
# do sth...
end
getAsyncKeyState = Win32API.new('user32.dll', 'GetAsyncKeyState', 'i', 'i')
if (1...0xFF).any? {|i| getAsyncKeyState.call(i) != 0}
print("Any Key DOWN !")
# do sth...
end
思路是在一个循环体内(比如是某个Scene类的主loop内)迭代1-0xFE的键盘码(1和前几个是鼠标相关键,最后一个0xFF系统保留,暂无意义),发现任何一个键有按下就触发某些逻辑。
如果要捕获所有键的按下事件,且对不同的按键精确处理,还可以这样:
getAsyncKeyState = Win32API.new('user32.dll', 'GetAsyncKeyState', 'i', 'i')
(1...0xFF).each do |i|
if getAsyncKeyState.call(i) != 0
case i
when 1, 2, 4
print("鼠标键")
when 0x30..0x39
print("数字键")
when 0x41..0x5A, 0x61..0x7A
print("字母键")
else
print("其他按键")
end
end
end
getAsyncKeyState = Win32API.new('user32.dll', 'GetAsyncKeyState', 'i', 'i')
(1...0xFF).each do |i|
if getAsyncKeyState.call(i) != 0
case i
when 1, 2, 4
print("鼠标键")
when 0x30..0x39
print("数字键")
when 0x41..0x5A, 0x61..0x7A
print("字母键")
else
print("其他按键")
end
end
end
作者: ppspssss 时间: 2019-1-8 10:29
之前就做过,全鍵盘加上for循環就能了,除了“按键盘任意键”进入游戏, 改鍵,钢琴 https://rpg.blue/thread-409618-1-1.html
作者: guoxiaomi 时间: 2019-1-9 20:26
本帖最后由 guoxiaomi 于 2019-1-9 20:37 编辑
255次调用会不会很耗时?
好像并不耗时,rmxp 100000 次调用 0.05s,而且我电脑上的ruby居然花了 0.5s ?
作者: MCCF 时间: 2019-1-9 20:46
哈哈学C++的时候,最喜欢用的就是这个函数。
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |