1.用户按下创建按钮

    createRoom: function () {var self = this;var onCreate = function (ret) {if (ret.errcode !== 0) {cc.vv.wc.hide();//console.log(ret.errmsg);if (ret.errcode == 2222) {cc.vv.alert.show("提示", "钻石不足,创建房间失败!");}else {cc.vv.alert.show("提示", "创建房间失败,错误码:" + ret.errcode);}}else {cc.vv.gameNetMgr.connectGameServer(ret);}};var type = this.getType();var conf = null;if (type == 'xzdd') {conf = this.constructSCMJConf();}else if (type == 'xlch') {conf = this.constructSCMJConf();}conf.type = type;var data = {account: cc.vv.userMgr.account,sign: cc.vv.userMgr.sign,conf: JSON.stringify(conf)};console.log(data);cc.vv.wc.show("正在创建房间");cc.vv.http.sendRequest("/create_private_room", data, onCreate);},

请求到大厅服务器的client_service

app.get('/create_private_room',function(req,res){//验证参数合法性var data = req.query;//验证玩家身份if(!check_account(req,res)){return;}var account = data.account;data.account = null;data.sign = null;var conf = data.conf;db.get_user_data(account,function(data){if(data == null){http.send(res,1,"system error");return;}var userId = data.userid;var name = data.name;//验证玩家状态db.get_room_id_of_user(userId,function(roomId){if(roomId != null){http.send(res,-1,"user is playing in room now.");return;}//创建房间room_service.createRoom(account,userId,conf,function(err,roomId){if(err == 0 && roomId != null){room_service.enterRoom(userId,name,roomId,function(errcode,enterInfo){if(enterInfo){var ret = {roomid:roomId,ip:enterInfo.ip,port:enterInfo.port,token:enterInfo.token,time:Date.now()};ret.sign = crypto.md5(ret.roomid + ret.token + ret.time + config.ROOM_PRI_KEY);http.send(res,0,"ok",ret);}else{http.send(res,errcode,"room doesn't exist.");}});}else{http.send(res,err,"create failed.");                    }});});});
});

首先验证玩家信息 ,然后根据账号获取玩家信息,报货uid和昵称,根据uid获取玩家房间号,如果房间号存在,则给出错误提示,

否则调用room_service的createRoom方法

exports.createRoom = function(account,userId,roomConf,fnCallback){var serverinfo = chooseServer();if(serverinfo == null){fnCallback(101,null);return;}db.get_gems(account,function(data){if(data != null){//2、请求创建房间var reqdata = {userid:userId,gems:data.gems,conf:roomConf};reqdata.sign = crypto.md5(userId + roomConf + data.gems + config.ROOM_PRI_KEY);http.get(serverinfo.ip,serverinfo.httpPort,"/create_room",reqdata,function(ret,data){//console.log(data);if(ret){if(data.errcode == 0){fnCallback(0,data.roomid);}else{fnCallback(data.errcode,null);        }return;}fnCallback(102,null);});   }else{fnCallback(103,null);}});
};

这儿先选择了服务器(具体还没看) ,然后获取用户的宝石信息,然后提交到游戏服务器的http服务里面

app.get('/create_room',function(req,res){var userId = parseInt(req.query.userid);var sign = req.query.sign;var gems = req.query.gems;var conf = req.query.confif(userId == null || sign == null || conf == null){http.send(res,1,"invalid parameters");return;}var md5 = crypto.md5(userId + conf + gems + config.ROOM_PRI_KEY);if(md5 != req.query.sign){console.log("invalid reuqest.");http.send(res,1,"sign check failed.");return;}conf = JSON.parse(conf);roomMgr.createRoom(userId,conf,gems,serverIp,config.CLIENT_PORT,function(errcode,roomId){if(errcode != 0 || roomId == null){http.send(res,errcode,"create failed.");return; }else{http.send(res,0,"ok",{roomid:roomId});          }});
});

这儿进行了一些验证操作,最终调用到了 roomMgr的createRoom方法

exports.createRoom = function(creator,roomConf,gems,ip,port,callback){if(roomConf.type == null|| roomConf.difen == null|| roomConf.zimo == null|| roomConf.jiangdui == null|| roomConf.huansanzhang == null|| roomConf.zuidafanshu == null|| roomConf.jushuxuanze == null|| roomConf.dianganghua == null|| roomConf.menqing == null|| roomConf.tiandihu == null){callback(1,null);return;}if(roomConf.difen < 0 || roomConf.difen > DI_FEN.length){callback(1,null);return;}if(roomConf.zimo < 0 || roomConf.zimo > 2){callback(1,null);return;}if(roomConf.zuidafanshu < 0 || roomConf.zuidafanshu > MAX_FAN.length){callback(1,null);return;}if(roomConf.jushuxuanze < 0 || roomConf.jushuxuanze > JU_SHU.length){callback(1,null);return;}var cost = JU_SHU_COST[roomConf.jushuxuanze];if(cost > gems){callback(2222,null);return;}var fnCreate = function(){var roomId = generateRoomId();if(rooms[roomId] != null || creatingRooms[roomId] != null){fnCreate();}else{creatingRooms[roomId] = true;db.is_room_exist(roomId, function(ret) {if(ret){delete creatingRooms[roomId];fnCreate();}else{var createTime = Math.ceil(Date.now()/1000);var roomInfo = {uuid:"",id:roomId,numOfGames:0,createTime:createTime,nextButton:0,seats:[],conf:{type:roomConf.type,baseScore:DI_FEN[roomConf.difen],zimo:roomConf.zimo,jiangdui:roomConf.jiangdui,hsz:roomConf.huansanzhang,dianganghua:parseInt(roomConf.dianganghua),menqing:roomConf.menqing,tiandihu:roomConf.tiandihu,maxFan:MAX_FAN[roomConf.zuidafanshu],maxGames:JU_SHU[roomConf.jushuxuanze],creator:creator,}};if(roomConf.type == "xlch"){roomInfo.gameMgr = require("./gamemgr_xlch");}else{roomInfo.gameMgr = require("./gamemgr_xzdd");}console.log(roomInfo.conf);for(var i = 0; i < 4; ++i){roomInfo.seats.push({userId:0,score:0,name:"",ready:false,seatIndex:i,numZiMo:0,numJiePao:0,numDianPao:0,numAnGang:0,numMingGang:0,numChaJiao:0,});}//写入数据库var conf = roomInfo.conf;db.create_room(roomInfo.id,roomInfo.conf,ip,port,createTime,function(uuid){delete creatingRooms[roomId];if(uuid != null){roomInfo.uuid = uuid;console.log(uuid);rooms[roomId] = roomInfo;totalRooms++;callback(0,roomId);}else{callback(3,null);}});}});}}fnCreate();
};

这儿进行了一些房间参数判断,最后就是实际的创建方法

先生成随机的房间号,如果房间或这在创建存在,则重新执行fnCreate(),否则设置正在创建为true,然后查询数据库,看房间是否存在,如果存在,删除正在创建的,重新执行fnCreate()

如果上面条件都满足,根据参数生成对应的游戏管理器,生成四个座位,把信息写入数据库,在回调函数里会返回uuid,删除正在创建的标志,如果uuid存在,增加总房间数,执行回调,否则,执行错误回调

exports.create_room = function(roomId,conf,ip,port,create_time,callback){callback = callback == null? nop:callback;var sql = "INSERT INTO t_rooms(uuid,id,base_info,ip,port,create_time) \VALUES('{0}','{1}','{2}','{3}',{4},{5})";var uuid = Date.now() + roomId;var baseInfo = JSON.stringify(conf);sql = sql.format(uuid,roomId,baseInfo,ip,port,create_time);console.log(sql);query(sql,function(err,row,fields){if(err){callback(null);throw err;}else{callback(uuid);}});
};

幼麟棋牌创建房间逻辑分析相关推荐

  1. 幼麟棋牌创建房间简短分析

    1.用户创建房间的操作 hall_server->client_service->create_private_room     调用hall_server->room_servic ...

  2. cocos creator麻将教程系列(九)—— 幼麟棋牌代码讲解

    这篇文章是官方整理的: 技术栈 客户端 引擎:Cocos Creator 2.0.6. 语言:Javasctipt 可用开发平台:MAC,Windows 可发布平台: iOS,Android,Wind ...

  3. cocos creator微信棋牌小游戏 幼麟棋牌服务端分析笔记

    新的项目需要做一个微信棋牌小游戏,网上搜了一圈相关的代码. 单就完整性来说,幼麟棋牌的开源代码比较完整(cocosCreator客户端.nodeJs服务端.数据库脚本) 实现了一款房卡麻将基本功能(热 ...

  4. 麒麟子再放大招,据传幼麟棋牌全部版本将开源!

    前段时间有幸被「幼麟棋牌-麒麟子」 邀请加入幼麟游戏研发群,讨论学习游戏开发技术.行业动态等相关内容. 在群中麒麟子透露,出一个重磅消息:"幼麟棋牌全部版本将开源!" 在这里为不了 ...

  5. 幼麟棋牌技术分享系列:H5棋牌游戏加载速度优化

    转自:http://forum.cocos.com/t/h5/52893 HELLO,大家好. 由于业务繁忙,很久没在论坛发技术相关的贴子了. 今天想和大家一起讨论一下当下最重点的问题.<H5加 ...

  6. 幼麟棋牌进入房间逻辑分析

    1.首先进入房间有四种途径 a.进入大厅界面的时候查看是个有oldRoomId,如果有直接进入对应房间 b.大厅界面update方法里看是否有cc.vv.userMgr.roomData,如果有直接进 ...

  7. 开源H5棋牌 cocos creator微信棋牌小游戏 幼麟棋牌客户端分析笔记

    此文紧接上文的服务端分析来进行客户端的分析 LoadingLogic.js  (与初始化场景绑定 初始化各个组件 获取版本信息 加载资源) 1.onload:显示 splash 界面 初始化各个组件 ...

  8. 幼麟棋牌登录socket服务器分析

    登录socket服务器有两个时机,一个是创建完房间没错误后,连接,另一个是用户自行进入房间请求没错后连接 connectGameServer:function(data){this.dissoveDa ...

  9. 幼麟棋牌游戏进程分析

    1.当用户登录到socket之后,会获取房间里的其他用户信息,返回给当前登录用户作为login_result,同时会在房间内广播new_user_comes_push消息,告知其他用户自己的相关信息, ...

最新文章

  1. 转载 Android 多线程处理之多线程用法大集合
  2. 028_CSS外边距
  3. 凡事想开,心情不坏~
  4. 贵阳中职计算机学什么区别,贵阳中职计算机专业
  5. 玩转 SpringBoot 2 快速整合 | Thymeleaf 篇
  6. 它又又又来了,Fastjson 最新高危漏洞来袭!快升级吧
  7. win10定时关机c语言,电脑定时关机win10,电脑定时关机命令-
  8. 2022年第五届中青杯赛题浅评
  9. MLA与APA二种文件格式的文献引用写作技巧
  10. cups支持的打印机列表_使用CUPS打印管理器管理打印机
  11. 12、添加和删除页码符号
  12. 一级标题段前段后一行设置方法
  13. Mac中隐藏/显示文件或文件夹
  14. 3D开发-AR技术方案
  15. 记第一次实战靶场的经验
  16. mysql自旋锁_mysql 自旋锁
  17. android共享win10,如何与Android手机共享Win10笔记本电脑网络
  18. 点击商品进入详情页面
  19. 约瑟夫环问题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。...
  20. [转]机器学习中距离和相似性度量分类体系

热门文章

  1. Mybatis入门笔记
  2. python基础练习题:纳特拼音alaphabeta【难度:1级】--景越Python编程实例训练营,不同难度Python习题,适合自学Python的新手进阶
  3. android 根据宽度调整字体大小,android 字体大小 根据分辨率 自动调整
  4. Java13新增特性
  5. 使用bable打包js
  6. 黑猴子的家:Kali Linux + Vmware 15 安装操作系统
  7. python内置数值运算函数有哪几个_Python这68个内置函数,建议你吃透!
  8. 修改远程计算机 时间,Pubwin服务器时间修改的四种办法
  9. 使用Codemirror的markdown编辑器和使用showdown的Vue.js预览器
  10. ubuntu 改屏幕分辨率命令_Ubuntu修改屏幕分辨率