@z77
2018-05-04T08:55:57.000000Z
字数 3485
阅读 1188
今天给大家聊聊,用BmobGameSdk 实现实时对战,实现<棋头并进>小程序的步骤~
import BGS from '../../js/bmobgamesdk/bgsapi';//根据你自己的存放路径更改
let model = BGS.instance;
model.Init('3f729baax0', 'ws://139.159.220.251:29175', function (succ, msg) {
if (succ) {
// 用bmob小程序sdk进行登录注册
// _getUser(listener);
} else{
// 提醒失败,并给重新init的按钮
}
});
import BGS from '../../js/bmobgamesdk/bgsapi';//根据你自己的存放路径更改
let model = BGS.instance;
var userId = Bmob.User.current().id;
model.CreateRoom(userId, 2, function(isOK, res) {
console.log("res >", res);
if (isOK) {
var roomInfo = res.roomInfo;
console.log('对战开房成功', _data);
// 创建房间成功,跳转游戏房间页面,别忘了把房间信息roomInfo传递过去
} else {
common.showModal('对战开房失败,' + res);
}
});
运行游戏,打开network抓包,创建一个房间,查看这个操作的返回结果,返回结果为
{
"address": "a.b.c.d", // 服务器ip
"roomInfo": {
"ports": {
"websocket": efgh // 服务器端口
},
"rid": xxx, // 房间id
"joinKey": yyy // 房间密匙
}
}
这样,你就获得了初始化sdk的第二个参数,是 ws://a.b.c.d:efgh 这样的格式
import BGS from '../../js/bmobgamesdk/bgsapi';//根据你自己的存放路径更改
let model = BGS.instance;
if (this.isConnected)
return;
t('连接房间');
this.mRoomActListener = this.onRoomAction.bind(this);
this.mOfflineListener = this.onOffline.bind(this);
model.RegistRoomActListener(this.mRoomActListener);// 注册系统通知监听,详细参考官网下载的demo
model.RegistOfflineListener(this.mOfflineListener);// 注册掉线通知监听
let emptyFun = function() {};
model.SetGameRuntimeListeners(
emptyFun,//这三个监听器本游戏中没有涉及
emptyFun,
emptyFun,
this.onTransfer.bind(this),// 玩家间交互信息的监听器
this.onCloudNotify.bind(this)//云端代码通知的监听器
);
// 加入房间
// 这里的roomData就是创建房间时让你保存的roomInfo啦
model.JoinRoom(that.roomData.rid, that.roomData.joinKey, userId, model.get('seatKey'), function(isOK, data) {
if (isOK) {
common.toast('加入房间成功');
console.log("房间信息:", data);
let
playerCount = data.playerCount,
no = data.no,
isPlaying = data.isPlaying,
players = data.players,
masterId = data.master;
// 根据返回的房间信息做些保存或处理,这里不详细写出来,大家根据自己的情况灵活变通...
if (data.seatKey)
model.set('seatKey', data.seatKey);
that.isConnected = true;
return;
}
//加入房间失败
if (data.indexOf("204") > -1)
data = "房间已关闭";
else if (data.indexOf("206") > -1)
data = "房间已满员";
else if (data.indexOf("201") > -1)
data = "未知错误";
else if (data.indexOf("203") > -1)
data = "没有登陆";
else if (data.indexOf("208") > -1)
data = "游戏中";
else if (data.indexOf("204") > -1)
data = "房间不存在";
else if (data.indexOf("202") > -1)
data = "参数错误";
console.log('加入房间失败:', data);
}.bind(this));
// 收到客户端的回调
onTransfer(no, res) {
console.log("收到客户端的回调:" + no, res)
let flag = res.shift();
switch (flag) {
case 1: // 下棋
t('收到客户端的下棋数据');
t(res);
break;
case 2: // 被请求悔棋
// ...
}
},
// 收到云端代码服务端的回调
onCloudNotify(notify) {
notify = JSON.parse(model.bytesToString(notify, 0, notify.length));
console.log("收到服务器的回调:", notify);
// ...
},
// 玩家之间交互数据,上面的onTransfer会收到对方发送的
// 要以byte数组形式,一般把数组的第一位作为自定义交互类型flag,后面的为要交互的数据
model.SendTransferToAllExceptSelf([1, ...]);
// sdk特别提供了把string和byte数组互转的方法
model.stringToBytes('string'); // string转byte[]
model.model.bytesToString(bs, 0, bs.length); // byte[]转string
// 调用云端代码,参数为云端代码方法名
model.CloudAction('Ready');
打开 Eclipse 或 Android Studio,创建Java项目,导入 BmobGame_JavaCloud_vx.x.x_xxxxxx.jar,并创建 Player.java 和 Room.java,分别继承自 PlayerBase.class 和 RoomBase.class 后,编写游戏逻辑代码。写好后提交到官网管理后台的云函数处。
这两个java文件的编写主要查看另一篇教程。
//生命周期函数--监听页面卸载
onUnload: function() {
if (this.isConnected) {
// model.SendTransferToAllExceptSelf([4]);// 向对方发送离开信息
model.UnregistOfflineListener(this.mOfflineListener);
model.StopGameRuntimeListener();
this.mOfflineListener = null;
model.QuitRoom();
}
}
以上就是用BGS实现实时对战的步骤,赶快动起手来试一试吧!
加官方客服,小小琪QQ:2967459363
官方群: 634442818
落地成盒?Bmob帮你开发自己的联网"吃鸡"游戏
Unity联网对战游戏小Demo
如何实现各种游戏的思路杂想
微信小游戏即将开放?有我们在,你还赶得上!