赞 | 55 |
VIP | 0 |
好人卡 | 0 |
积分 | 2 |
经验 | 0 |
最后登录 | 2025-8-26 |
在线时间 | 736 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 156
- 在线时间
- 736 小时
- 注册时间
- 2021-3-24
- 帖子
- 563
|
虽然不知道 你要干什么 看看AI怎么说吧
- /**
- * 检查玩家当前面向方向是否有可触发事件
- * @param {Array} triggers - 触发条件数组(如"接触时"、"与玩家正面接触"等触发类型)
- */
- Game_Player.prototype.checkEventTriggerThere = function(triggers) {
- // 判断是否允许启动本地事件(可能是地图特定的事件启用状态检查)
- if (this.canStartLocalEvents()) {
- // 获取玩家当前面向的方向(上、下、左、右)
- const direction = this.direction();
- // 玩家当前所在的坐标
- const x1 = this.x;
- const y1 = this.y;
- // 根据玩家方向计算正前方一格的坐标(x2,y2)
- const x2 = $gameMap.roundXWithDirection(x1, direction);
- const y2 = $gameMap.roundYWithDirection(y1, direction);
- // 尝试启动(x2,y2)位置符合触发条件的事件(最后一个参数true表示检查"正常优先级"事件)
- this.startMapEvent(x2, y2, triggers, true);
-
- // 如果当前没有事件正在启动,且(x2,y2)位置是"柜台"类型
- if (!$gameMap.isAnyEventStarting() && $gameMap.isCounter(x2, y2)) {
- // 计算柜台后方一格的坐标(穿过柜台再往前一格)
- const x3 = $gameMap.roundXWithDirection(x2, direction);
- const y3 = $gameMap.roundYWithDirection(y2, direction);
- // 尝试启动柜台后方(x3,y3)位置符合条件的事件
- this.startMapEvent(x3, y3, triggers, true);
- }
- }
- };
- /**
- * 启动指定坐标上符合条件的地图事件
- * @param {Number} x - 事件所在的x坐标
- * @param {Number} y - 事件所在的y坐标
- * @param {Array} triggers - 触发条件数组
- * @param {Boolean} normal - 是否检查"正常优先级"的事件
- */
- Game_Player.prototype.startMapEvent = function(x, y, triggers, normal) {
- // 如果当前没有事件正在运行(避免事件嵌套触发)
- if (!$gameMap.isEventRunning()) {
- // 遍历指定坐标(x,y)上的所有事件
- for (const event of $gameMap.eventsXy(x, y)) {
- // 检查事件是否包含目标触发条件,且优先级是否符合normal参数
- if (
- event.isTriggerIn(triggers) && // 事件的触发条件在目标triggers中
- event.isNormalPriority() === normal // 事件优先级与normal参数匹配
- ) {
- // 启动该事件
- event.start();
- }
- }
- }
- };
复制代码
运行原理分析
这两段代码是 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)的店员事件,触发购物交互。
通过这两个方法,引擎实现了玩家与地图事件的直观交互,确保事件在正确的时机和位置被触发。 |
|