设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 162|回复: 3

[讨论] 监听键盘鼠标任意键按下的方法

[复制链接]

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
80
在线时间
4 小时
注册时间
2006-10-4
帖子
12
发表于 2018-12-31 23:03:00 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
记得十年前,我刚接触rmxp的时候,在贴吧还是哪里了问过一个沙雕问题,就是能不能“按键盘任意键”进入游戏啊?后来有大神告诉我“any key”是不行的,“press A”倒是可以,就是使用RGSS内置的Input模块trigger?方法,当时还不知道为什么。

十年后今天,我回头看rmxp自带的chm,才发现原因是内置的Input模块,对键盘检测只有Z、X、C等非常有限的键盘消息检测。而如果要实现全键盘包括鼠标的检测的话,可以调用Win32API。对应的键盘处理是在user32.dll这个动态库,对应头文件是WinUser.h(安装任意版本VS就会有这个windows SDK源文件),里面有成吨的RGSS做不到的功能包括现在我们想要的键盘检测功能,现在我们要用的是GetAsyncKeyState这个方法,代码如下:

RUBY 代码复制打印
  1. getAsyncKeyState = Win32API.new('user32.dll', 'GetAsyncKeyState', 'i', 'i')
  2. if (1...0xFF).any? {|i| getAsyncKeyState.call(i) != 0}
  3.   print("Any Key DOWN !")
  4.   # do sth...
  5. end


思路是在一个循环体内(比如是某个Scene类的主loop内)迭代1-0xFE的键盘码(1和前几个是鼠标相关键,最后一个0xFF系统保留,暂无意义),发现任何一个键有按下就触发某些逻辑。

如果要捕获所有键的按下事件,且对不同的按键精确处理,还可以这样:
RUBY 代码复制打印
  1. getAsyncKeyState = Win32API.new('user32.dll', 'GetAsyncKeyState', 'i', 'i')
  2. (1...0xFF).each do |i|
  3.   if getAsyncKeyState.call(i) != 0
  4.     case i
  5.       when 1, 2, 4
  6.         print("鼠标键")
  7.       when 0x30..0x39
  8.         print("数字键")
  9.       when 0x41..0x5A, 0x61..0x7A
  10.         print("字母键")
  11.       else
  12.         print("其他按键")
  13.     end
  14.   end
  15. end

[动态]受到SailCat的挑战,被揍得晕头转向。 (打开TA的战斗卡片)

Lv3.寻梦者

梦石
0
星屑
4454
在线时间
406 小时
注册时间
2016-9-20
帖子
363
发表于 2019-1-8 10:29:36 | 显示全部楼层
之前就做过,全鍵盘加上for循環就能了,除了“按键盘任意键”进入游戏, 改鍵,钢琴 https://rpg.blue/thread-409618-1-1.html
回复 支持 反对

使用道具 举报

[动态]受到嘉神川の紫樱的挑战,成功击败了对方。 (打开TA的战斗卡片)

Lv4.逐梦者 (版主)

梦石
0
星屑
11479
在线时间
1413 小时
注册时间
2011-7-8
帖子
2213

开拓者

发表于 2019-1-9 20:26:37 | 显示全部楼层
本帖最后由 guoxiaomi 于 2019-1-9 20:37 编辑

255次调用会不会很耗时?
好像并不耗时,rmxp 100000 次调用 0.05s,而且我电脑上的ruby居然花了 0.5s ?
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

[动态]受到Hsi的挑战,成功击败了对方。 (打开TA的战斗卡片)

Lv3.寻梦者

梦石
0
星屑
2142
在线时间
210 小时
注册时间
2018-3-23
帖子
255
发表于 2019-1-9 20:46:00 | 显示全部楼层
哈哈学C++的时候,最喜欢用的就是这个函数。
遇见RM,如心头绽放出一种火花,那是灵感的火花,那是激情的火花,那是梦想的火花。视野开阔了,灵感爆棚了,梦想拉近了,那曾以为遥不可及的、游戏制作的世界突然展现在我的眼前。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:fux2@moe9th.com|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2019-5-22 13:14

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表