rpgmaker吧 关注:13,293贴子:23,768
  • 7回复贴,共1

通过事件指令的脚本来实现的全键盘功能

只看楼主收藏回复

我想要在游戏中加入更多的按键操作,
在之前做好的那个游戏里(看我的头像)实现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,叫它把其他按键都搞进去。
一个脚本就可以了,不像第一个脚本需要每一个按键都一个独立的脚本。
最后,为了避免按键绑定的冲突,或许需要把第一张图片的这段代码都给注释掉。
记得在这个脚本的下面加上一个◆暂时消除事件,记得是并行执行。


IP属地:广东1楼2024-03-21 00:00回复
    这个是文心一言的截图,就是这么简易、明了的脚本。

    因为我问文心一言,你给出的这个脚本,会不会版权在百度或文心一言呢?
    然后它的回答就是那种正确到无懈可击的废话。
    我还跟文心一言说:
    我认为这些脚本是基础性的、通用性的,无版权的、普通的技术交流,这些脚本并没有什么独到的见解,也没有创新性的创造,更没有通过巧妙地构思来实现什么功能。只是把一小段基础代码的小功能,通过简单的堆叠而成的满足一个常用功能的较长的脚本而已。
    所以,所有人都可以无限制的自由使用。


    IP属地:广东2楼2024-03-21 00:28
    收起回复
      另外,还有下面这个脚本也是我给文心一言投喂了一些资料之后,
      再通过循循善诱的聊天给搞出来的脚本。
      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
      }));


      IP属地:广东3楼2024-03-21 10:55
      回复
        再后续测试中,发现上面这个一大堆按键都写在一起的脚本,
        如果是理想情况下的一次一次的按,
        以及在把按下之后要处理的指令处理完之前,继续按若干次这个按键,
        好像会因为多次呼叫这个指令而造成一些问题。
        --------------------------------------------------------------------------------------------------
        所以,需要处理持续按下和多次按下的问题。
        文心一言给出的改进版是下面这段,在其他按键那里,看需要添加其他按键就好了。
        // 创建一个对象来跟踪按键状态
        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楼说的说的需要在这个脚本的后面加上的◆暂时消除事件,
        以及打开这个脚本公共事件或事件页的开关、变量等的出现条件也没有必要关掉了。
        反正都是瞬间执行的指令,那么每一帧都在检测按键,
        每一帧都在执行事件指令也不会造成多次执行或连续执行的问题了。
        (好像是这样的吧,我不确定。要是遇到了问题,那就多测试,然后打补丁就好了。)


        IP属地:广东4楼2024-03-24 00:49
        回复
          好有趣的想法和经验,感谢分享


          IP属地:浙江来自Android客户端5楼2024-04-01 23:32
          回复