HuaweiDemo/assets/script/core/gobeUtil.ts
2023-11-07 09:17:57 +08:00

1375 lines
47 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { Asset, _decorator, log, native, resources, sys} from 'cc';
import {ClientEvent} from '../framework/clientEvent';
import { Constant } from '../framework/constant';
import { FrameInfo, PlayerInfo, RecvFromServerInfo, Room, RoomInfo } from '../libs/GOBE';
import { PlayerData } from '../framework/playerData';
import { UIManager } from '../framework/uiManager';
import { Util } from '../framework/util';
export enum PLAYER_TYPE{
READY = 0,
START = 1,
END = 2
}
export enum ROOM_TYPE{
READY = "ready",
START = "start",
END = "end"
}
export enum WIFI_TYPE{
STAND_ALONE = "stand-alone", // 单机模式
WIFI = "wifi", // 联网模式
}
export class MessageInfo{
public playerId:string = "";
public msg:string = "";
}
export class RoomAloneInfo{
public players:PlayerInfo[] = [];
public customRoomProperties:string = "";
public ownerId:string = "";
public roomCode:string = "";
}
export class GobeUtil {
private static CLIENT_ID : string = 'CLIENT_ID'; // 需要手动更改
private static CLIENT_SECRET : string = 'CLIENT_SECRET'; // 需要手动更改
private static APP_ID: string = 'APP_ID'; // 需要手动更改
private static _instance: GobeUtil = null!;
private _openId: string = "";
public get openId(){
return this._openId;
}
private _client:GOBE.Client = null!;
private _room: GOBE.Room = null;
private _roomAloneInfo:RoomAloneInfo = new RoomAloneInfo();
public get room(){
if(this._wifiType == WIFI_TYPE.STAND_ALONE){
return this._roomAloneInfo;
}
return this._room;
}
private _ownPlayerId:string = "";
public get ownPlayerId(){
return this._ownPlayerId;
}
private _roomInfos:RoomInfo[] = [];
public get roomPlayers(){
if(this._wifiType == WIFI_TYPE.STAND_ALONE){
return this._roomAloneInfo.players;
}
if(this._room){
return this._room.players;
}
else{
return [];
}
}
public static get instance () {
if (this._instance) {
return this._instance;
}
this._instance = new GobeUtil();
return this._instance;
}
private _cacertNativeUrl: string = "";
private _lastRoomId:string = null;
public get lastRoomId (){
return this._lastRoomId;
}
public set lastRoomId (value:any){
this._lastRoomId = value;
}
private _isInitMedia:boolean = false;
public get isInitMedia (){
return this._isInitMedia;
}
public set isInitMedia (value:boolean){
this._isInitMedia = value;
}
private _isChannelId:boolean = false;
public get isChannelId (){
return this._isChannelId;
}
public set isChannelId (value:boolean){
this._isChannelId = value;
}
private _isOpenPgs:boolean = false;
public get isOpenPgs (){
return this._isOpenPgs;
}
public set isOpenPgs (value:boolean){
this._isOpenPgs = value;
}
private _msgLst:object[] = [];
public get msgLst (){
return this._msgLst;
}
private _isStartFS:Boolean = false;
private _isStartGame:boolean = false;
private _isOtherStartGame:boolean = false;
private _time:number = 0;
public get time(){
if(this.wifiType == WIFI_TYPE.STAND_ALONE){
return new Date().getTime();
}
return this._time;
}
private _isAi:boolean = false;
public get isAi(){
return this._isAi;
}
private _hammerIndex:number = 0;
public set hammerIndex(v:number){
this._hammerIndex = v;
}
// 房主有没有加入房间
private _isRoomOwnIn:boolean = false;
public get isRoomOwnIn(){
return this._isRoomOwnIn;
}
public roomType:ROOM_TYPE = ROOM_TYPE.READY;
private _isDisJoin:boolean = false;
public get isDisJoin(){
return this._isDisJoin;
}
private _recvMap:Map<number, FrameInfo[]> = new Map();
public get recvMap(){
return this._recvMap;
}
private _currFrame:number = 0;
public get currFrame(){
return this._currFrame;
}
// wifi模式
private _wifiType:WIFI_TYPE = WIFI_TYPE.WIFI;
public get wifiType(){
return this._wifiType;
}
// 华为初始化成功
private _isHwInit:boolean = false;
public get isHwInit(){
return this._isHwInit;
}
public set isHwInit (value:boolean){
this._isHwInit = value;
}
// 华为登录
private _isHwLogin:boolean = false;
public get isHwLogin(){
return this._isHwLogin;
}
public set isHwLogin (value:boolean){
this._isHwLogin = value;
}
private _otherDisInterval : number = 0; // 对手掉线 倒计时 10秒 游戏结束
public isChangeWifiType:boolean = true; // false 只有单机模式 true 可以切换
// 准备过程中掉线
private _isReadyDis:boolean = false;
public serverTimeDis:number = 0; // 服务器与客户端时间间隔
/**
* 初始化Mgobe
* @param openId 玩家唯一标示符
* @param name 玩家昵称
* @param headUrl 玩家头像
* @param callback 回调函数
* @returns
*/
public initSDK(openId: string, callback: Function) {
this._openId = openId;
this._getToken(callback);
}
/**
* 获得房间列表
*/
private _updateAvailableRooms(callback:Function){
let getAvailableRoomsConfig = {
offset: '0', // 偏移量
limit: 10, // 单次请求获取的房间数量
sync: true, // 是否返回帧同步中的房间
};
this._client.getAvailableRooms(getAvailableRoomsConfig).then((infos) => {
// 查询房间列表成功
this._roomInfos = infos.rooms;
callback && callback();
console.log('aaaaaaaa3 查询房间列表成功', this._roomInfos);
}).catch((e) => {
// 查询房间列表失败
this._roomInfos = [];
console.log('aaaaaaaa3 查询房间列表失败', e);
});
}
/**
* 查询
*/
public updateAvailableRooms(){
this._updateAvailableRooms(()=>{
});
}
/**
* 检查是否是房主
*/
public checkIsRoomOwner (id: string) {
if (!this.room) return false;
return this.room.ownerId === id;
}
/**
* 检查是否是玩家自己
*/
public isOwnPlayer(playerId:string){
return GobeUtil.instance.ownPlayerId == playerId;
}
/**
* 发送帧数据
* @param info 帧数据
*/
public sendFrame (info: any) {
if(this.wifiType == WIFI_TYPE.STAND_ALONE){
this._recvMap.set(++this._currFrame, [{
playerId:this._ownPlayerId,
data:[JSON.stringify(info)],
timestamp:0
}]);
}else{
if (!this._room ) return;
this._room.sendFrame(JSON.stringify(info));
}
}
/**
* 获取token
* @param callback
*/
private _getToken(callback:Function){
var url:string = "https://connect-drcn.hispace.hicloud.com/agc/apigw/oauth2/v1/token";
const xhr = new XMLHttpRequest();
xhr.open('POST', url, true);
xhr.setRequestHeader('Content-Type', 'application/json;charset=utf-8');
xhr.onload = () => {
if (xhr.status !== 200) {
return;
}
console.log("aaaaaaaa3 xhr", xhr.response);
var info = JSON.parse(xhr.response);
this._initMgobe(info["access_token"], callback);
};
var data = {};
data = {
'client_id' : GobeUtil.CLIENT_ID,
'client_secret' : GobeUtil.CLIENT_SECRET,
'grant_type' : 'client_credentials',
'useJwt' : 0
}
xhr.send(JSON.stringify(data));
}
/**
* 获取证书 url
* @param token
* @param callback
*/
private _loadCert(token:string, callback:Function){
resources.load("/endpoint-cert", Asset, (err, asset) => {
console.log("aaaaaaaa1 加载证书结束 " + (!err));
if (err) {
return;
}
this._cacertNativeUrl = asset.nativeUrl;
this._initMgobe(token, callback);
});
}
/**
* 初始化Mgobe
* @param callback 回调函数
*/
private _initMgobe(token:string, callback:Function) {
if(sys.Platform.ANDROID == sys.platform
|| sys.Platform.OPENHARMONY == sys.platform){
if(this._cacertNativeUrl == ""){
console.log("aaaaaaaa2");
this._loadCert(token, callback);
return;
}
console.log("aaaaaaaa1 _initMgobe1", token);
this._client = new GOBE.Client({
appId: GobeUtil.APP_ID, // 应用ID
openId: this._openId, // 玩家ID区别不同用户
clientId: GobeUtil.CLIENT_ID, // 客户端ID
clientSecret: GobeUtil.CLIENT_SECRET, // 客户端密钥
accessToken: token, // AGC接入凭证(推荐)
platform: GOBE.PlatformType.OTHER,
cerPath: this._cacertNativeUrl
});
}else {
console.log("aaaaaaaa1 _initMgobe2", token);
this._client = new GOBE.Client({
appId: GobeUtil.APP_ID, // 应用ID
openId: this._openId, // 玩家ID区别不同用户
clientId: GobeUtil.CLIENT_ID, // 客户端ID
clientSecret: GobeUtil.CLIENT_SECRET, // 客户端密钥
accessToken: token, // AGC接入凭证(推荐)
});
}
console.log("aaaaaaaa4");
this._client.onInitResult((resultCode)=>{
if(resultCode == 0){
callback && callback(true);
// 如果有上次登录的房间
if(this._lastRoomId){
GobeUtil.instance.joinRoom(
this._lastRoomId,
()=>{
// 游戏未开始 退出房间
if(this._room.customRoomProperties == ROOM_TYPE.READY){
this.leaveRoom();
this._lastRoomId = null;
}else{
var info:object = JSON.parse(this._room.customRoomProperties);
// 游戏已经结束 退出房间
if(info["type"] == ROOM_TYPE.END){
this.leaveRoom();
this._lastRoomId = null;
}else{
var time:number = info["time"];
var currTime:number = Math.floor(Constant.GAME_TIME - (new Date().getTime() - time + GobeUtil.instance.serverTimeDis) / 1000);
if(currTime > 5 ){
setTimeout(() => {
// 游戏时间内 重新进入房间
UIManager.instance.showDialog(Constant.PANEL_NAME.READY, null, ()=>{}, true);
UIManager.instance.showTips(Constant.ROOM_TIPS.JOIN_ROOM_SUCCESS);
UIManager.instance.hideDialog(Constant.PANEL_NAME.JOIN_ROOM_PANEL);
}, 500);
this._isDisJoin = true;
}else{
// 超过游戏时间 退出房间
this.leaveRoom();
this._lastRoomId = null;
}
}
}
console.log("aaaaaaaa2----_lastRoomId reconnect success");
}, (error:any)=>{
console.log("aaaaaaaa2----_lastRoomId reconnect fail", error);
}
);
}
}
});
// 调用Client.init方法进行初始化
this._client.init().then((client) => {
// 已完成初始化请求具体初始化结果通过onInitResult回调获取
this._ownPlayerId = client.playerId;
this._lastRoomId = this._client.lastRoomId;
this.serverTimeDis = client.loginTimestamp - new Date().getTime();
console.log("aaaaaaaa2 init playerid", client.playerId);
}).catch((err) => {
// 初始化请求失败,重新初始化或联系华为技术支持
console.log("aaaaaaaa2 调用Client.init方法进行初始化error" , err);
callback && callback(false);
});
}
/**
* 开始游戏
*/
public startGame(){
if(this._isDisJoin){
this._isDisJoin = false;
ClientEvent.dispatchEvent(Constant.EVENT_NAME.ON_GAME_START);
}else{
this._hammerIndex = 0;
if(this.wifiType == WIFI_TYPE.STAND_ALONE){
this._roomAloneInfo.customRoomProperties = JSON.stringify({"type": ROOM_TYPE.START, "time":new Date().getTime()});
this.roomType = ROOM_TYPE.START;
this._time = new Date().getTime();
ClientEvent.dispatchEvent(Constant.EVENT_NAME.ON_GAME_START);
}else{
if(this._room)
this._room.sendToServer(JSON.stringify({'msg': Constant.START_GAME, 'playerId': this._ownPlayerId}));
}
}
}
/**
* 创建锤子
*/
public createHammer(nextTime:number){
if(this._hammerIndex >= Constant.HAMMER_POS.length){
return;
}
if(this.room){
this.sendFrame({
'A' : Constant.ACTION.CREATE_HAMMER,
'V' : this._hammerIndex,
'X' : Constant.HAMMER_POS[this._hammerIndex][0],
'Y' : Constant.HAMMER_POS[this._hammerIndex][1],
'Z' : Constant.HAMMER_POS[this._hammerIndex][2],
'T' : nextTime});
}
}
/**
* 创建金币
*/
public createCoin(pos:number[][]){
if(this.room){
this.sendFrame({
'A' : Constant.ACTION.CREATE_ICON,
'I' : JSON.stringify({'coin_pos': pos})
})
}
}
/**
* 结束游戏
*/
public finishGame(){
console.log("aaaaaaaa2 finishGame 1");
if(this._wifiType == WIFI_TYPE.STAND_ALONE){
console.log("aaaaaaaa2 finishGame 2");
this._isStartFS = false;
this._roomAloneInfo.customRoomProperties = JSON.stringify({"type": ROOM_TYPE.END, "time": this._time});
this._isStartFS = false;
ClientEvent.dispatchEvent(Constant.EVENT_NAME.ON_GAME_END);
}else{
console.log("aaaaaaaa2 finishGame 3", this._room && this._room.ownerId == this._ownPlayerId, this._room.ownerId, this._isRoomOwnIn);
if(this._room && this._room.ownerId == this._ownPlayerId
|| (!this._isRoomOwnIn && this._room.ownerId != this._ownPlayerId)){
console.log("aaaaaaaa2 finishGame 4");
if(this._isStartFS){
this._isStartFS = false;
console.log("aaaaaaaa2 stopFrameSync");
this._room.stopFrameSync();
}
console.log("aaaaaaaa2-------finishGame------")
this._room.updateRoomProperties({
customRoomProperties : JSON.stringify({"type": ROOM_TYPE.END, "time": this._time})
});
if(!this._isRoomOwnIn){
ClientEvent.dispatchEvent(Constant.EVENT_NAME.ON_GAME_END);
}
}
}
}
/**
* 房间监听信息
*/
private _enabledEventRoom(){
this._isStartGame = false;
this._isOtherStartGame = false;
this._room.onJoin((playerInfo) => {
// 加入房间成功,做相关游戏逻辑处理
console.log("aaaaaaaa2----onJoin 加入", this._room.ownerId, playerInfo.playerId);
if(this._room.ownerId != playerInfo.playerId){
ClientEvent.dispatchEvent(Constant.EVENT_NAME.ON_OTHER_JOIN_ROOM, playerInfo.playerId);
}else{
// 房主加入房间
this._isRoomOwnIn = true;
}
if(playerInfo.playerId != this.ownPlayerId){
if(this._otherDisInterval > 0){
clearInterval(this._otherDisInterval);
this._otherDisInterval = 0;
}
}
if(this._room && playerInfo.playerId == this._ownPlayerId
&& this._room.customRoomProperties){
if(this._room.customRoomProperties == ROOM_TYPE.READY){
this.roomType = ROOM_TYPE.READY;
this._time = 0;
}else if(this._room.customRoomProperties == ROOM_TYPE.END){
this.roomType = ROOM_TYPE.END;
this._time = new Date().getTime() - Constant.GAME_TIME * 1000;
}else{
var info:object = JSON.parse(this._room.customRoomProperties);
this.roomType = info["type"];
this._time = info["time"];
}
}
});
// 加入房间失败
this._room.onJoinFailed((error) => {
console.log("aaaaaaaa2----onJoinFailed 加入失败", error);
});
// 离开房间监听
this._room.onLeave((player)=>{
console.log("aaaaaaaa2----onLeave 离开", player.playerId);
if(player.playerId != this._ownPlayerId){
this.updateRoom();
}
else{
this._room.removeAllListeners();
}
if(this._room.ownerId == player.playerId){
// 房主离开房间
this._isRoomOwnIn = false;
}
}
);
this._room.onDisconnect((playerInfo) => {
console.log("aaaaaaaa2 onDisconnect", playerInfo.playerId);
// 当前玩家断线
if(playerInfo.playerId === this._room.playerId){
if(this._room){
var interval = setInterval(()=>{
console.log("aaaaaaaa2 onDisconnect", interval)
if(this._room == null){
clearInterval(interval);
return;
}
this._room.reconnect().then(()=>{
clearInterval(interval);
console.log("aaaaaaaa2----reconnect success");
}).catch(()=>{
console.log("aaaaaaaa2----reconnect fail");
});
}, 1000);
}
}else{
this.updateRoom();
if(this.roomType == ROOM_TYPE.READY){
this._isReadyDis = true;
var time:number = 10;
this._otherDisInterval = setInterval(()=>{
UIManager.instance.showTips(Constant.ROOM_TIPS.PLAYER_LEAVE_1 + time + Constant.ROOM_TIPS.PLAYER_LEAVE_2);
time--;
if(time <= 0){
ClientEvent.dispatchEvent(Constant.EVENT_NAME.ON_GAME_END);
this._room.updateRoomProperties({
customRoomProperties : JSON.stringify({"type": ROOM_TYPE.END, "time": 0})
});
clearInterval(this._otherDisInterval);
}
}, 1000);
}
}
if(this._room.ownerId == playerInfo.playerId){
// 房主掉线
this._isRoomOwnIn = false;
}
});
this._room.onRoomPropertiesChange((roomInfo:RoomInfo)=>{
console.log("aaaaaaaa2 onRoomPropertiesChange", roomInfo.customRoomProperties);
var info:object = JSON.parse(roomInfo.customRoomProperties);
this.roomType = info["type"];
this._time = info["time"];
if(info["type"] == ROOM_TYPE.START){
// 游戏开始
ClientEvent.dispatchEvent(Constant.EVENT_NAME.ON_GAME_START);
}else if(info["type"] == ROOM_TYPE.END){
// 游戏结束
ClientEvent.dispatchEvent(Constant.EVENT_NAME.ON_GAME_END);
}else if(info["type"] == ROOM_TYPE.READY){
// 游戏结束
}
this.updateRoom();
});
this._room.onStartFrameSync(()=>{
console.log("aaaaaaaa2 onStartFrameSync");
this._isStartFS = true;
if(!this._isAi){
this.joinTeamRoom(this._room.ownerId);
this.joinGroupChannel(this._room.ownerId);
}
});
this._room.onStopFrameSync(()=>{
console.log("aaaaaaaa2----onStopFrameSync结束帧同步");
this._isStartFS = false;
this._currFrame = 0;
this._recvMap = new Map();
GobeUtil.instance.mediaLeaveRoom();
GobeUtil.instance.leaveChannel();
UIManager.instance.hideDialog(Constant.PANEL_NAME.MEDIA_PANEL);
});
this._room.onRecvFromServer((recvFromServerInfo: RecvFromServerInfo)=>{
console.log("aaaaaaaa2----onRecvFromServer 服务端数据", recvFromServerInfo.msg);
var msg:string = recvFromServerInfo.msg;
var info = JSON.parse(msg);
if(info){
if(info["msg"] == Constant.START_GAME){
if(info["playerId"] != this._ownPlayerId){
this._isOtherStartGame = true;
}else {
this._isStartGame = true;
}
if(this._room.ownerId == this._ownPlayerId){
if(this._isOtherStartGame && this._isStartGame){
this._room.sendToServer(Constant.START_GAME_TIME);
// this._room.startFrameSync();
// this._room.updateRoomProperties({
// customRoomProperties : JSON.stringify({"type": ROOM_TYPE.START, "time" : new Date().getTime()})
// });
}
}
}else if(info["msg"] == Constant.START_GAME_TIME){
this.serverTimeDis = info["time"] - new Date().getTime();
if(this._room.ownerId == this._ownPlayerId){
this._room.startFrameSync();
this._room.updateRoomProperties({
customRoomProperties : JSON.stringify({"type": ROOM_TYPE.START, "time" : info["time"], "serverTimeDis": this.serverTimeDis})
});
}
}
}
});
this._room.onRecvFrame((msg)=>{
if(msg instanceof Array){
for(var index:number = 0; index < msg.length; index++){
this._time = msg[index].time;
if(msg[index].frameInfo){
this._recvMap.set(msg[index].currentRoomFrameId, msg[index].frameInfo);
}
}
this._currFrame = msg[msg.length - 1].currentRoomFrameId;
ClientEvent.dispatchEvent(Constant.EVENT_NAME.ON_RECV_SYNC);
}
else{
this._time = msg.time;
if(msg.frameInfo){
this._recvMap.set(msg.currentRoomFrameId, msg.frameInfo);
}
this._currFrame = msg.currentRoomFrameId;
}
});
}
/**
* 创建房间
* @param callback 创建房间回调函数
* @returns
*/
public createRoomAI(callback:Function, errorCallback:Function) {
this.serverTimeDis = 0;
this._isAi = true;
this._wifiType = WIFI_TYPE.STAND_ALONE;
this._currFrame = 0;
this._recvMap = new Map();
console.log("aaaaaaaa2----createRoomAI 创建房间");
this._roomAloneInfo = new RoomAloneInfo();
this._roomAloneInfo.ownerId = this._ownPlayerId;
this._roomAloneInfo.roomCode = "0001" + Math.floor(Math.random() * 100);
this._roomAloneInfo.players = [];
this._roomAloneInfo.players.push({
playerId : this._ownPlayerId,
customPlayerProperties : PlayerData.instance.playerInfo["playerName"],
});
Util.randomName(1).then((playerName)=>{
this._roomAloneInfo.players.push({
playerId : "ai00000",
customPlayerProperties : playerName,
});
});
this._roomAloneInfo.customRoomProperties = JSON.stringify({"type": ROOM_TYPE.READY, "time":0});
this.roomType = ROOM_TYPE.READY;
this._time = 0;
this._isStartFS = true;
callback && callback();
}
/**
* 创建房间
* @param callback 创建房间回调函数
* @returns
*/
public createRoom(callback:Function, errorCallback:Function) {
this._currFrame = 0;
this._recvMap = new Map();
this._isAi = false;
this._wifiType = WIFI_TYPE.WIFI;
console.log("aaaaaaaa2----createRoom 创建房间");
this._client.createRoom({
maxPlayers: 2
},{customPlayerStatus: 0, customPlayerProperties: PlayerData.instance.playerInfo["playerName"]}).then((room) => {
this._room = room;
this._lastRoomId = room.roomId;
this._enabledEventRoom();
console.log("aaaaaaaa2 -------READY------")
this._room.updateRoomProperties({
customRoomProperties : JSON.stringify({"type": ROOM_TYPE.READY, "time":0})
});
callback && callback();
console.log("aaaaaaaa2----创建房间成功");
}).catch((e) => {
errorCallback && errorCallback();
console.log("aaaaaaaa2----创建房间失败 错误", e);
}
);
}
/**
* 加入房间
* @param roomId 房间号
*/
public joinRoom(roomId:string, callback:Function, errorCallback:Function) {
this._currFrame = 0;
this._recvMap = new Map();
this._isAi = false;
this._wifiType = WIFI_TYPE.WIFI;
console.log("aaaaaaaa2----joinRoom 加入房间");
this._client.joinRoom(roomId,
{customPlayerStatus: 0, customPlayerProperties: PlayerData.instance.playerInfo["playerName"]}).then((room) => {
// 加入房间中
this._room = room;
this._lastRoomId = room.roomId;
this._enabledEventRoom();
// 如果加入房间 默认房主在房间里
if(this._room.players.length == Constant.MAX_PLAYER){
this._isRoomOwnIn = true;
}
console.log("aaaaaaaa2 加入房间成功");
callback && callback();
}).catch((e) => {
console.log("aaaaaaaa2 申请加入房间 错误", e);
errorCallback && errorCallback(e);
}
);
}
/**
* 开始匹配房间
*/
public matchRoom(callback:Function, errCallback:Function){
this._currFrame = 0;
this._recvMap = new Map();
this._isAi = false;
this._wifiType = WIFI_TYPE.WIFI;
console.log("aaaaaaaa2----matchRoom 开始匹配房间");
this._client.matchRoom({
matchParams: {},
maxPlayers: 2,
customRoomProperties: JSON.stringify({"type": ROOM_TYPE.READY, "time":0})
},{customPlayerStatus: 0, customPlayerProperties: PlayerData.instance.playerInfo["playerName"]}).then((room:Room)=>{
console.log("aaaaaaaa2----matchRoom success");
this._room = room;
this._lastRoomId = room.roomId;
this._enabledEventRoom();
// 如果加入房间 默认房主在房间里
if(this._room.players.length == Constant.MAX_PLAYER){
this._isRoomOwnIn = true;
}
callback && callback();
}).catch((e)=>{
errCallback && errCallback();
console.log("aaaaaaaa2----matchRoom error", e)
});
}
/**
* 更新房间信息
*
* @returns
*/
public updateRoom(){
if(this._room == null){
return;
}
this._room.update().then((room) => {
this._room = room;
console.log("aaaaaaaa2 updateRoom", room);
}).catch((e) => {
// 获取玩家房间最新信息失败
console.log("aaaaaaaa2 更新房间信息 error", e)
});
}
/**
* 离开房间
*/
public leaveRoom(callback?:Function, errorCallback?:Function, isLeaveMedia:boolean = true){
if(this._isReadyDis ){
this._isReadyDis = false;
if(this._room)
this._room.sendToServer(Constant.DISMISS);
}
if(this._lastRoomId && this._client){
this._client.leaveRoom().then((client)=>{
console.log("aaaaaaaa2离开房间 成功")
this._client = client;
this._client.removeAllListeners();
this._room && this._room.removeAllListeners();
this._room = null;
callback && callback();
}).catch((e)=>{
errorCallback && errorCallback(e);
console.log("aaaaaaaa2离开房间 error", e)
});
if(isLeaveMedia){
this.leaveChannel();
this.mediaLeaveRoom();
UIManager.instance.hideDialog(Constant.PANEL_NAME.MEDIA_PANEL);
}
}else{
this._roomAloneInfo = null;
callback && callback();
}
}
/**
* 判断是否初始化
* @returns
*/
public isInited() {
// 初始化成功后才有玩家ID
return !!this._ownPlayerId;
}
/**
* 离开游戏
*/
public leaveGame(){
this.isHwLogin = false;
this._ownPlayerId = "";
this._roomAloneInfo = null;
if(this._client){
this._client.destroy();
this._client = null;
this._room = null;
this._ownPlayerId = "";
this.leaveChannel();
this.mediaLeaveRoom();
this.destoryMedia();
UIManager.instance.hideDialog(Constant.PANEL_NAME.MEDIA_PANEL);
PlayerData.instance.isInit = false;
}
}
private _isOpenMedia:boolean = false;
public get isOpenMedia(){
return this._isOpenMedia;
}
public set isOpenMedia(value:boolean){
this._isOpenMedia = value;
}
private _isRemoveMedia:boolean = false;
public get isRemoveMedia(){
return this._isRemoveMedia;
}
public set isRemoveMedia(value:boolean){
this._isRemoveMedia = value;
}
private _isRemoveChannel:boolean = false;
public get isRemoveChannel(){
return this._isRemoveChannel;
}
public set isRemoveChannel(value:boolean){
this._isRemoveChannel = value;
}
/**
* 开启 Media
*/
public startMedia(openId:string){
if(sys.platform == sys.Platform.ANDROID){
console.log("time startMedia:" + new Date().getTime());
native.reflection.callStaticMethod('com/cocos/game/MediaEngine', "startMediaEngine", "(Ljava/lang/String;)V", openId);
}
}
/**
* destory Media
*/
public destoryMedia(){
if(sys.platform == sys.Platform.ANDROID){
console.log("time destoryMedia:" + new Date().getTime());
native.reflection.callStaticMethod('com/cocos/game/MediaEngine', "destoryMediaEngine", "()V");
}
}
/**
* 开启 Media
*/
public joinTeamRoom(roomId:string){
if(this.isInitMedia && sys.platform == sys.Platform.ANDROID){
console.log("time joinTeamRoom:" + new Date().getTime());
native.reflection.callStaticMethod('com/cocos/game/MediaEngine', "joinTeamRoom", "(Ljava/lang/String;)V", roomId);
}
}
/**
* 离开 Media 房间
*/
public mediaLeaveRoom(){
this._msgLst = [];
if(sys.platform == sys.Platform.ANDROID){
var obj:object = PlayerData.instance.getSetting("TeamRoom");
if(obj){
var roomId = obj[GobeUtil.instance.openId];
if(roomId && roomId != ""){
console.log("time mediaLeaveRoom:" + new Date().getTime());
native.reflection.callStaticMethod('com/cocos/game/MediaEngine', "leaveRoom", "(Ljava/lang/String;)V", roomId);
}
}
this._isOpenMedia = false;
}
}
/**
* 开启 禁停 四周音
* @param isOpen rue禁言 false解禁
*/
public mediaMuteAllPlayers(isOpen:boolean){
if(sys.platform == sys.Platform.ANDROID){
var obj:object = PlayerData.instance.getSetting("TeamRoom");
if(obj){
var roomId = obj[GobeUtil.instance.openId];
if(roomId && roomId != ""){
console.log("time mediaMuteAllPlayers:" + new Date().getTime());
native.reflection.callStaticMethod('com/cocos/game/MediaEngine', "muteAllPlayers", "(Ljava/lang/String;I)V", roomId, isOpen? 0 : 1);
}
}
}
}
/**
* 开启/关闭玩家自身麦克风
*
* @param isOpen true开启 false关闭
*/
public mediaEnableMic(isOpen:boolean){
if(sys.platform == sys.Platform.ANDROID){
console.log("time mediaEnableMic:" + new Date().getTime());
native.reflection.callStaticMethod('com/cocos/game/MediaEngine', "enableMic", "(I)V", isOpen? 0 : 1);
}
}
/**
* 加入im房间
* @param roomId
*/
public joinGroupChannel(roomId:string){
if(sys.platform == sys.Platform.ANDROID){
console.log("time joinGroupChannel:" + new Date().getTime());
native.reflection.callStaticMethod('com/cocos/game/MediaEngine', "joinGroupChannel", "(Ljava/lang/String;)V", roomId);
}
}
/**
* 离开im房间
*/
public leaveChannel(){
if(sys.platform == sys.Platform.ANDROID){
var obj:object = PlayerData.instance.getSetting("JoinChannel");
if(obj){
var roomId = obj[GobeUtil.instance.openId];
if(roomId && roomId != ""){
console.log("time leaveChannel:" + new Date().getTime());
native.reflection.callStaticMethod('com/cocos/game/MediaEngine', "leaveChannel", "(Ljava/lang/String;)V", roomId);
}
}
}
}
/**
* 发送文本信息
* @param msg
*/
public sendTextMsg(msg:string){
if(sys.platform == sys.Platform.ANDROID){
var obj:object = PlayerData.instance.getSetting("JoinChannel");
var roomId = obj[GobeUtil.instance.openId];
if(roomId && roomId != ""){
console.log("time sendTextMsg:" + new Date().getTime());
native.reflection.callStaticMethod('com/cocos/game/MediaEngine', "sendTextMsg", "(Ljava/lang/String;Ljava/lang/String;)V", roomId, msg);
}
}
}
public startRecordAudioToText(){
if(sys.platform == sys.Platform.ANDROID){
console.log("time startRecordAudioToText:" + new Date().getTime());
native.reflection.callStaticMethod('com/cocos/game/MediaEngine', "startRecordAudioToText", "()V");
}
}
public stopRecordAudioToText(){
if(sys.platform == sys.Platform.ANDROID){
console.log("time stopRecordAudioToText:" + new Date().getTime());
native.reflection.callStaticMethod('com/cocos/game/MediaEngine', "stopRecordAudioToText", "()V");
}
}
/**
* 初始化 内置服务器
*/
public startForumPage(){
if(sys.platform == sys.Platform.ANDROID){
this._isOpenPgs = false;
console.log("time startForumPage:" + new Date().getTime());
native.reflection.callStaticMethod('com/cocos/game/ForumPage', "startPgs", "()V");
}
}
/**
* 打开社区
*/
public openForumPage(){
if(sys.platform == sys.Platform.ANDROID){
console.log("time openForumPage:" + new Date().getTime());
native.reflection.callStaticMethod('com/cocos/game/ForumPage', "openForumPage", "()V");
}
}
/**
* check推荐 - 进入
*/
public forumPageCheckScene(){
if(sys.platform == sys.Platform.ANDROID){
console.log("time openForumPage:" + new Date().getTime());
native.reflection.callStaticMethod('com/cocos/game/ForumPage', "checkScene", "()V");
}
}
/**
* 开启 Media
*/
public forumPagePublish(){
if(sys.platform == sys.Platform.ANDROID){
console.log("time openForumPage:" + new Date().getTime());
native.reflection.callStaticMethod('com/cocos/game/ForumPage', "publish", "()V");
}
}
/**
* 检查media是否上次掉线未关闭
* @returns
*/
public checkInitMedia(){
var obj:object = PlayerData.instance.getSetting("TeamRoom");
if(obj && obj[GobeUtil.instance.openId]){
var roomId = obj[GobeUtil.instance.openId];
if(roomId != '' && roomId != Constant.WORLD_ID){
GobeUtil.instance.isRemoveMedia = true;
GobeUtil.instance.joinTeamRoom(roomId);
return;
}
}
ClientEvent.dispatchEvent(Constant.EVENT_NAME.INIT_MEDIA);
}
/**
* 检查channel是否上次掉线未关闭
* @returns
*/
public checkInitChannel(){
var obj:object = PlayerData.instance.getSetting("JoinChannel");
if(obj && obj[GobeUtil.instance.openId]){
var roomId = obj[GobeUtil.instance.openId];
if(roomId != '' && roomId != Constant.WORLD_ID){
GobeUtil.instance.joinGroupChannel(roomId);
GobeUtil.instance.isRemoveChannel = true;
return;
}
}
ClientEvent.dispatchEvent(Constant.EVENT_NAME.INIT_CHANNEL);
}
// /**
// * 初始化obs
// */
// public startObs(){
// if(sys.platform == sys.Platform.OHOS){
// console.log("time startMedia:" + new Date().getTime());
// native.reflection.callStaticMethod('com/example/cocosdemo/ObsControl', "initObs", "()V");
// }
// }
/**
* 上传排行榜
*/
public inputRank(){
var info = JSON.stringify({
"id":PlayerData.instance.playerInfo["playerId"],
"score":PlayerData.instance.playerInfo["score"],
"name":PlayerData.instance.playerInfo["playerName"],
"icon":"https://huawei-hunter.obs.cn-north-4.myhuaweicloud.com/icon"+PlayerData.instance.playerInfo["icon"]+".png",
"staticId":PlayerData.instance.playerInfo["staticId"]});
var url = 'https://service-nhdz5z7l-1251720271.sh.apigw.tencentcs.com/release/postRank?info=' + info;
const p = fetch(url, {method:'POST'})
p.then(res=>res.text()).then(async res=>{
console.log(res);
});
// if(sys.platform == sys.Platform.OHOS){
// var json:string = JSON.stringify(PlayerData.instance.playerInfo);
// native.reflection.callStaticMethod('com/example/cocosdemo/ObsControl', "putRanks", "(Ljava/lang/String;)V", json);
// }
}
public hwSignIn(){
if(sys.platform == sys.Platform.ANDROID){
native.reflection.callStaticMethod('com/cocos/game/JosAppControl', "signIn", "()V");
}
}
public initHuawei(){
if(sys.platform == sys.Platform.ANDROID){
native.reflection.callStaticMethod('com/cocos/game/JosAppControl', "initHuawei", "()V");
}
}
}
// 语音识别
window["callbackToGMMCreate"] = (code:number, msg:string) => {
console.log("time callbackToGMMCreate:" + new Date().getTime());
if(code == 0){
GobeUtil.instance.isInitMedia = true;
GobeUtil.instance.checkInitMedia();
GobeUtil.instance.checkInitChannel();
}
console.log("-------callbackToGMMCreate", code, msg);
}
window["callbackToGmmJoin"] = (code:number, roomId:string, msg:string) =>{
console.log("time callbackToGmmJoin:" + new Date().getTime());
if(code == 0){
var obj:object = PlayerData.instance.getSetting("TeamRoom");
if(!obj){
obj = {};
}
obj[GobeUtil.instance.openId] = roomId;
PlayerData.instance.setSetting("TeamRoom", obj);
GobeUtil.instance.isOpenMedia = true;
GobeUtil.instance.mediaEnableMic(false);
GobeUtil.instance.mediaMuteAllPlayers(false);
if(GobeUtil.instance.isRemoveMedia){
GobeUtil.instance.mediaLeaveRoom();
return;
}
}else{
UIManager.instance.showTips("实时语音开启异常:" + code);
}
console.log("------callbackToGmmJoin", code, msg);
ClientEvent.dispatchEvent(Constant.EVENT_NAME.OPEN_MEDIA);
}
window["callbackToGmmMic"] = (roomId:number, openId:string, isMute:boolean) =>{
console.log("callbackToGmmMic", roomId, openId, isMute);
}
window["callbackToGmmLeave"] = (code:number, roomId:string, msg:string) =>{
if(code == 0){
var obj:object = PlayerData.instance.getSetting("TeamRoom");
obj[GobeUtil.instance.openId] = "";
PlayerData.instance.setSetting("TeamRoom", obj);
if(GobeUtil.instance.isRemoveMedia){
GobeUtil.instance.isRemoveMedia = false;
ClientEvent.dispatchEvent(Constant.EVENT_NAME.INIT_MEDIA);
return;
}
}
}
window["callbackToJoinChannel"] = (code:number, roomId:string, msg:string) =>{
if(code == 0){
var obj:object = PlayerData.instance.getSetting("JoinChannel");
if(!obj){
obj = {};
}
obj[GobeUtil.instance.openId] = roomId;
PlayerData.instance.setSetting("JoinChannel", obj);
GobeUtil.instance.isChannelId = true;
if(GobeUtil.instance.isRemoveChannel){
GobeUtil.instance.leaveChannel();
return;
}
}else{
UIManager.instance.showTips("文本语音开启异常:" + code);
}
console.log("---------callbackToJoinChannel", code, msg);
ClientEvent.dispatchEvent(Constant.EVENT_NAME.OPEN_CHANNEL);
}
window["callbackToLeaveChannel"] = (code:number, roomId:string, msg:string) =>{
console.log("time callbackToLeaveChannel:" + new Date().getTime());
if(code == 0){
var obj:object = PlayerData.instance.getSetting("JoinChannel");
obj[GobeUtil.instance.openId] = "";
PlayerData.instance.setSetting("JoinChannel", obj);
GobeUtil.instance.isChannelId = false;
if(GobeUtil.instance.isRemoveChannel){
GobeUtil.instance.isRemoveChannel = false;
ClientEvent.dispatchEvent(Constant.EVENT_NAME.INIT_CHANNEL);
}
}
console.log("---------callbackToLeaveChannel", code, msg);
}
window["callbackToSendMsg"] = (content:string, sendId:string) =>{
console.log("time callbackToSendMsg:" + new Date().getTime());
GobeUtil.instance.msgLst.push({isOwn:true, content:content, sendId:sendId.substring(5)});
ClientEvent.dispatchEvent(Constant.EVENT_NAME.SEND_MSG);
}
window["callbackToRecvMsg"] = (content:string, sendId:string) =>{
console.log("time callbackToRecvMsg:" + new Date().getTime());
GobeUtil.instance.msgLst.push({isOwn:false, content:content, sendId:sendId.substring(5)});
ClientEvent.dispatchEvent(Constant.EVENT_NAME.SEND_MSG);
console.log("callbackToRecvMsg", content);
}
window["callbackToVT"] = (code:number, msg:string) =>{
console.log("time callbackToVT:" + new Date().getTime());
if(code == 0){
ClientEvent.dispatchEvent(Constant.EVENT_NAME.SEND_VT, msg);
}else{
ClientEvent.dispatchEvent(Constant.EVENT_NAME.SEND_VT, "");
}
console.log("callbackToVT", msg);
}
window["callbackToNoPer"] = () =>{
console.log("time callbackToNoPer:" + new Date().getTime());
UIManager.instance.showTips(Constant.ROOM_TIPS.MEDIA_FAIL);
}
window["callbackObsSuccess"] = () =>{
}
window["callbackToStartPgs"] = () =>{
GobeUtil.instance.isOpenPgs = true;
ClientEvent.dispatchEvent(Constant.EVENT_NAME.OPEN_PGS);
}
window["callbackToJosInit"] = (code:number, msg:string) =>{
if(code == Constant.HUAWEI_LOGIN.INIT_SUCCESS){
GobeUtil.instance.isHwInit = true;
}
ClientEvent.dispatchEvent(Constant.EVENT_NAME.HUAWEI_LOGIN_MSG, code, msg);
}