Edit

自定义触发事件类别

自定义触发事件类别用于定义有哪些触发事件,以便制作者在这些事件页下编辑事件。

自定义触发事件类别用于定义有哪些触发事件,以便制作者在这些事件页下编辑事件。

触发事件可以在场景、场景对象、界面上设置类别。

比如当鼠标点击场景对象时会触发的一种事件:
而事件在什么地方执行或满足什么条件执行,需要自行设计和通过脚本实现。
通常情况下各种游戏模板中会利用此功能预置一些触发事件的类别以便使用模板的人打开该模板时即可直接使用。

alt text

可设置触发事件的地方

类别说明
场景事件与场景相关的绑定触发事件,比如进入场景事件
场景对象事件与场景对象相关的绑定触发事件,比如场景对象的点击事件、碰触事件
界面事件与界面相关的绑定触发事件,比如元件鼠标点击事件、鼠标悬停事件

实现触发场景事件

事件页储存:Scene::customCommandPages,通过索引记录相关事件页。

单机版相关代码示例1:

Script.ts
// 获取场景的第一种事件页:1-进入事件,索引为ID-1,所以这里使用的是0
var sceneCmdTypeIndex = 0;
// 获取事件页
var commandPageInScene = Game.currentScene.customCommandPages[sceneCmdTypeIndex];
// 获取事件页中命令数目
var inSceneCmdLength = commandPageInScene.commands.length;
// 如果命令数目大于0则执行
if (inSceneCmdLength > 0) {
  // 获取事件触发器:由玩家触发,执行者也是玩家
  var commandTriggerInScene = Game.player.sceneObject.getCommandTrigger(CommandTrigger.COMMAND_MAIN_TYPE_SCENE, sceneCmdTypeIndex, Game.currentScene, Game.player.sceneObject);
  // 监听一次事件执行,
  EventUtils.addEventListener(commandTriggerInScene, CommandTrigger.EVENT_OVER, Callback.New(() => {
      // 事件执行完毕时处理
  }, this, []), true);
  // 开始执行事件
  commandPageInScene.startTriggerEvent(commandTriggerInScene);
}

单机版相关代码示例2:GameCommand.startSceneCommand(事件类别索引);

Script.ts
// 执行场景事件:1-进入事件,索引为ID-1,所以这里使用的是0
GameCommand.startSceneCommand(0);

网络版相关代码示例: 以下在场景类中实现

Script.ts
// 获取场景的第一种事件页:1-进入事件,索引为ID-1,所以这里使用的是0
var sceneCmdTypeIndex = 0;
// 获取事件页
var commandPageInScene = this.customCommandPages[sceneCmdTypeIndex];
// 获取事件页中命令数目
var inSceneCmdLength = commandPageInScene.commands.length;
// 如果命令数目大于0则执行
if (inSceneCmdLength > 0) {
  // 获取事件触发器:由玩家触发,执行者也是玩家
  var commandTriggerInScene = player.sceneObject.getCommandTrigger(CommandTrigger.COMMAND_MAIN_TYPE_SCENE, sceneCmdTypeIndex, this, player.sceneObject);
  // 监听一次事件执行,
  EventUtils.addEventListener(commandTriggerInScene, CommandTrigger.EVENT_OVER, Callback.New((player: ServerPlayer) => {
      // 通知这个玩家的客户端,表示执行完毕
      this.sendToPlayer(player, "inSceneCommandExecuteOver", []);
  }, this, [player]), true);
  // 开始执行
  commandPageInScene.startTriggerEvent(commandTriggerInScene);
}

实现触发场景对象事件

GameCommand.d.ts
    /**
     * [场景对象-事件] 主动开始新触发该事件
     * @param sceneObjectIndex 场景对象索引(sceneObject.index)
     * @param indexType 事件类别,0~N 对应自定义的场景对象中的事件类别
     * @param inputMessage [可选] 默认值=null 玩家输入值(等同调用事件时传递的参数)
     * @param onCommandExecuteOver [可选] 默认值=null 当指令执行完毕时回调
     * @param triggerSceneObject [可选] 默认值=null 触发事件的对象,null则表示玩家的场景对象作为触发事件者
     * @return 是否触发执行成功
     */
    static startSceneObjectCommand(sceneObjectIndex: number, indexType: number, inputMessage?: any[], onCommandExecuteOver?: Callback, triggerSceneObject?: ClientSceneObject): boolean;

实现触发界面事件

1.需要监听界面元件的初始化事件,以便根据是否有事件页追加监听

Script.ts
// 监听每个组件的构造事件(创建预设界面时才会派发,而自行创建的组件不会派发该事件)
EventUtils.addEventListener(UIBase, UIBase.EVENT_COMPONENT_CONSTRUCTOR_INIT, Callback.New(uiComponentInit, this));

2.编写执行元件的事件 GameCommand.startUICommand(界面元件,事件类别索引);

Script.ts
function uiComponentInit(uiComp: UIBase) {
  if (uiComp.hasCommand[clickEventIndex]){
    // 注册点击事件
    uiComp.on(EventObject.CLICK, uiComp, () => {
      // 执行事件页0-点击事件
      GameCommand.startUICommand(uiComp, 0);
    });
  }
}

Copyright © 2021 - 2025