BK.Room 房间

游戏管理类

成员变量

变量 类型 名称 备注
gameId number 游戏id
roomId number 房间id
mId string 当前用户的openId
ownerId string 房主的openId
status number 房间状态 1 已创建房间,2 游戏中房间
environment number 网络环境 NETWORK_ENVIRONMENT_QQ_RELEASE /0 手Q环境正式发布、NETWORK_ENVIRONMENT_QQ_DEBUG /1 手Q环境调试环境、NETWORK_ENVIRONMENT_DEMO_DEV/2 demo工程开发环境

成员方法

createAndJoinRoom(gameId,masterOpenId,callback)

房主创建并加入房间

参数:

参数 类型 名称 备注
gameId number 游戏id
masterOpenId string 创建者openid
callback function 回调函数 function (statusCode,room) 其中statusCode 参考文档最下方错误码表。room为BK.Room对象

返回值:无

例子:

  1. var game = new BK.Room();
  2. BK.Director.ticker.add(function(ts,duration){
  3. game.updateSocket();
  4. });
  5. game.createAndJoinRoom(gameId,masterOpenId,function (statusCode,room) {
  6. if(statusCode == 0){
  7. BK.Script.log(0,0,"加入房间成功");
  8. BK.Script.log(0,0,"当前玩家:");
  9. room.currentPlayers.forEach(function(player) {
  10. BK.Script.log(1,1,"recvJoinRoom opeid:"+player["openId"] ); //openid
  11. BK.Script.log(1,1,"recvJoinRoom joinTs:"+player["joinTs"] );//加入的时间戳
  12. BK.Script.log(1,1,"recvJoinRoom status:"+player["status"] );//玩家状态 1用户在游戏中 2 用户加入后离开 3 用户等待加入
  13. }, this);
  14. });

createAndJoinFixedRoom(gameId,masterOpenId,fixedRoomId,callback)

房主使用固定房间号创建房间。environment属性需设置为 NETWORK_ENVIRONMENT_DEMO_DEV 才可使用

参数:

参数 类型 名称 备注
gameId number 游戏id
masterOpenId string 房主openid
fixedRoomId number 房间号
callback function 请求回调 每次有人加入时都会回调

返回值: 无

例子:

  1. var game = new BK.Room();
  2. game.isDebug = true;
  3. //添加到ticker中进行定时刷新
  4. BK.Director.ticker.add(function(ts,duration){
  5. game.updateSocket();
  6. });
  7. var fixedRoomId = 231;
  8. game.createAndJoinFixedRoom(gameId,masterOpenId,fixedRoomId,function (statusCode,room) {
  9. if(statusCode == 0){
  10. BK.Script.log(0,0,"固定房间号-加入房间成功");
  11. BK.Script.log(0,0,"当前玩家:");
  12. room.currentPlayers.forEach(function(player) {
  13. BK.Script.log(1,1,"recvJoinRoom opeid:"+player["openId"] );
  14. BK.Script.log(1,1,"recvJoinRoom joinTs:"+player["joinTs"] );
  15. BK.Script.log(1,1,"recvJoinRoom status:"+player["status"] );
  16. }, this);
  17. })

queryAndJoinRoom(gameId,roomId,joinerOpenId,callback)

参加者加入房间

参数:

参数 类型 名称 备注
gameId number 游戏id
roomId number 房间号 手Q环境中从GameStatusInfo.roomId获取
joinerOpenId string 参加者openid
callback function 请求回调 每次有人加入时都会回调

返回值: 无

例子:

  1. var game2 = new BK.Room();
  2. game2.isDebug = true;
  3. var roomId = 255235804494484; //
  4. //添加到ticker中进行定时刷新
  5. BK.Director.ticker.add(function(ts,duration){
  6. game2.updateSocket();
  7. });
  8. //PS:. 房主在参加者加入房前 ,不能startGame,否则无法加入房间
  9. game2.queryAndJoinRoom(gameId,roomId,joinerOpenId,function(statusCode,room){
  10. if(statusCode == 0){
  11. BK.Script.log(0,0,"queryAndJoinRoom statusCode:"+ statusCode);
  12. BK.Script.log(0,0,"当前玩家:");
  13. room.currentPlayers.forEach(function(player) {
  14. BK.Script.log(1,1,"recvJoinRoom opeid:"+player["openId"] );
  15. BK.Script.log(1,1,"recvJoinRoom joinTs:"+player["joinTs"] );
  16. BK.Script.log(1,1,"recvJoinRoom status:"+player["status"] );
  17. }, this);
  18. }else{
  19. BK.Script.log(0,0,"加入房间失败。statusCode:"+statusCode);
  20. }
  21. });

startGame(callback)

开始游戏

参数:

参数 类型 名称 备注
callback function 回调函数 function (statusCode)statusCode 参考文档最下方错误码表

返回值:无

例子:

  1. game.startGame(function (statusCode) {
  2. BK.Script.log(0,0,"开始游戏!statusCode:"+statusCode);
  3. };

setStartGameCallback(callback)

监听开始游戏事件

参数:

参数 类型 名称 备注
callback function 回调函数 function (statusCode)statusCode 参考文档最下方错误码表

返回值:无

例子:

  1. game.setStartGameCallback(function (statusCode) {
  2. BK.Script.log(0,0,"开始游戏!statusCode:"+statusCode);
  3. };

leaveRoom(callback)

离开游戏

参数:

参数 类型 名称 备注
callback function 回调函数 形如 function (statusCode,leaveInfo) 其中statusCode 参考文档最下方错误码表。leaveInfo 为Object类型,只有logOutId属性,为离开者openid

返回值:无

例子:

  1. game.leaveRoom(function (statusCode, leaveInfo) {
  2. BK.Script.log(0,0,"离开游戏!statusCode:"+statusCode);
  3. };

syncOpt(statusBuf,optBuf,extendBuf,itemListBuf,callback)

发送帧同步操作命令

参数:

参数 类型 名称 备注
statusBuf BK.Buffer 预留buffer
opt BK.Buffer 自定义数据 用户需要同步的数据,开发者可以自定义。发送后可在帧同步监听函数中获取
extendBuf BK.Buffer 自定义数据 扩展预留buffer
itemListBuf BK.Buffer 道具buffer
callback function 回调

返回值:无

例子:

  1. //预留字段,暂时填0
  2. var status = new BK.Buffer(1,1);
  3. status.writeUint8Buffer(0);
  4. //用户定义的字段
  5. var str = "ABC";
  6. //往buffer中写入string时,需多申请3个字节大小
  7. var opt = new BK.Buffer(str.length+3,1);
  8. opt.writeStringBuffer(str);
  9. BK.Script.log(1,1,"sync !!!!!send frame 1");
  10. //预留字段
  11. var extend = new BK.Buffer(1,1);
  12. extend.writeUint8Buffer(0);
  13. //send
  14. game.syncOpt(status,opt,extend,undefined,function(ackSeq){
  15. BK.Script.log(1,1,"sync !!!!!后台确认号recv ack= "+ackSeq);
  16. });

setFrameSyncListener(listener)

设置帧同步监听函数

参数:

参数 类型 名称 备注
listener function 监听函数 形如 function func(frameDataArray)

其中监听函数中frameDataArray为一个二维数组。第一维 代表当前推送有n帧第二维 代表当前帧中有m个用户的操作

返回值:无

例子:

  1. game.setFrameSyncListener(function (frameDataArray) {
  2. var frameCount = frameDataArray.length;
  3. for (var index = 0; index < frameDataArray.length; index++) {
  4. var playersOpt =frameDataArray[index];
  5. if(playersOpt){
  6. for (var i = 0; i < playersOpt.length; i++) {
  7. var player = playersOpt[i];
  8. var openId = player.openId; //用户openid
  9. var itemId = player.itemId; // 用户使用的道具id
  10. var buff = player.dataBuffer.;// BK.Buffer对象。用户发送的自定义对象.
  11. //此处的dataBuffer即是 sendSyncOpt例子中所说的 ope。此处使用readUint8Buffer后,取出的值便是 1111
  12. var cmd = player.dataBuffer.readUint8Buffer();
  13. }
  14. }
  15. }
  16. };

queryFrameData(beginFrame, count, callback)

查询指定帧的帧数据

参数:

参数 类型 名称 备注
beginFrame number 要查询的帧数据的起始帧id
count number 要查询的帧数据的帧数
callback function 回调函数 形如 function func(frameDataArray)

其中监听函数中frameDataArray为一个二维数组。第一维 代表当前推送有n帧第二维 代表当前帧中有m个用户的操作

返回值:无

例子:

  1. game.queryFrameData(beginFrame, count, function (errCode,frameDataArray) {
  2. if(errCode != 0){
  3. //错误返回
  4. }else{
  5. //正常返回
  6. var frameCount = frameDataArray.length;
  7. for (var index = 0; index < frameDataArray.length; index++) {
  8. var playersOpt =frameDataArray[index];
  9. if(playersOpt){
  10. for (var i = 0; i < playersOpt.length; i++) {
  11. var player = playersOpt[i];
  12. var openId = player.openId; //用户openid
  13. var itemId = player.itemId; // 用户使用的道具id
  14. var buff = player.dataBuffer.;// BK.Buffer对象。用户发送的自定义对象.
  15. //此处的dataBuffer即是 sendSyncOpt例子中所说的 ope。此处使用readUint8Buffer后,取出的值便是 1111
  16. var cmd = player.dataBuffer.readUint8Buffer();
  17. }
  18. }
  19. }
  20. }
  21. });

sendBroadcastData(buff)

向房间内所有玩家发送广播消息
参数 类型 名称 备注
buff BK.Buffer 发送的数据

返回值:无

例子:

  1. var req = 'This is a message!';
  2. //当BK.Buffer作为网络传输载体,且可能混杂多种不同类型数据时,需要额外分配3个自己
  3. var data = new BK.Buffer(req.length+3);
  4. data.writeStringBuffer(req);
  5. game.sendBroadcastData(data);

setBroadcastDataCallBack(callback)

监听广播消息

参数:

参数 类型 名称 备注
callback function 回调函数

返回值:无

例子:

  1. game.setBroadcastDataCallBack(function (fromId,))

setUserData(buff,callback)

设置当前游戏云端存储目前为每个用户每个游戏可存储的大小为64K空间。如需扩容,需联系腾讯后台开发人员
参数 类型 名称 备注
buff BK.Buffer 设置的的数据

返回值:无

例子:

  1. game.setUserData(userDataBuf,function(retCode){
  2. BK.Script.log(1,1,"设置云端存储 返回 = "+retCode );
  3. });

getUserData(roomId,callback)

获取当前游戏云端存储

参数:

参数 类型 名称 备注
roomId number 房间id 此处传入roomid是用于后台标识,后台存储的还是以游戏为单位
callback function 回调函数 返回错误码查看后面

返回值:无

例子:

  1. //获取云端存储数据
  2. game.getUserData(room.roomId,function (retCode,buf) {
  3. BK.Script.log(1,1,"设置云端存储 返回 = "+retCode );
  4. });

matchGame(gameId,OpenId,callBack)

开始陌生人匹配

参数:

参数 类型 名称 备注
gameId int 游戏id
openId String 玩家id
callBack function 回调函数 形如 function func(statusCode)

这里的callback是匹配之后后台直接返回加入匹配队列成功,真正匹配成功还需要使用查询接口做轮询

返回值:无

例子(结合查询接口):

  1. var isMatchGame = 3;//GameStatusInfo.gameMode; 这里的gameMode=3表示游戏启动方式是陌生人匹配
  2. var shouldQueryMatch = false;
  3. var tickerCount = 0;
  4. if(isMatchGame == 3){
  5. game.matchGame(GameStatusInfo.gameId,GameStatusInfo.openId,function(statusCode){
  6. if(statusCode == 0){
  7. shouldQueryMatch = true;
  8. BK.Script.log(1,1,"matchGame callBack");
  9. }
  10. });
  11. }
  12. //添加到ticker中进行定时刷新
  13. BK.Director.ticker.add(function(ts,duration){
  14. tickerCount++;
  15. if(shouldQueryMatch && tickerCount%180 == 0){
  16. game.queryMatchGame(GameStatusInfo.gameId,GameStatusInfo.openId,function(statusCode){
  17. if(statusCode == 2011){
  18. shouldQueryMatch = false;
  19. BK.Script.log(1,1,"queryMatchGame callBack fail----timeout");
  20. return;
  21. }
  22. if(game.roomId > 0){ //每180帧去轮询一把 如果匹配成功,房间号会直接写入game.roomId,再拿这个roomId走正常查询房间流程
  23. shouldQueryMatch = false;
  24. BK.Script.log(1,1,"queryMatchGame callBack succ");
  25. } else{
  26. BK.Script.log(1,1,"queryMatchGame callBack fail");
  27. }
  28. });
  29. }
  30. game.updateSocket();
  31. });

queryMatchGame(gameId,openId,callBack)

查询匹配

参数:

参数 类型 名称 备注
gameId int 游戏id
openId String 玩家id
callBack function 回调函数 形如 function func(statusCode)

这里是在加入匹配队列后去轮询,回调函数里面的timeout如果为1代表匹配超时了,应该取消轮询,如果没有超时则判断game.roomId的值,这个值为0则继续轮询,如果大于0则进入查询房间的正常流程

例子: 同matchGame的例子

quitMatchGame(gameId,openId,callBack)

退出匹配

参数:

参数 类型 名称 备注
gameId int 游戏id
openId String 玩家id
callBack function 回调函数 形如 function func(statusCode)

这里是在玩家加入加入游戏匹配后,退出匹配时通知给服务器。需要注意退出后,玩家需要通过queryRoom接口查询获取是否有玩家退出匹配。

例子:

  1. game2.quitMatchGame(gameId,masterOpenId,function(status)
  2. {
  3. if (status == 0)
  4. BK.Script.log(0,0," quit math success");
  5. });
  6. //获取有无玩家退出或退出玩家数量
  7. game2.queryRoom(gameId,roomId,masterOpenId,function(status,roominfo)
  8. {
  9. if (status ==0) {
  10. BK.Script.log(0,0," game2.queryRoom "+ + " 退出人数:"+roominfo.ext_num);
  11. }
  12. else
  13. {
  14. BK.Script.log(0,0," game2.queryRoom "+status );
  15. }
  16. })

sendKeepAlive()

发送心跳

参数:无返回值:无

setDisconnectNetCallBack(callback)

监听网络断线

参数:

参数 类型 名称 备注
callback function 断线回调

返回值:无

例子:

  1. var room = new BK.Room();
  2. ...
  3. room.setDisconnectNetCallBack(function(){
  4. //断线逻辑
  5. });

reConnectAndJoinRoom()

重新连接房间注意事项:网络断线后,请求重连房间的操作由游戏侧去管理。游戏侧需要控制请求的频率。而频率不可过于频繁,如1秒钟发起1000次重连请求。

参数:无

返回值:无

例子:

  1. var room = new BK.Room();
  2. ...
  3. room.setDisconnectNetCallBack(function(){
  4. //请求重连。切记请求重连频率不可以过于频繁
  5. room.reConnectAndJoinRoom()
  6. });

setReJoinRoomCallBack(callback)

监听重连结果调用BK.Room.reConnectAndJoinRoom()后,重连结果回调

参数:

参数 类型 名称 备注
callback function 重连成功回调 具体function类型如下例子。statueCode为number类型,具体错误码在本页最下方

返回值:无

例子:

  1. var room = new BK.Room();
  2. ...
  3. room.setReJoinRoomCallBack(function(statueCode){
  4. //断线重连结果
  5. });
  6. room.setDisconnectNetCallBack(function(){
  7. //请求重连。切记请求重连频率不可以过于频繁
  8. room.reConnectAndJoinRoom()
  9. });

后台错误码

错误码 说明
0 成功
1000 包体长度检查非法
1001 魔术字非法
1002 前端命令字非法
1003 后端命令字非法
1004 后端命令来源非法
1005 FromId非法
1006 ST解密失败
1007 使用STKEY界面请求包失败
1008 ST过期
1009 系统异常
1010 版本太低
1011 请求频率限制
1012 获取l5失败
2001 初始化访问存储失败
2002 查询存储失败
2003 更新存储失败
2004 删除存储失败
2005 获取服务配置错误
2006 通知游戏网关创建失败
2007 获取房间ID失败 或者 指定的房间ID不可用
2008 非法命令
2009 房间id不存在
2010 在黑名单
2011 陌生人匹配超时
3000 查询房间信息失败
3001 房间状态异常
3002 请求开始游戏的用户并非房主
3003 用户未在房间内
3004 更新时间戳异常
3005 请求登出LOGOUTID与fromid不一致
3006 当前服务器处于不可服务状态
3007 当前服务器活跃用户数超过限制
3008 当前服务器活跃房间数超过限制
3009 房间ID已经存在不能再创建
3010 用户离开房间处理失败
3011 用户加入房间发生系统异常
3012 用户重复加入房间
3013 房间已满员
3014 创建房间失败,系统异常
3015 玩家已经加入房间,不允许挑战影子
4000 下行消息转发失败
4001 上行消息转发失败

例子

位置:script/Demo/net/frameSync_demo.js**

原文: https://hudong.qq.com/docs/engine/api/BK.Room.html