#推荐
Cocos Creator麻将源代码开发教程第四篇——情怀麻将客户端初始化流程解析

2024-10-02 5,628

情怀麻将客户端初始化流程解析

1. 情怀麻将整体结构图

该部分展示了达达麻将客户端初始化时的整体架构图,包含了主要模块和流程。通过模块间的关系和功能划分,可以清晰了解客户端启动时的操作步骤。

Cocos Creator麻将源代码开发教程第四篇——情怀麻将客户端初始化流程解析

客户端代码结构分析

  1. scripts 文件夹结构:
  • (1) 第三方代码库:包含 socket-io 等第三方网络通信库;
  • (2) Components:游戏中挂载到节点上的组件脚本;
  • (3) 全局对象:放置在代码根目录中的全局管理对象。

Cocos Creator麻将源代码开发教程第四篇——情怀麻将客户端初始化流程解析

Loading 场景

  1. Loading Scene 挂载了对应的脚本文件:LoadingLogic.js

Cocos Creator麻将源代码开发教程第四篇——情怀麻将客户端初始化流程解析

(1)扩展了String对象.format()函数;

String.prototype.format = function(args) { 
    if (arguments.length>0) { 
        var result = this; 
        if (arguments.length == 1 && typeof (args) == "object") { 
            for (var key in args) { 
                var reg=new RegExp ("({"+key+"})","g"); 
                result = result.replace(reg, args[key]); 
            } 
        } 
        else { 
            for (var i = 0; i < arguments.length; i++) { 
                if(arguments[i]==undefined) { 
                    return ""; 
                } 
                else { 
                    var reg=new RegExp ("({["+i+"]})","g"); 
                    result = result.replace(reg, arguments[i]); 
                } 
            } 
        } 
        return result; 
    } 
    else { 
        return this; 
    } 
};

(2) 监听事件push_need_create_role,当收到该事件时,跳转进入创建角色场景。

Cocos Creator麻将源代码开发教程第四篇——情怀麻将客户端初始化流程解析

(3) 若检测到当前环境非网页模式,则隐藏游客登录按钮。

Cocos Creator麻将源代码开发教程第四篇——情怀麻将客户端初始化流程解析

(4) 若本地保存了微信账号信息,则直接执行自动登录操作;

(5) 处理微信账号登录的响应逻辑;

(6) 游客账号登录处理;

Cocos Creator麻将源代码开发教程第四篇——情怀麻将客户端初始化流程解析

Cocos Creator麻将源代码开发教程第四篇——情怀麻将客户端初始化流程解析

若无 account 信息,则尝试从本地存储中获取;若本地没有,则使用时间戳生成一个随机 account

接着通过 http 请求将 account 发送给服务器,回调处理函数为 onAuth

javascript
cc.vv.http.sendRequest("/guest", { account: account }, this.onAuth);
Cocos Creator麻将源代码开发教程第四篇——情怀麻将客户端初始化流程解析

 
var URL = "http://127.0.0.1:9000";
 
exports.master_url = null;
exports.url = null;
exports.token = null;
 
init();
 
function init() {
    exports.master_url = URL;
    exports.url = URL;
}
 
function setURL(url) {
    URL = url;
    init();
};
 
function sendRequest(path, data, handler, extraUrl) {
    var xhr = cc.loader.getXMLHttpRequest();
    xhr.timeout = 5000;
 
    if (data == null) {
        data = {};
    }
    if (exports.token) {
        data.token = exports.token;
    }
 
    if (extraUrl == null) {
        extraUrl = exports.url;
    }
 
    //解析请求路由以及格式化请求参数
    var sendpath = path;
    var sendtext = '?';
    for (var k in data) {
        if (sendtext != "?") {
            sendtext += "&";
        }
        sendtext += (k + "=" + data[k]);
    }
 
    //组装完整的URL
    var requestURL = extraUrl + sendpath + encodeURI(sendtext);
 
    //发送请求
    console.log("RequestURL:" + requestURL);
    xhr.open("GET", requestURL, true);
 
    if (cc.sys.isNative) {
        xhr.setRequestHeader("Accept-Encoding", "gzip,deflate", "text/html;charset=UTF-8");
    }
 
    var timer = setTimeout(function() {
        xhr.hasRetried = true;
        xhr.abort();
        console.log('http timeout');
        retryFunc();
    }, 5000);
 
    var retryFunc = function() {
        sendRequest(path, data, handler, extraUrl);
    };
 
    xhr.onreadystatechange = function () {
        console.log("onreadystatechange");
        clearTimeout(timer);
        if (xhr.readyState === 4 && (xhr.status >= 200 && xhr.status < 300)) {
            // console.log("http res(" + xhr.responseText.length + "):" + xhr.responseText);
            cc.log("request from [" + xhr.responseURL + "] data [", ret, "]");
            var respText = xhr.responseText;
 
            var ret = null;
            try {
                ret = JSON.parse(respText);
            } catch (e) {
                console.log("err:" + e);
                ret = {
                    errcode: -10001,
                    errmsg: e
                };
            }
 
            if (handler) {
                handler(ret);
            }
 
            handler = null;
        }
        else if (xhr.readyState === 4) {
            if(xhr.hasRetried){
                return;
            }
 
            console.log('other readystate == 4' + ', status:' + xhr.status);
            setTimeout(function() {
                retryFunc();
            }, 5000);
        }
        else {
            console.log('other readystate:' + xhr.readyState + ', status:' + xhr.status);
        }
    };
 
    try {
        xhr.send();
    }
    catch (e) {
        //setTimeout(retryFunc, 200);
        retryFunc();
    }
 
    return xhr;
}
 
exports.sendRequest = sendRequest;
exports.setURL = setURL;

服务器中 9000 端口对应的是账号服务器

Cocos Creator麻将源代码开发教程第四篇——情怀麻将客户端初始化流程解析

Cocos Creator麻将源代码开发教程第四篇——情怀麻将客户端初始化流程解析

url 中获取用户的参数信息,如果存在,则使用用户传递的参数进行登录操作。

   //游客登录
    onBtnQuickStartClicked:function(){
        cc.vv.userMgr.guestAuth();
    },

获取本地存储的用户账号信息,若不存在,则根据当前时间戳随机生成一个新账号。

 //游客验证登录
    guestAuth:function(){
        var account = cc.args["account"];
        if(account == null){
            account = cc.sys.localStorage.getItem("account");
        }
        
        if(account == null){
            account = Date.now();
            cc.sys.localStorage.setItem("account",account);
        }
        
        cc.vv.http.sendRequest("/guest",{account:account},this.onAuth);
    },

将游客登录请求发送至服务器进行验证。

cc.vv.http.sendRequest("/guest",{account:account},this.onAuth);

userMgr 发送至账号服务器的响应地址为:/guest

Cocos Creator麻将源代码开发教程第四篇——情怀麻将客户端初始化流程解析

账号服务器响应结果:返回 OK 状态、登录用户信息及大厅服务器的 IP 地址。

 //游客登录服务器返回消息处理
    onAuth:function(ret){
        var self = cc.vv.userMgr;
        if(ret.errcode !== 0){
            console.log(ret.errmsg);
        }
        else{
            self.account = ret.account;
            self.sign = ret.sign;
            cc.vv.http.url = "http://" + cc.vv.SI.hall;//大厅服务器的地址
            self.login();
        }   
    },

userMgr:执行 login 函数进行登录操作。

login:function(){
        var self = this;
        var onLogin = function(ret){
            if(ret.errcode !== 0){
                console.log(ret.errmsg);
            }
            else{
                if(!ret.userid){
                    //jump to register user info.
                    cc.director.loadScene("createrole");
                }
                else{
                    console.log(ret);
                    self.account = ret.account;
        			self.userId = ret.userid;
        			self.userName = ret.name;
        			self.lv = ret.lv;
        			self.exp = ret.exp;
        			self.coins = ret.coins;
        			self.gems = ret.gems;
                    self.roomData = ret.roomid;
                    self.sex = ret.sex;
                    self.ip = ret.ip;
        			cc.director.loadScene("hall");
                }
            }
        };
        cc.vv.wc.show("正在登录游戏");
        cc.vv.http.sendRequest("/login",{account:this.account,sign:this.sign},onLogin);
    },

发送登录请求至大厅服务器,由 client_server.js 提供的接口 /login 进行处理。

Cocos Creator麻将源代码开发教程第四篇——情怀麻将客户端初始化流程解析

Cocos Creator麻将源代码开发教程第四篇——情怀麻将客户端初始化流程解析

服务器返回登陆信息

Cocos Creator麻将源代码开发教程第四篇——情怀麻将客户端初始化流程解析

Cocos Creator麻将源代码开发教程第四篇——情怀麻将客户端初始化流程解析

//配置好响应请求:登录到大厅服务器;
app.get('/login',function(req,res){
	if(!check_account(req,res)){
		return;
	}
	
	var ip = req.ip;
	if(ip.indexOf("::ffff:") != -1){
		ip = ip.substr(7);
	}
	
	var account = req.query.account;
	db.get_user_data(account,function(data){
		if(data == null){
			http.send(res,0,"ok");
			return;
		}
 
		var ret = {
			account:data.account,
			userid:data.userid,
			name:data.name,
			lv:data.lv,
			exp:data.exp,
			coins:data.coins,
			gems:data.gems,
			ip:ip,
			sex:data.sex,
		};
 
		//判断是否在游戏,还是在房间;则直接进当前房间
		//一个账户,不能同时在两个房间里面游戏;
		db.get_room_id_of_user(data.userid,function(roomId){
			//如果用户处于房间中,则需要对其房间进行检查。 如果房间还在,则通知用户进入
			if(roomId != null){
				//检查房间是否存在于数据库中
				db.is_room_exist(roomId,function (retval){
					if(retval){
						ret.roomid = roomId;
					}
					else{
						//如果房间不在了,表示信息不同步,清除掉用户记录
						db.set_room_id_of_user(data.userid,null);
					}
					http.send(res,0,"ok",ret);
				});
			}
			else {
				http.send(res,0,"ok",ret);
			}
		});
	});
});

将用户信息保存至 userMgr 中以便后续操作使用。
Cocos Creator麻将源代码开发教程第四篇——情怀麻将客户端初始化流程解析

跳转并进入大厅场景进行后续操作。

Cocos Creator麻将源代码开发教程第四篇——情怀麻将客户端初始化流程解析

若未获取到用户信息,则跳转至创建角色场景。角色创建完成后,再次执行登录操作。
Cocos Creator麻将源代码开发教程第四篇——情怀麻将客户端初始化流程解析

创建角色场景:用于玩家创建个性化角色信息,包括角色名称、形象等配置

Cocos Creator麻将源代码开发教程第四篇——情怀麻将客户端初始化流程解析


//-------------CreateRole.js--------------------
cc.Class({
    extends: cc.Component,
 
    properties: {
        inputName:cc.EditBox,
        // foo: {
        //    default: null,
        //    url: cc.Texture2D,  // optional, default is typeof default
        //    serializable: true, // optional, default is true
        //    visible: true,      // optional, default is true
        //    displayName: 'Foo', // optional
        //    readonly: false,    // optional, default is false
        // },
        // ...
    },
    
    onRandomBtnClicked:function(){
        var names = [
            "上官",
            "欧阳",
            "东方",
            "端木",
            "独孤",
            "司马",
            "南宫",
            "夏侯",
            "诸葛",
            "皇甫",
            "长孙",
            "宇文",
            "轩辕",
            "东郭",
            "子车",
            "东阳",
            "子言",
        ];
        
        var names2 = [
            "雀圣",
            "赌侠",
            "赌圣",
            "稳赢",
            "不输",
            "好运",
            "自摸",
            "有钱",
            "土豪",
        ];
        var idx = Math.floor(Math.random() * (names.length - 1));
        var idx2 = Math.floor(Math.random() * (names2.length - 1));
        this.inputName.string = names[idx] + names2[idx2];
    },
 
    // use this for initialization
    onLoad: function () {
        cc.vv.utils.setFitSreenMode();
        this.onRandomBtnClicked();
    },
 
    onBtnConfirmClicked:function(){
        var name = this.inputName.string;
        if(name == ""){
            console.log("invalid name.");
            return;
        }
        console.log(name);
        cc.vv.userMgr.create(name);
    }
    // called every frame, uncomment this function to activate update callback
    // update: function (dt) {
 
    // },
});
  1. 场景挂载了 CreateRole 脚本代码

(1) 随机生成一个角色名称;
Cocos Creator麻将源代码开发教程第四篇——情怀麻将客户端初始化流程解析

(2)随机函数绑定到随机按钮;

Cocos Creator麻将源代码开发教程第四篇——情怀麻将客户端初始化流程解析

(3)确定按钮:userMgr创建用户create函数
Cocos Creator麻将源代码开发教程第四篇——情怀麻将客户端初始化流程解析
Cocos Creator麻将源代码开发教程第四篇——情怀麻将客户端初始化流程解析
  1. 创建角色流程

将请求发送至 hallserver,由 client_service.js 处理 /create_user 接口请求。

cc.vv.userMgr.create(name);

Cocos Creator麻将源代码开发教程第四篇——情怀麻将客户端初始化流程解析Cocos Creator麻将源代码开发教程第四篇——情怀麻将客户端初始化流程解析

返回信息继续走原来登陆的流程;

Cocos Creator麻将源代码开发教程第四篇——情怀麻将客户端初始化流程解析

Cocos Creator麻将源代码开发教程第四篇——情怀麻将客户端初始化流程解析

 

收藏 打赏

感谢您的支持,我会继续努力的!

打开USDT(trc-20)扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

Ts:本站所有内容均为互联网收集整理和网友上传。仅限于学习研究,请必须在24小时内删除。否则由此引发的法律纠纷及连带责任本站概不承担。

如侵犯到您的合法权益,请联系我们删除侵权资源!

韩仔技术 搭建教程 Cocos Creator麻将源代码开发教程第四篇——情怀麻将客户端初始化流程解析 https://www.hanzijs.com/dajian/2746.html

相关文章

发表评论
暂无评论