# OnlineBattleManager.registerListener(Object listener)

以 Promise 风格调用:不支持

# 功能描述

注册事件监听器,用于监听多人联机中的各种事件。可以多次调用注册多个监听器,所有监听器都会收到事件通知。

# 参数

# Object listener

事件监听器对象,可包含以下事件回调:

事件名称类型必填说明
onDisconnectedfunction连接断开时触发
onBattleServiceErrorfunction多人联机服务发生错误时触发
onPlayerEnteredfunction玩家进入房间时触发
onPlayerLeftfunction玩家离开房间时触发
onPlayerKickedfunction玩家被踢出房间时触发
onPlayerOfflinefunction玩家掉线时触发
onPlayerCustomStatusChangedfunction玩家状态变更时触发
onPlayerCustomPropertiesChangedfunction玩家属性变更时触发
onRoomPropertiesChangedfunction房间属性变更时触发
onFrameSyncStartedfunction帧同步开始时触发
onFrameReceivedfunction接收帧同步数据时触发
onFrameSyncStoppedfunction帧同步停止时触发
onCustomMessageReceivedfunction收到自定义消息时触发

# 事件回调参数

# 连接事件

# onDisconnected

连接断开时触发

参数

{
  reason: string,    // 断开原因
  code: number       // 错误代码
}

# 房间事件

# onPlayerEntered

玩家进入房间时触发

参数

{
  roomId: string,        // 房间ID
  playerInfo: Object     // 进入的玩家信息(见PlayerInfo数据结构)
}

其中 PlayerInfo 数据结构:

{
  id: string,                  // 玩家ID
  status: number,              // 玩家状态: 0=离线, 1=在线
  customStatus: number,        // 自定义玩家状态(可选)
  customProperties: string     // 自定义玩家属性(可选,JSON字符串,最大2048字节)
}

# onPlayerLeft

玩家离开房间时触发

参数

{
  roomId: string,        // 房间ID
  playerId: string,      // 离开的玩家ID
  playerName: string     // 离开的玩家名称
}

# onPlayerKicked

玩家被踢出房间时触发

参数

{
  playerId: string,      // 被踢的玩家ID
  reason: string         // 被踢原因
}

# 玩家事件

# onPlayerOffline

玩家掉线时触发

参数

{
  playerId: string,      // 掉线的玩家ID
  playerName: string     // 掉线的玩家名称
}

# onPlayerCustomStatusChanged

玩家状态变更时触发

参数

{
  playerId: string,      // 玩家ID
  status: number         // 新的自定义状态
}

# onPlayerCustomPropertiesChanged

玩家属性变更时触发

参数

{
  playerId: string,              // 玩家ID
  properties: Object             // 新的自定义属性(对象)
}

# 房间属性事件

# onRoomPropertiesChanged

房间属性变更时触发

参数

{
  id: string,                    // 房间ID
  name: string,                  // 房间名称
  customProperties: Object       // 自定义属性(对象)
}

# 帧同步事件

# onFrameSyncStarted

帧同步开始时触发

参数

{
  roomInfo: Object,      // 房间信息
  frameSyncId: number,   // 帧同步ID
  seed: number,          // 随机数种子,用于newRandomNumberGenerator
  serverTime: string     // 服务器时间
}

# onFrameReceived

接收帧同步数据,包含所有玩家的操作输入

参数

该事件参数是一个JSON字符串,需要解析后使用。

解析后的数据结构

{
  id: number,            // 帧序号
  inputs: Array          // 所有玩家的输入数组(见PlayerInput数据结构)
}

其中 PlayerInput 数据结构:

{
  playerId: string,      // 玩家ID
  data: string,          // 操作数据
  serverTime: string      // 服务器时间戳
}

使用说明:需要将参数字符串解析为对象

示例代码

onFrameReceived: (frameData) => {
  let frame = JSON.parse(frameData);
  console.log('帧序号:', frame.id);
  console.log('玩家输入:', frame.inputs);
}

# onFrameSyncStopped

帧同步停止时触发

参数

{
  roomId: string,        // 房间ID
  frameSyncId: number,   // 帧同步ID
  reason: number         // 停止原因: 0=房主主动结束, 1=超时结束(30分钟)
}

# 消息事件

# onCustomMessageReceived

收到自定义消息时触发

参数

{
  playerId: string,      // 消息发送者玩家ID
  message: any,          // 自定义消息内容
  type: number           // 消息类型(0-房间内所有玩家,1-队伍内所有玩家)
}

# 错误事件

# onBattleServiceError

多人联机服务发生错误时触发

参数

{
  errorMessage: string,  // 错误消息
  errorCode: number      // 错误代码
}

# 注意事项

  • 可以多次调用 registerListener 注册多个监听器
  • 所有监听器都会收到事件通知
  • 监听器之间相互独立,互不影响
  • 建议在连接服务器之前注册监听器,确保不会错过任何事件通知

# 示例代码

let tapOnlineBattle = tap.getOnlineBattleManager();

// 注册监听器
tapOnlineBattle.registerListener({
  // 连接断开
  onDisconnected: (errorInfo) => {
    console.log('连接断开:', errorInfo);
  },
  
  // 服务错误
  onBattleServiceError: (errorInfo) => {
    console.log('服务错误:', errorInfo);
  },
  
  // 玩家进入房间
  playerEnterRoom: (info) => {
    console.log('玩家进入房间:', info);
    console.log('玩家ID:', info.playerInfo.id);
  },
  
  // 玩家离开房间
  playerLeaveRoom: (info) => {
    console.log('玩家离开房间:', info);
  },
  
  // 帧同步开始
  onFrameSyncStart: (info) => {
    console.log('帧同步开始:', info);
    console.log('房间ID:', info.roomId);
  },
  
  // 帧同步数据
  onFrame: (frameData) => {
    let frame = JSON.parse(frameData);
    console.log('收到帧数据 - 帧序号:', frame.id);
    frame.inputs.forEach(input => {
      console.log('玩家:', input.player_id, '操作:', input.data);
    });
  },
  
  // 帧同步停止
  onFrameSyncStop: (info) => {
    console.log('帧同步停止:', info);
  },
  
  // 自定义消息
  onCustomMessage: (info) => {
    console.log('收到自定义消息:', info.message);
    console.log('发送者:', info.fromPlayerId);
  }
});

// 可以注册多个监听器
tapOnlineBattle.registerListener({
  playerLeaveRoom: (info) => {
    console.log('另一个监听器 - 玩家离开:', info.playerId);
  }
});