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.conf
if(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);
}
});
};