# OnlineBattleManager.registerListener(Object listener)
以 Promise 风格调用:不支持
# 功能描述
注册事件监听器,用于监听多人联机中的各种事件。可以多次调用注册多个监听器,所有监听器都会收到事件通知。
# 参数
# Object listener
事件监听器对象,可包含以下事件回调:
| 事件名称 | 类型 | 必填 | 说明 |
| onDisconnected | function | 否 | 连接断开时触发 |
| onBattleServiceError | function | 否 | 多人联机服务发生错误时触发 |
| onPlayerEntered | function | 否 | 玩家进入房间时触发 |
| onPlayerLeft | function | 否 | 玩家离开房间时触发 |
| onPlayerKicked | function | 否 | 玩家被踢出房间时触发 |
| onPlayerOffline | function | 否 | 玩家掉线时触发 |
| onPlayerCustomStatusChanged | function | 否 | 玩家状态变更时触发 |
| onPlayerCustomPropertiesChanged | function | 否 | 玩家属性变更时触发 |
| onRoomPropertiesChanged | function | 否 | 房间属性变更时触发 |
| onFrameSyncStarted | function | 否 | 帧同步开始时触发 |
| onFrameReceived | function | 否 | 接收帧同步数据时触发 |
| onFrameSyncStopped | function | 否 | 帧同步停止时触发 |
| onCustomMessageReceived | function | 否 | 收到自定义消息时触发 |
# 事件回调参数
# 连接事件
# 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);
}
});
