rpgmaker吧 关注:13,307贴子:23,804
  • 0回复贴,共1

rpgmaker全部按键都可以拿来使用的脚本

只看楼主收藏回复

之前我发了-----通过事件指令的脚本来实现的全键盘功能【rpgmaker吧】-----这个帖子
但是这个帖子说的好像是按下按键之后会连续执行,而不是按下之后只执行一次。
这个好像是Input.isPressed 和 Input.isRepeated 、 Input.isTriggered 甚至是Input.isLongPressed 这类的问题。
有兴趣的可以到developer点rpgmakerweb点com/rpg-maker-mz/Input.html这里使用浏览器翻译成中文后看一看。
也是类似于虚幻引擎的操作映射和轴映射这里的问题。

也就是说,在游戏里,通常人物的移动是按下按键之后就需要持续执行的轴映射,
人物的跳跃是按一次就执行一次的操作映射。

于是,前段时间我又到文心一言那里去叫它写脚本。只是,今天我才有闲心发这个帖子。
它这次写的脚本好像是按下的时候检测一次,按键弹起来的时候也检测一次,
打开开关和关闭开关好像可以控制调用事件页或公共事件来执行指令,好像也可以重置按键按下和弹起的检测。

let isQKeyTriggered = false; // 标记Q键是否被触发
// 监听keydown事件
window.addEventListener('keydown', function(event) {
// 将event.key转换为小写,然后进行比较
if (event.key.toLowerCase() === 'q' && !isQKeyTriggered) { // 只在Q键被按下且未被触发时执行
// 检查111号开关是否关闭
if (!$gameSwitches.value(111)) {
isQKeyTriggered = true; // 标记Q键为已触发
// 执行事件指令
$gameMessage.add("你按下了Q键");
// 打开111号开关
$gameSwitches.setValue(111, true);
}
}
});
// 监听keyup事件
window.addEventListener('keyup', function(event) {
// 仍然将event.key转换为小写进行比较
if (event.key.toLowerCase() === 'q' && isQKeyTriggered) { // 只在Q键被释放且已触发时执行
isQKeyTriggered = false; // 标记Q键为未触发
// 关闭111号开关,无论它之前的状态是什么
$gameSwitches.setValue(111, false);
}
});

上面这段是按下Q键的,想要哪个按键再复制一个,把Q和'q'替换一下就可以了。
引号里的Q好像是要小写才能起作用。
而且好像还是大小写的时候都可以正常检测到。

上面这个截图就不一样了,这个截图好像是只有在小写状态下才能检测到,
要写让大写状态下检测到的话,就要把'q'这里的q改成Q。
按理来说,这个脚本好像太不方便了,根本就没有存在的必要。
但是仔细一想的话,或许要检测玩家输入文字内容的时候,这种区分大小写的特性就刚好用得上了。
配合上输入文字的111_InputForm.js和MZ版的111_InputFormMZ.js
输入记录器 - InputRecorder.js、密码输入 - PasswordInput.js、MNKR 演员姓名随机更改 - MNKR_RandomActorNameMV.js、敌人名称输入屏幕显示 - MKR_InputEnemyName.js这几个插件也可以去试一试。

以上的这些,写到MZ版的脚本那里是可以的,因为MZ版的脚本框可以上下拉伸。
MV版的话,由于脚本框的大小有一个限制。
或许就需要把注释和空行给删除掉,或许还需要文心一言来简化或再次切分一个完整的脚本为两个需要配合的脚本了。。又或者是可以考虑一下写到插件那里去。

以下的这些,是把按键都集合到一起的,想要什么按键起作用就把哪个按键都写进去。。。好像也需要各自配合一个专属的开关给它。
要是觉得这个麻烦的话,可以去找一找输入键扩展 - MpiInputEx.js这个插件。
通过插件发布网站指向的插件下载页面,可以看到好像是2017年就发布了。但可能是这个插件有什么问题,好像是取消掉下载的点击框了。

// 创建一个对象来跟踪按键状态
const pressedKeys = {};
// 监听keydown事件
window.addEventListener('keydown', function(event) {
// 将event.key转换为小写,以便进行不区分大小写的比较
const key = event.key.toLowerCase();
// 检查按键是否已经被按下
if (!pressedKeys[key]) {
// 如果按键没有被按下,则设置它为已按下
pressedKeys[key] = true;
// 根据按键执行不同的操作
switch (key) {
case 'q':
// 检查111号开关是否关闭
if (!$gameSwitches.value(111)) {
// 执行事件指令
$gameParty.gainGold(100);
$gameMessage.add("你按下了Q键,增加100金币");
// 打开111号开关
$gameSwitches.setValue(111, true);
}
break;
case 'w':
// 对于W键的处理逻辑...
break;
case 'e':
// 对于E键的处理逻辑...
break;
case 'r':
// 对于R键的处理逻辑...
break;
// ... 可以继续添加其他按键的处理逻辑
}
}
});
// 监听keyup事件
window.addEventListener('keyup', function(event) {
// 将event.key转换为小写,以便进行不区分大小写的比较
const key = event.key.toLowerCase();
// 检查按键是否已经被按下(即它是否在pressedKeys中存在)
if (pressedKeys[key]) {
// 如果按键被按下,则设置它为未按下
pressedKeys[key] = false;
// 根据按键执行释放时的操作(如果需要的话)
switch (key) {
case 'q':
SceneManager.push(Scene_Save)
// 例如,关闭111号开关(无论它之前的状态是什么)
$gameSwitches.setValue(111, false);
break;
case 'w':
// 对于W键在释放时的处理逻辑...
break;
case 'e':
// 对于E键在释放时的处理逻辑...
break;
case 'r':
// 对于R键在释放时的处理逻辑...
break;
// ... 可以继续添加其他按键在释放时的处理逻辑
}
}
});

有兴趣去测试上面这段脚本的话,
可能会因为$gameMessage.add("你按下了Q键,增加100金币"); 遇到显示框文本框,SceneManager.push(Scene_Save)跳出存档界面之后,
后面会再一次的跳出文本框,这可能是因为没有点击右键、手动发出结束文本框的指令。
这应该是正常的,并不是这个脚本有问题。(我之所以加上跳出存档界面,是因为除了按下按键之后触发,还因为检测到弹起之后也可以触发。。这提供了更多的可选项、更多的自定义空间。。说不定还可以检测到按下几帧之后再触发,检测到弹起几帧之后再触发也是可以看一下有没有这个需求的。)
我还在Q键这里加入了$gameParty.gainGold(100);这个脚本,你可以到菜单界面那里去查看增加的金币是没有差错的。
为了更方便的测试,你可以使用LL_VariableWindow.js这个插件来实时的检测效果。像下面这样的设置,把脚本里的对话框删掉,再来测试会更直观看到效果。
◆插件指令:LL_VariableWindow, 显示窗口
:    :窗口编号 = 1
:    :変数 = 1
:    :X座標 = 408
:    :Y座標 = 60
:    :横幅 = 400
◆变量操作:#0001 查看金币的变量 = 金币


IP属地:广东1楼2024-05-07 02:38回复