Project1
标题:
请问如何用脚本语言判断玩家是否对该事件按下确定键?
[打印本页]
作者:
daizixie1
时间:
6 天前
标题:
请问如何用脚本语言判断玩家是否对该事件按下确定键?
RT 感谢大家
作者:
清澈淌漾
时间:
6 天前
虽然不知道 你要干什么 看看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)的店员事件,触发购物交互。
通过这两个方法,引擎实现了玩家与地图事件的直观交互,确保事件在正确的时机和位置被触发。
作者:
jack99zgp
时间:
5 天前
就是用方法套方法,写脚本呗,
Input.isTriggered('ok')&&$gameMap.eventIdXy($gameMap.roundXWithDirection($gamePlayer.x, $gamePlayer.direction()),$gameMap.roundYWithDirection($gamePlayer.y, $gamePlayer.direction()))
这就是获取点击时角色面前事件id
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1