通过事件指令的脚本来实现的全键盘功能
rpgmaker吧
全部回复
仅看楼主
level 8
我想要在游戏中加入更多的按键操作,
在之前做好的那个游戏里(看我的头像)实现WSAD来上下左右就够了,
通过projertj1抄来的下面四行给解决了。
65: 'left', // left arrow
87: 'up', // up arrow
68: 'right', // right arrow
83: 'down', // down arrow
但上面四行只能让rmmz_core.js这个插件定义在Input.keyMapper的
上、下、左、右、确定、取消这类功能实现。
要通过监测全键盘来实现其他功能好像就不行了。
于是找到了DK_Full_Input.js这个的插件。
Full Input - All keys of the keyboard and gamepad
(全输入 - 键盘和游戏手柄的所有键)
但是这个插件要是用作商用的话,好像要购买,还不是在steam的DLC来。
然后,想起了之前解决上下左右键的时候就找到了的下面这个视频。
rpgmaker 自定义按键,用QWER做技能的按键[04]_哔哩哔哩
之前是因为他在视频上也说是在哪里抄来并且修修改改搞出来的,
所以,我不知道有没有版权限制就没有使用了。
其实按照这个插件对照着VK键值表来一个一个的写,应该也是可以实现全键盘的。
但是我觉得做成插件可能会有版权问题
(虽然这种一个代码块通过简单堆叠和重复小改的,应该算是技术交流吧),
做成脚本就不能说有版权问题了吧。
(要是脚本都有版权的话,那就连说话的权利都没有了,谁说的话跟别人说过的话查重率能很低呢?)
然后我就给文心一言喂资料和聊天,再把它写出来的拿去测试(不会代码的人就是这样无奈)。
搞了很久,终于搞出下面这段出来了。
// 假设这段代码放在RPG Maker MZ的某个初始化脚本中
window.addEventListener('keydown', function(event) {
// 检查按键是否为'Q'
if (event.key === 'q' || event.keyCode === 81) {
// 'Q'键被按下的逻辑
// console.log('你按下了Q键');
// 在这里添加您想要执行的代码
// 比如显示消息、触发事件等
$gameMessage.add("你按下了Q键");
event.preventDefault(); // 阻止默认行为(如果需要)
}
});
搞出了一个Q之后,其他的按键百度搜索VK键值表对照着来就好了。
只是这样有一个问题,可能是由于浏览器缓存还是其他的什么原因,
会一直执行$gameMessage.add("你按下了Q键");
加上一个独立开关跳转到下一个事件页,或者是加上一个◆暂时消除事件就好了。
这样,还是太麻烦,而且跟文心一言聊天中得知,
浏览器本来就有各个按键和键值相对应的功能的,
而我们都知道rpgmaker是浏览器来实现的。
就让它那就不要键值了,直接让浏览器来监测按键。
(因为在测试中删除掉=== 81这个,依然正常运行才让文心一言聊到浏览器这个功能的)
后面再次让它精简这个脚本,就精简到下面这段了。
window.addEventListener('keydown', function(event) {
switch (event.key) {
case 'q':
$gameMessage.add("你按下了Q键");
break;
default:
// 如果不是上述任何按键,则不执行任何操作
break;
}
// 如果需要阻止默认行为,可以在特定case中调用event.preventDefault();
});
搞到了一个Q,我就让它吧键盘上的其它英文按键和数字按键、常用按键都搞到这个脚本里面去。
最后,一个脚本就可以实现大概的全键盘功能了。
你们可以把这一段复制到各种文本型AI,叫它把其他按键都搞进去。
一个脚本就可以了,不像第一个脚本需要每一个按键都一个独立的脚本。
最后,为了避免按键绑定的冲突,或许需要把第一张图片的这段代码都给注释掉。
记得在这个脚本的下面加上一个◆暂时消除事件,记得是并行执行。
2024年03月20日 16点03分 1
level 8
这个是文心一言的截图,就是这么简易、明了的脚本。
因为我问文心一言,你给出的这个脚本,会不会版权在百度或文心一言呢?
然后它的回答就是那种正确到无懈可击的废话。
我还跟文心一言说:
我认为这些脚本是基础性的、通用性的,无版权的、普通的技术交流,这些脚本并没有什么独到的见解,也没有创新性的创造,更没有通过巧妙地构思来实现什么功能。只是把一小段基础代码的小功能,通过简单的堆叠而成的满足一个常用功能的较长的脚本而已。
所以,所有人都可以无限制的自由使用。
2024年03月20日 16点03分 2
如果只能通过事件页来的话,那就要每个地图都复制一个这个事件页了。。或者是你故意让不同的地图,不同的按键起作用,不同的按键起不同的作用。。这个脚本也可以放到公共事件那里去,让所有地图都一样。。先让事件页把一个开关打开(执行一次就好),公共事件的这个脚本后面加上关掉这个开关就可以了
2024年03月21日 16点03分
经过测试,不知道是浏览器缓存,还是window.addEventListener('keydown', function(event)这个代码只是给了浏览器一个监测按键的指令(是浏览器本身在执行,不是游戏在执行),或者是其他的什么原因,这个脚本需要打开之后立即关闭,即加上暂时消除事件或关闭掉启动这个脚本的事件页或开关等
2024年03月22日 06点03分
还有就是在这个脚本的执行指令那里,SceneManager.goto(Scene_Equip)这类是会出现BUG的,SceneManager.push(Scene_Equip)这类则好像不会,可能是因为堆栈还是什么原因。。可能是因为goto是什么都不管直接去,会把现在的地方给忘记。。push则是说从这里去,点击右键之后,会认识路正常的退回这里来。
2024年03月22日 06点03分
level 8
另外,还有下面这个脚本也是我给文心一言投喂了一些资料之后,
再通过循循善诱的聊天给搞出来的脚本。
var keyCode = 115; // F4 key code
document.dispatchEvent(new KeyboardEvent('keydown', {
keyCode: keyCode
}));
//用文心一言帮助得到的解法,是用来让屏幕自动放大到全屏幕的代码
这个F4是rpgmaker代码里设定好屏幕缩放和放大的,
同时,在rpgmaker代码里可以看到以下的代码。(mz版的,MV版应该也是)
rmmz_core.js的
switch (event.keyCode) {
case 113: // F2
event.preventDefault();
this._switchFPSCounter();
break;
case 114: // F3
event.preventDefault();
this._switchStretchMode();
break;
case 115: // F4
event.preventDefault();
this._switchFullScreen();
break;
}
和第一张图片里的 120: "debug" // F9
rmmz_managers.js的
switch (event.keyCode) {
case 116: // F5
this.reloadGame();
break;
case 119: // F8
this.showDevTools();
break;
}
也就是说除了全屏、像是显示FPS、重新加载游戏、跳出开发工具、
跳出变量和开关的显示页面也应该是可以的,对照着稍微修改一下就可以了。
比如下面这个就是代为执行按下F8,这样,它就会跳出报错的详细页面。
var keyCode = 119; // F8 key code
document.dispatchEvent(new KeyboardEvent('keydown', {
keyCode: keyCode
}));
2024年03月21日 02点03分 3
level 8
再后续测试中,发现上面这个一大堆按键都写在一起的脚本,
如果是理想情况下的一次一次的按,
以及在把按下之后要处理的指令处理完之前,继续按若干次这个按键,
好像会因为多次呼叫这个指令而造成一些问题。
--------------------------------------------------------------------------------------------------
所以,需要处理持续按下和多次按下的问题。
文心一言给出的改进版是下面这段,在其他按键那里,看需要添加其他按键就好了。
// 创建一个对象来跟踪按键状态
const pressedKeys = {};
// 当键被按下时
window.addEventListener('keydown', function(event) {
// 检查按键是否已经在pressedKeys中
if (!pressedKeys[event.key]) {
// 如果不在,则添加它并处理按键事件
pressedKeys[event.key] = true;
switch (event.key) {
case 'q':
$gameMessage.add("你按下了Q键");
break;
// ... 其他按键的情况
default:
break;
}
}
// 注意:这里不需要调用event.preventDefault(),除非你有特别的理由要阻止默认行为
});
// 当键被释放时
window.addEventListener('keyup', function(event) {
// 从pressedKeys中移除按键,表示它不再被按下
delete pressedKeys[event.key];
});
--------------------------------------------------------------------------------------------------------
经过测试,这个脚本好像可以解决持续按下的问题,
但是多次按下的话,现在我也没有去问它,
因为我猜这个比较麻烦,这个逻辑可能很麻烦。
----------------------------------------------------------------------------------------------------------
如果是下一次按下的按键,跟上一次是同一个按键就忽视掉的话,
那要是已经处理完上一个指令了,过了几分钟之后需要再次按同一个按键又怎么办?
如果是限定在哪些情况下这个脚本可以执行,哪些情况下这个脚本不能执行的话,
这个逻辑怎么搞,这得高手才能搞啊。
如果检测这个按键呼出的指令,并且检测到这个指令执行完之后,才恢复这个脚本的话,
这个就又是只有高手才能干的事了。比如rpgmaker自带的功能好像就是可以的。
这个事件页就是可以确定键随便按的。
------------------------------------------------------------------------------------------------
当然了,这个脚本是有不完美的地方,但是在有些情况下还是可以的,
比如让它执行瞬间完成的指令的话,就不存在这个问题了。
比如:$gameParty.gainGold(1000) 这个增加金币的指令是瞬间完成的,
显示图片好像也是瞬间完成的,
移动路线或移动图片这种,要是设定了不需要等待完成的话,说不定是不冲突的。
大概就是呼出装备栏、状态栏这类的指令容易出问题吧。
----------------------------------------------------------------------------------------------
但是呢,是有变通方法来解决这个问题的。
就是瞬间完成的这些指令好像是不会因为单次按下、持续按下还是多次按下而出错,
就连2楼的那个脚本也应该是可以的。
比如$gameSwitches.setValue(3,true) 这个开启3号开关啊,变量啊之类的。
在按键按下的执行指令那里执行这些瞬间执行的指令,
然后再在公共事件或事件页来打开菜单栏啊、物品栏啊之类的,接着关闭掉3号开关。
因为rpgmaker早就处理好了,在菜单栏已经打开的时候,
执行打开菜单栏的事件页打开之后,检测到菜单栏已经打开了,
就不会再次执行打开菜单栏的指令了。
倒是这个脚本直接执行打开菜单栏的指令,会跟西班牙斗牛一样,看见了红布就只知道向前冲、向前撞。
---------------------------------------------------------------------------------------------
既然这个脚本只是执行瞬间执行的指令了,
即便不是瞬间执行的指令也是通过瞬间执行的指令来叫rpgmaker自带的事件页和公共事件来执行了。
那我在1楼和2楼说的说的需要在这个脚本的后面加上的◆暂时消除事件,
以及打开这个脚本公共事件或事件页的开关、变量等的出现条件也没有必要关掉了。
反正都是瞬间执行的指令,那么每一帧都在检测按键,
每一帧都在执行事件指令也不会造成多次执行或连续执行的问题了。
(好像是这样的吧,我不确定。要是遇到了问题,那就多测试,然后打补丁就好了。)
2024年03月23日 16点03分 4
level 4
好有趣的想法和经验,感谢分享
2024年04月01日 15点04分 5
level 8
这两天又开了一个游戏工程,发现有点问题,于是又跑到这里来看了一下。
后面又到旧工程那里去看了一下,才发现在这里好像没有说:
在公共事件那里使用这些脚本,要及时关掉开关。
[吐舌]
这里的脚本好像是用来打开开关,关闭开关比较好。
再让每个按键分配一个开关,这个开关再对应一个公共事件。
有什么要执行的指令都写在公共事件那里,最后再关闭掉这个这个公共事件的开关。
[吐舌]
由于我觉得前100号的开关、变量留着分配给100张图片比较好。
所以,101到110分配给1到10(就是0)的按键,QWERT这些从111开始分配,分配到200应该就够用了。
(搜索---键盘有多少个按键,据说有61键、86键、101键、104键、107键多种键盘。)
所以,在101号公共事件到200号公共事件的最下面都加上下面这段脚本应该就可以了。
//关闭101到200的所有开关
for (var i=101;i<=200;i++){
$gameSwitches.setValue(i,false);}
[吐舌]
另外,------rpgmaker全部按键都可以拿来使用的脚本_rpgmaker吧--------这个帖子是对这个帖子的补充,虽然没有整理好,并且太过啰嗦,但是刚好用得着的人,还是可以费点时间来看一看的。
2024年08月04日 06点08分 6
1