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);
}
});
};