Project1

标题: [已解决]实现用键盘打开/关闭更多菜单 [打印本页]

作者: 夏的66rpg    时间: 2019-4-4 05:33
标题: [已解决]实现用键盘打开/关闭更多菜单
本帖最后由 夏的66rpg 于 2019-4-5 22:06 编辑

我知道YEP_KeyboardConfig可以实现打开/关闭菜单,但是如果我想实现Q键,打开/关闭任务列表,I键打开/关闭物品窗口就没办法实现了,有什么插件可以搞定吗?

10L正解
作者: Fan723    时间: 2019-4-4 21:56
YEP有个按键调用公共事件插件,你将要执行的脚本写到公共事件里面就好了。
作者: 夏的66rpg    时间: 2019-4-4 23:46
Fan723 发表于 2019-4-4 21:56
YEP有个按键调用公共事件插件,你将要执行的脚本写到公共事件里面就好了。 ...

嗯,我只知道打开窗口的脚本,不会关闭窗口,而且就算知道了,也没办法做到用一个按键打开关闭
作者: Fan723    时间: 2019-4-5 10:04
关闭界面的指令是:
SceneManager.pop();

你可以用两个按键控制开关,如果非要用同一个也可以,
用条件分歧判断界面分开执行内容,条件分歧第四页输入脚本:
SceneManager._scene.constructor == Scene_Map;
这个是判断是否为地图界面,条件达成则执行进入菜单(你知道的脚本),
条件未达成则执行上面的关闭界面指令。
作者: 芯☆淡茹水    时间: 2019-4-5 13:28
以前想做ARPG时做过这个功能,剔出来后是下面这样:
  1. //====================================================================================================================
  2. ;var XdRsData = XdRsData || {};
  3. //====================================================================================================================
  4. // 下面添加快捷键与对应的场景。格式: 键盘键值:场景名
  5. XdRsData.options = {
  6.     73:Scene_Item,
  7.     85:Scene_Equip
  8. };
  9. //====================================================================================================================
  10. XdRsData.optionsKeys = Object.keys(XdRsData.options);
  11. XdRsData.optionsKeys.forEach(function(key){ Input.keyMapper[key] = 'shortcutKey' + key; });
  12. //====================================================================================================================
  13. Scene_Base.prototype.isSceneMap = function() {
  14.     return this.constructor === Scene_Map;
  15. };
  16. Scene_Base.prototype.isLeisure = function() {
  17.     return this.isActive() && this.isReady() && !this.isBusy();
  18. };
  19. Scene_Base.prototype.selfShortcutKey = function() {
  20.     return XdRsData.optionsKeys.filter(this.isSelfShortcutKey.bind(this)).shift();
  21. };
  22. Scene_Base.prototype.isSelfShortcutKey = function(key) {
  23.     return XdRsData.options[key] === this.constructor;
  24. };
  25. XdRsData.optionsSBupdate = Scene_Base.prototype.update;
  26. Scene_Base.prototype.update = function() {
  27.     XdRsData.optionsSBupdate.call(this);
  28.     this.updateShortcutKeyExit();
  29. };
  30. Scene_Base.prototype.updateShortcutKeyExit = function() {
  31.     if (this.isSceneMap() || !this.isLeisure()) return;
  32.     var key = this.selfShortcutKey();
  33.     if (key && Input.isTriggered('shortcutKey' + key)){
  34.         SoundManager.playCancel();
  35.         this.popScene();
  36.     }
  37. };
  38. //====================================================================================================================
  39. XdRsData.optionsSMupdateScene = Scene_Map.prototype.updateScene;
  40. Scene_Map.prototype.updateScene = function() {
  41.     XdRsData.optionsSMupdateScene.call(this);
  42.     !SceneManager.isSceneChanging() && this.updateKeyboardShortcuts();
  43. };
  44. Scene_Map.prototype.updateKeyboardShortcuts = function() {
  45.     for (var i=0;i<XdRsData.optionsKeys.length;i++) {
  46.         var key = XdRsData.optionsKeys[i];
  47.         if (Input.isTriggered('shortcutKey' + key) && XdRsData.options[key] !== this.constructor) {
  48.             SoundManager.playOk();
  49.             SceneManager.push(XdRsData.options[key]);
  50.         }
  51.     }
  52. };
  53. //====================================================================================================================
复制代码


在代码里面设置更多的场景,需要注意的是:
1, 如果 Input 本身以前含有某个键值, 如果再设置相同的键值,以前的键位会被替换并无效。
2, 脚本排除了 地图场景 ,设置地图场景的快捷键开/闭无效。
作者: 夏的66rpg    时间: 2019-4-5 13:30
芯☆淡茹水 发表于 2019-4-5 13:28
以前想做ARPG时做过这个功能,剔出来后是下面这样:

嗯~非常感谢!
作者: 夏的66rpg    时间: 2019-4-5 13:31
Fan723 发表于 2019-4-5 10:04
关闭界面的指令是:
SceneManager.pop();

嗯,好的,我试试,我就是不知道怎么判断呢,谢谢!
作者: 夏的66rpg    时间: 2019-4-5 14:35
芯☆淡茹水 发表于 2019-4-5 13:28
以前想做ARPG时做过这个功能,剔出来后是下面这样:


XdRsData.options = {
    73:Scene_Item,
    85:Scene_Equip
};
只用自己设置这里面的内容吗?我实验了几次,好像进游戏后没有效果呢
作者: 夏的66rpg    时间: 2019-4-5 14:54
Fan723 发表于 2019-4-5 10:04
关闭界面的指令是:
SceneManager.pop();

好像无法做到这一点,因为YEP_KeyboardConfig貌似只能在地图界面调用公共事件....
作者: 芯☆淡茹水    时间: 2019-4-5 20:43
本帖最后由 芯☆淡茹水 于 2019-4-5 20:48 编辑

上边的遗漏了一个比较大的问题,角色在不能移动时也能打开界面。
因为放太久了,自己都快忘了。

至于设置,就依照格式添加在脚本里就行了。 键盘键值可以百度(十进制), 至于对应的场景, 就写这个场景的 代码名 ,
比如想把 T 键设置为 任务界面 的快捷键, 比如 任务界面 代码名 为 Scene_Task , 键盘T键 十进制键值为 84 ,
那么就在设置的地方往下再加上去:

XdRsData.options = {
    73:Scene_Item,
    85:Scene_Equip,
    84:Scene_Task
};

想不要哪条也可以随意删,。

JAVASCRIPT 代码复制
  1. //====================================================================================================================
  2. ;var XdRsData = XdRsData || {};
  3. //====================================================================================================================
  4. // 下面添加快捷键与对应的场景。格式: 键盘键值:场景名
  5. XdRsData.options = {
  6.     73:Scene_Item,
  7.     85:Scene_Equip
  8. };
  9. //====================================================================================================================
  10. XdRsData.optionsKeys = Object.keys(XdRsData.options);
  11. XdRsData.optionsKeys.forEach(function(key){ Input.keyMapper[key] = 'shortcutKey' + key; });
  12. //====================================================================================================================
  13. Scene_Base.prototype.isSceneMap = function() {
  14.     return this.constructor === Scene_Map;
  15. };
  16. Scene_Base.prototype.isLeisure = function() {
  17.     return this.isActive() && this.isReady() && !this.isBusy();
  18. };
  19. Scene_Base.prototype.selfShortcutKey = function() {
  20.     return XdRsData.optionsKeys.filter(this.isSelfShortcutKey.bind(this)).shift();
  21. };
  22. Scene_Base.prototype.isSelfShortcutKey = function(key) {
  23.     return XdRsData.options[key] === this.constructor;
  24. };
  25. XdRsData.optionsSBupdate = Scene_Base.prototype.update;
  26. Scene_Base.prototype.update = function() {
  27.     XdRsData.optionsSBupdate.call(this);
  28.     this.updateShortcutKeyExit();
  29. };
  30. Scene_Base.prototype.updateShortcutKeyExit = function() {
  31.     if (this.isSceneMap() || !this.isLeisure()) return;
  32.     var key = this.selfShortcutKey();
  33.     if (key && Input.isTriggered('shortcutKey' + key)){
  34.         SoundManager.playCancel();
  35.         this.popScene();
  36.     }
  37. };
  38. //====================================================================================================================
  39. XdRsData.optionsSMupdateScene = Scene_Map.prototype.updateScene;
  40. Scene_Map.prototype.updateScene = function() {
  41.     XdRsData.optionsSMupdateScene.call(this);
  42.     this.canOperateShortcutKey() && this.updateKeyboardShortcuts();
  43. };
  44. Scene_Map.prototype.updateKeyboardShortcuts = function() {
  45.     for (var i=0;i<XdRsData.optionsKeys.length;i++) {
  46.         var key = XdRsData.optionsKeys[i];
  47.         if (this.isShortcutKeyOperated(key)) {
  48.             SoundManager.playOk();
  49.             SceneManager.push(XdRsData.options[key]);
  50.         }
  51.     }
  52. };
  53. Scene_Map.prototype.canOperateShortcutKey = function() {
  54.     if (SceneManager.isSceneChanging()) return false;
  55.     return $gamePlayer.canMove();
  56. };
  57. Scene_Map.prototype.isShortcutKeyOperated = function(key) {
  58.     if (XdRsData.options[key] === this.constructor) return false;
  59.     return Input.isTriggered('shortcutKey' + key);
  60. };
  61. //====================================================================================================================

作者: 夏的66rpg    时间: 2019-4-5 22:02
芯☆淡茹水 发表于 2019-4-5 20:43
上边的遗漏了一个比较大的问题,角色在不能移动时也能打开界面。
因为放太久了,自己都快忘了。

嗯嗯,好的,谢谢




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1