cocos creator麻将教程系列(六)—— 达达麻将的游戏流程

本文详细介绍了达达麻将从登陆游戏服务器到开始游戏的完整流程,包括客户端连接、麻将场景初始化、定缺操作以及游戏操作步骤,如出牌、检测合法性和游戏循环等。
摘要由CSDN通过智能技术生成

达达麻将游戏流程

达达麻将版图

 

登陆到游戏服务器

1:客户端GameNetMgr.js, connectGameServer连接到游戏服务器,并发送”login”命令; 

var sd = {
                token:data.token,
                roomid:data.roomid,
                time:data.time,
                sign:data.sign,
            };

2:服务器socket_service.js 监听到login事件:    


//启动服务
exports.start = function(conf,mgr){
	config = conf;
	
	var httpServer = require('http').createServer(app);
	io = require('socket.io')(httpServer);
	httpServer.listen(config.CLIENT_PORT);
	//监听是否有客户端连接进来,如果有客户连接进来就会调用这个函数
	//为这个客户创建一个socket通道
	io.sockets.on('connection',function(socket){
		//监听一个事件,然后data,客户端发送过来的数据
		//数据使用的是json协议的编码,来进行数据交换;底层发送json文本;
		socket.on('login',function(data){
			//转成json格式数据
			data = JSON.parse(data);
			if(socket.userId != null){
				//已经登陆过的就忽略
				return;
			}
			var token = data.token;
			var roomId = data.roomid;
			var time = data.time;
			var sign = data.sign;

			console.log(roomId);
			console.log(token);
			console.log(time);
			console.log(sign);

			
			//检查参数合法性
			if(token == null || roomId == null || sign == null || time == null){
				console.log(1);
				socket.emit('login_result',{errcode:1,errmsg:"invalid parameters"});
				return;
			}
			
			//检查参数是否被篡改
			var md5 = crypto.md5(roomId + token + time + config.ROOM_PRI_KEY);
			if(md5 != sign){
				console.log(2);
				//emit发送一个事件
				socket.emit('login_result',{errcode:2,errmsg:"login failed. invalid sign!"});
				return;
			}
			
			//检查token是否有效
			if(tokenMgr.isTokenValid(token)==false){
				console.log(3);
				socket.emit('login_result',{errcode:3,errmsg:"token out of time."});
				return;
			}
			
			//检查房间合法性
			var userId = tokenMgr.getUserID(token);
			var roomId = roomMgr.getUserRoom(userId);

			userMgr.bind(userId,socket);
			socket.userId = userId;

			//返回房间信息
			var roomInfo = roomMgr.getRoom(roomId);
			
			var seatIndex = roomMgr.getUserSeat(userId);
			roomInfo.seats[seatIndex].ip = socket.handshake.address;

			var userData = null;
			var seats = [];
			for(var i = 0; i < roomInfo.seats.length; ++i){
				var rs = roomInfo.seats[i];
				var online = false;
				if(rs.userId > 0){
					online = userMgr.isOnline(rs.userId);
				}

				seats.push({
					userid:rs.userId,
					ip:rs.ip,
					score:rs.score,
					name:rs.name,
					online:online,
					ready:rs.ready,
					seatindex:i
				});

				if(userId == rs.userId){
					userData = seats[i];
				}
			}

			//通知前端
			var ret = {
				errcode:0,
				errmsg:"ok",
				data:{
					roomid:roomInfo.id,
					conf:roomInfo.conf,
					numofgames:roomInfo.numOfGames,
					seats:seats
				}
			};
			socket.emit('login_result',ret);

			//通知其它客户端
			userMgr.broacastInRoom('new_user_comes_push',userData,userId);
			
			socket.gameMgr = roomInfo.gameMgr;

			//玩家上线,强制设置为TRUE
			socket.gameMgr.setReady(userId);

			socket.emit('login_finished');

			if(roomInfo.dr != null){
				var dr = roomInfo.dr;
				var ramaingTime = (dr.endTime - Date.now()) / 1000;
				var data = {
					time:ramaingTime,
					states:dr.states
				}
				userMgr.sendMsg(userId,'dissolve_notice_push',data);	
			}
		});

(1)检查参数的合法性,根据token获取uid, 建立uid 与socket的联系;    

userMgr.bind(userId,socket);
socket.userId = userId;

(2)获取房间信息,(进入房间的时候保存了座位号(roomid, seatIndex));    

var roomId = roomMgr.getUserRoom(userId);

(3)配置好当前的座位的ip地址    

var roomInfo = roomMgr.getRoom(roomId);

(4)遍历roomInfo里面所有的座位,将作为信息的数据全部打包好;    

                if(userId == rs.userId){
					userData = seats[i];
				}

(5)login_result事件发送给链接进来的客户端;    

			//通知前端
			var ret = {
				errcode:0,
				errmsg:"ok",
				data:{
					roomid:roomInfo.id,
					conf:roomInfo.conf,
					numofgames:roomInfo.numOfGames,
					seats:seats
				}
			};
			socket.emit('login_result',ret);

数据保存到全局的GameNetMgr里面

(6)把这个用户进来的消息,广播给其他的用户,其他的用户看到这个进来了;    

//通知其它客户端
			userMgr.broacastInRoom('new_user_comes_push',userData,userId);

(7)通知玩家上线了,如果4个人凑齐了,开始新一局;

socket.gameMgr = roomInfo.gameMgr;
//玩家上线,强制设置为TRUE
socket.gameMgr.setReady(userId);

 

麻将场景客户端

1: mjgame场景挂载了MJGame.js与MahjongMgr.js 两个脚本;

注:新框架新添加了Alert.js脚本,是3个。

2: MJGame.js onLoad:添加了其它功能的一些组件;

    onLoad: function () {
        cc.vv.utils.setFitSreenMode();
        this.addComponent("NoticeTip");
        this.addComponent("GameOver");
        this.addComponent("DingQue");
        this.addComponent("PengGangs");
        this.addComponent("MJRoom");
        this.addComponent("TimePointer");
        this.addComponent("GameResult");
        this.addComponent("Chat");
        this.addComponent("Folds");
        this.addComponent("ReplayCtrl");
        this.addComponent("PopupMgr");
        this.addComponent("HuanSanZhang");
        this.addComponent("ReConnect");
        this.addComponent("Voice");
        this.addComponent("UserInfoShow");
        this.addComponent("Status");
        
        this.initView();
        this.initEventHandlers();
        
        this.gameRoot.active = false;
        this.prepareRoot.active = true;
        this.initWanfaLabel();
        this.onGameBeign();
        cc.vv.audioMgr.playBGM("bgFight.mp3");
        cc.vv.utils.addEscEvent(this.node);
    },

3: initView: 初始化场景, 隐藏不需要的;

initView:function(){
        
        //搜索需要的子节点
        var gameChild = this.node.getChildByName("game");
        
        this._mjcount = gameChild.getChildByName('mjcount').getComponent(cc.Label);
        this._mjcount.string = "剩余" + cc.vv.gameNetMgr.numOfMJ + "张";
        this._gamecount = gameChild.getChildByName('gamecount').getComponent(cc.Label);
        this._gamecount.string = "" + cc.vv.gameNetMgr.numOfGames + "/" + cc.vv.gameNetMgr.maxNumOfGames + "局";

        var myselfChild = gameChild.getChildByName("myself");
        var myholds = myselfChild.getChildByName("holds");

        this._chupaidrag = gameChild.getChildByName(&#
网传资源,如有侵权请联系/留言,资源过大上传乃是下载链接的ZIP文件。 目录: ├─1javascript程序设计9 T& b/ o% ?' h G! b' Y' X/ y │ 第001课初识node_js.rar │ 第002课JS基本数据_函数对象_表_数组_字符串_函数调用.rar* H x0 z) f4 B3 { │ 第003课JS运算表达式_条件判断_循环语句_垃圾回收.rar │ 第004课JSMath函数_数组_表_字符串_常用接口.rar │ 第005课JS模块_new_类_继承.rar1 f2 V3 A& R5 x3 Z │ ├─2creator客户端游戏开发 │ 第001课初识creator.rar+ P+ m" }! v( C& I │ 第002课cc.Node(一)场景树.rar │ 第003课cc.Node(二)事件响应.rar J. G) e" Z/ O( V% m9 i │ 第004课cc.Node(三)坐标空间的转换.rar │ 第005课cc.Node(四)Action的使用.rar │ 第006课cc.Component的使用详解.rar │ 第007课Sprite组件的使用详解.rar │ 第008课Button组件使用详解.rar │ 第009课Label组件使用详解.rar G5 [4 B8 `& ]/ b │ 第010课AudioSource组件的使用.rar' D' [8 n/ _) w% C1 v6 H │ 第011课动画编辑器的使用.rar$ N1 Y4 L$ J, g# L, c) x* T4 s* @ │ 第012课骨骼动画组件的使用.rar& G. _4 U0 u; U0 V: p% | │ 第013课mask_layout_scrollview组件的使用.rar {& g, [) W2 l0 b# t) M& V │ 第014课cc_loader代码加载和释放资源.rar │ 第015课cc.Widget与屏幕适配.rar0 D. n! ?4 l* K; c0 R │ 第023课creator_滚动列表动态加载数据.rar │ 第024课creator_h5打包发布优化技巧_android环境搭建与打包发布.rar │ 第025课creator_cc.director与资源加载策略.rar │ ) L& {! H9 r5 C7 x x2 q/ z2 t5 O: [ ├─3node.js游戏服务器开发& C7 h( i* c {* D! E │ 第006课node事件循环_process模块的基本使用.rar │ 第007课TCP网络传送的基本原理.rar- K7 a" O9 M* r0 h- q h6 U │ 第008课node.js使用Net模块搭建TCPserver_client.rar │ 第009课node.js二进制数据与Buffer模块.rar │ 第010课node.js_npm模块的安装和加载.rar! o O' O- ]0 G! t: R3 U │ 第011课node.js_websocket与ws模块使用.rar │ 第012课node.js_TCP通讯拆包与封包.rar7 L5 Y4 X, V$ v# H" c$ {0 Q │ 第013课node.js_二进制数据协议与JSON数据协议.rar │ 第014课node.js_http基础与express_webserver搭建.rar9 [5 x$ @3 Y" v: U7 e* Z │ 第015课node.js_http_server与http_client_get_post编码基本流程和实现.rar# Y/ a6 M$ d8 f │ 第016课node.js_fs模块的同步异步读写.rar4 R7 X5 @# a4 v │ 第017课node.js_Base64_MD5_SHA1_Timer模块.rar │ 第018课node.js_mysql数据库的基本使用.rar4 h5 v, n; ?' t7 ^ h# Z. x │ 第019课node.js使用mysql模块编程操作数据库.rar! D& Y* ]+ t: U: }; F │ 第020课redis的搭建和基本使用.rar' c G% x. A+ e0 d- H, ^9 D& v │ 第021课noderedis编程和使用.rar/ \2 o& J% @# k1 F │ 9 I4 R$ V( {: n- b. B* Z/ B B └─4麒麟棋牌达达麻将框架设计与源码分析 第001课麒麟棋牌_达达房卡麻将安装和导入使用注意事项.rar' B$ u+ j# Z) F7 N 第002课麒麟棋牌_达达麻将的底层通讯express框架与socket.io.rar 第003课麒麟棋牌_达达麻将开房间流程.rar 第004课达达麻将客户端初始化流程.rar- B% H! q% ]( _+ s8 |. B 第005课达达麻将开房间.rar 第006课达达麻将游戏流程.rar! g- h. f3 m4 G 第007课达达麻将打包与发布.rar' e: p$ l* j1 K; Z1 R! ?: t: Y 第008课达达麻将语音聊天源码分析.rar 麒麟游戏达达麻将.zip
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值