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

Project1

 找回密码
 注册会员
搜索
查看: 93|回复: 2
打印 上一主题 下一主题

[有事请教] 请问如何用脚本语言判断玩家是否对该事件按下确定键?

[复制链接]

Lv2.观梦者

梦石
0
星屑
694
在线时间
26 小时
注册时间
2016-9-3
帖子
9
跳转到指定楼层
1
发表于 6 天前 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

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

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

x
RT 感谢大家

Lv3.寻梦者

梦石
0
星屑
3510
在线时间
410 小时
注册时间
2018-8-3
帖子
28
3
发表于 5 天前 | 只看该作者
就是用方法套方法,写脚本呗,
Input.isTriggered('ok')&&$gameMap.eventIdXy($gameMap.roundXWithDirection($gamePlayer.x, $gamePlayer.direction()),$gameMap.roundYWithDirection($gamePlayer.y, $gamePlayer.direction()))
这就是获取点击时角色面前事件id
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
156
在线时间
736 小时
注册时间
2021-3-24
帖子
563
2
发表于 6 天前 | 只看该作者
虽然不知道 你要干什么  看看AI怎么说吧


  1. /**
  2. * 检查玩家当前面向方向是否有可触发事件
  3. * @param {Array} triggers - 触发条件数组(如"接触时"、"与玩家正面接触"等触发类型)
  4. */
  5. Game_Player.prototype.checkEventTriggerThere = function(triggers) {
  6.     // 判断是否允许启动本地事件(可能是地图特定的事件启用状态检查)
  7.     if (this.canStartLocalEvents()) {
  8.         // 获取玩家当前面向的方向(上、下、左、右)
  9.         const direction = this.direction();
  10.         // 玩家当前所在的坐标
  11.         const x1 = this.x;
  12.         const y1 = this.y;
  13.         // 根据玩家方向计算正前方一格的坐标(x2,y2)
  14.         const x2 = $gameMap.roundXWithDirection(x1, direction);
  15.         const y2 = $gameMap.roundYWithDirection(y1, direction);
  16.         // 尝试启动(x2,y2)位置符合触发条件的事件(最后一个参数true表示检查"正常优先级"事件)
  17.         this.startMapEvent(x2, y2, triggers, true);
  18.         
  19.         // 如果当前没有事件正在启动,且(x2,y2)位置是"柜台"类型
  20.         if (!$gameMap.isAnyEventStarting() && $gameMap.isCounter(x2, y2)) {
  21.             // 计算柜台后方一格的坐标(穿过柜台再往前一格)
  22.             const x3 = $gameMap.roundXWithDirection(x2, direction);
  23.             const y3 = $gameMap.roundYWithDirection(y2, direction);
  24.             // 尝试启动柜台后方(x3,y3)位置符合条件的事件
  25.             this.startMapEvent(x3, y3, triggers, true);
  26.         }
  27.     }
  28. };

  29. /**
  30. * 启动指定坐标上符合条件的地图事件
  31. * @param {Number} x - 事件所在的x坐标
  32. * @param {Number} y - 事件所在的y坐标
  33. * @param {Array} triggers - 触发条件数组
  34. * @param {Boolean} normal - 是否检查"正常优先级"的事件
  35. */
  36. Game_Player.prototype.startMapEvent = function(x, y, triggers, normal) {
  37.     // 如果当前没有事件正在运行(避免事件嵌套触发)
  38.     if (!$gameMap.isEventRunning()) {
  39.         // 遍历指定坐标(x,y)上的所有事件
  40.         for (const event of $gameMap.eventsXy(x, y)) {
  41.             // 检查事件是否包含目标触发条件,且优先级是否符合normal参数
  42.             if (
  43.                 event.isTriggerIn(triggers) &&  // 事件的触发条件在目标triggers中
  44.                 event.isNormalPriority() === normal  // 事件优先级与normal参数匹配
  45.             ) {
  46.                 // 启动该事件
  47.                 event.start();
  48.             }
  49.         }
  50.     }
  51. };
复制代码

运行原理分析
这两段代码是 RPG Maker(或类似 2D 游戏引擎)中玩家与地图事件交互的核心逻辑,主要用于实现 "玩家面向某个方向时触发对应位置事件" 的功能,具体运行原理如下:
1. 整体协作关系
checkEventTriggerThere 负责检测玩家面向方向的事件位置(包括特殊的 "柜台" 场景),startMapEvent 负责实际启动符合条件的事件,两者协作完成 "玩家交互→事件触发" 的流程。
2. checkEventTriggerThere 的核心逻辑
前提检查:通过 canStartLocalEvents() 判断当前是否允许触发事件(例如某些场景可能禁用事件)。
计算交互位置:
先获取玩家当前坐标(x1,y1)和面向方向(上 / 下 / 左 / 右)。
通过 roundXWithDirection 和 roundYWithDirection 计算玩家正前方一格的坐标(x2,y2)—— 这是最常见的交互位置(例如玩家面对 NPC 时,NPC 在 x2,y2)。
基础事件触发:调用 startMapEvent 尝试启动(x2,y2)位置的事件。
柜台特殊处理:
如果(x2,y2)是 "柜台"(如商店柜台),且当前没有事件正在运行,会额外计算柜台后方一格的坐标(x3,y3)。
再调用 startMapEvent 启动(x3,y3)的事件 —— 这是为了实现 "玩家站在柜台前,实际与柜台后的店员交互" 的场景。
3. startMapEvent 的核心逻辑
防冲突检查:通过 !$gameMap.isEventRunning() 确保当前没有其他事件正在运行,避免事件嵌套触发导致的逻辑混乱。
事件筛选与启动:
遍历目标坐标(x,y)上的所有事件(一个位置可能有多个事件)。
检查事件的触发条件是否在 triggers 数组中(例如 "与玩家正面接触时触发"),且事件优先级是否符合 normal 参数(RPG Maker 中事件优先级分 "正常" 和 "下面",用于控制事件是否会遮挡玩家)。
符合条件的事件会被 event.start() 启动(例如显示对话、执行动作等)。
4. 实际游戏场景举例
当玩家走向一个 NPC 并面向他时,checkEventTriggerThere 会计算 NPC 所在的坐标(x2,y2),startMapEvent 会启动该 NPC 的事件(如对话)。
当玩家站在商店柜台前(柜台在 x2,y2),checkEventTriggerThere 会额外检测柜台后方(x3,y3)的店员事件,触发购物交互。

通过这两个方法,引擎实现了玩家与地图事件的直观交互,确保事件在正确的时机和位置被触发。
全家活光光~
回复 支持 反对

使用道具 举报

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

本版积分规则

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

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2025-8-26 16:33

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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