您现在的位置: 微信小程序 > 微信小程序开发 > 教程 >

如何将单机下棋游戏改造成联网实时对战下棋小游戏

来源:微信小程序 编辑:Yiyongtong.com 发布时间:2018-05-09 15:52热度:
单机的棋牌类游戏开发起来比较简单,甚至网络上直接有源码下载,但是,想要改造成联网实时对战的下棋小游戏,就需要涉及到熟悉网络协议栈、掌握后端知识以及面对服务器带来的高额成本等难题。
那么,如何避免这些难题,快速的开发出联网实时对战的小游戏呢?
下面我将详细阐述,如何借助第三方Bmob Game SDK 将单机下棋游戏改造成联网实时对战下棋小游戏的过程。
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的按钮
  }
});

4. 创建房间,获得Bgs.instance.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 这样的格式

 

 

5. 加入房间,初始化监听器

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);
  // ...
},
 

6. 实现下棋数据的实时交互

// 玩家之间交互数据,上面的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');

7. 实现云端代码逻辑

8. 离开房间

//生命周期函数--监听页面卸载
  onUnload: function() {
    if (that.battle && that.isConnected) {
      // model.SendTransferToAllExceptSelf([4]);// 向对方发送离开信息
      model.UnregistOfflineListener(this.mOfflineListener);
      model.StopGameRuntimeListener();
      this.mOfflineListener = null;
      model.QuitRoom();
    }
 }

说明:

账号、Demo、SDK获取方式、技术交流:

可加官方客服QQ:2967459363

微信小程序搜索<棋头并进>,体验此款下棋微信小游戏