leaf 和cocos creator 游戏实战(二)注册与登陆

栏目: 编程语言 · IOS · 发布时间: 5年前

内容简介:把lobby.proto 复制到LeafServerCocosClient node_modules.bin文件夹下,把proto文件编译成静态文件使用:把protocol.js 和protocol.d.ts拷贝到LeafServerCocosClient assets\script\protocol文件夹中.

mongodb的安装及配置,参考下文:

https://blog.csdn.net/heshushun/article/details/77776706

proto注册协议扩展:

1.服务端:

编译 lobby.proto 文件(对此不了解?请先阅读《 在 Golang 中使用 Protobuf 》一文)得到 lobby.pb.go 文件,命令如下:

protoc --go_out=. lobby.proto

将lobby.pb.go 放在LeafServerExample src/msg文件夹下。

2.客户端:

把lobby.proto 复制到LeafServerCocosClient node_modules.bin文件夹下,把proto文件编译成静态文件使用:

pbjs -t static-module -w commonjs -o protocol.js lobby.proto
pbts -o protocol.d.ts protocol.js

把protocol.js 和protocol.d.ts拷贝到LeafServerCocosClient assets\script\protocol文件夹中.

3.lobby.proto:

syntax = "proto3";
package msg;

enum Result {
    REGISTER_SUCCESS=0;
    REGISTER_FAIL=1;
    LOGIN_SUCCESS=2;
    LOGIN_FAIL=3;
}

message Test {
    string Test = 2;
}

// 用户登陆协议
message UserLogin  {
    string LoginName = 1;   // 用户名
    string LoginPW =2;      // 密码
}
// 注册协议
message UserRegister {
    string LoginName =1;    // 用户名
    string LoginPW =2;      // 密码
}
// 消息返回协议
message UserResult {
    Result RetResult =1;
    string ErrorInfo = 2;
}

// 玩家有角色的情况
message UserST {
    string UID    =1;       // 账号ID
    string ServerID =2;     // 服务器ID
    string RoleUID  =3;     // 角色UID
    string RoleName =4;     // 角色名字
    string RoleLev =5;      // 角色等级
    string Coin  =6;        // 金币
    // 其他的暂时不做定义
}

向当前模块(game 模块)注册 消息处理函数

func init() {
    handler(&msg.UserLogin{}, handleUserLogin)
    handler(&msg.UserRegister{}, handleUserRegister)
}

处理相关消息

func handleUserRegister(args []interface{}) {
    m := args[0].(*msg.UserRegister)
    a := args[1].(gate.Agent)
    name :=m.GetLoginName()
    pwd :=m.GetLoginPW()
    log.Debug("receive UserRegister name=%v", m.GetLoginName())

    reg := regexp.MustCompile(`/^[a-zA-Z\d]\w{2,10}[a-zA-Z\d]$/`)
    matched := reg.FindString(name)
    if(matched!=" "){
        log.Debug("UserRegister name is licit", )
    }
    err := mongodbmgr.Find("game","login",bson.M{"name":name,})
    if err == nil {
        fmt.Println(err)
        log.Debug("UserRegister find in fail", )
        retBuf := &msg.UserResult{
            RetResult: msg.Result_REGISTER_FAIL,
            ErrorInfo:"账号已存在!",
        }
        a.WriteMsg(retBuf)
    }
    err =mongodbmgr.Insert("game","login",bson.M{"name":name,"password":pwd})
    if err != nil {
        fmt.Println(err)
        log.Debug("UserRegister write in fail", )
        retBuf := &msg.UserResult{
            RetResult: msg.Result_REGISTER_FAIL,
            ErrorInfo:"注册失败,请稍后再试!",
        }
        a.WriteMsg(retBuf)
    } else{
        log.Debug("UserRegister write in success", )
        retBuf := &msg.UserResult{
            RetResult: msg.Result_REGISTER_SUCCESS,
        }
        a.WriteMsg(retBuf)
    }
}
func handleUserLogin(args []interface{}) {
    m := args[0].(*msg.UserLogin)
    a := args[1].(gate.Agent)
    log.Debug("receive UserLogin name=%v", m.GetLoginName())

    retBuf := &msg.UserResult{
        RetResult: msg.Result_LOGIN_SUCCESS,
        ErrorInfo:"登陆失败,请稍后再试!",
    }
    a.WriteMsg(retBuf)
}

初始化时连接mongodb

package mongodbmgr

import (
    "fmt"
    "github.com/name5566/leaf/db/mongodb"
    "github.com/name5566/leaf/log"
    "gopkg.in/mgo.v2"
    "gopkg.in/mgo.v2/bson"
)

// 连接消息
var dialContext = new(mongodb.DialContext)

func init() {
    Connect()
}
func Connect() {
    c, err := mongodb.Dial("localhost", 10)
    if err != nil {
        fmt.Println(err)
        return
    }
    //defer c.Close()
    // index
    c.EnsureUniqueIndex("game", "login", []string{"name"})
    log.Release("mongodb Connect success")
    dialContext = c

    Test()
}
func Test() {
    err :=Find("game","login",bson.M{"name":"hello"})
    if err == nil {
        log.Debug("Test have data,regFail!", )
    }else{
        err =Insert("game","login",bson.M{"name":"hello","password":"123456"})
        if err != nil {
            fmt.Println(err)
            log.Debug("Test write in fail", )
        }
    }
}

func Example() {
    c, err := mongodb.Dial("localhost", 10)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer c.Close()

    // session
    s := c.Ref()
    defer c.UnRef(s)
    err = s.DB("test").C("counters").RemoveId("test")
    if err != nil && err != mgo.ErrNotFound {
        fmt.Println(err)
        return
    }

    // auto increment
    err = c.EnsureCounter("test", "counters", "test")
    if err != nil {
        fmt.Println(err)
        return
    }
    for i := 0; i < 3; i++ {
        id, err := c.NextSeq("test", "counters", "test")
        if err != nil {
            fmt.Println(err)
            return
        }
        fmt.Println(id)
    }

    // index
    c.EnsureUniqueIndex("test", "counters", []string{"key1"})

    // Output:
    // 1
    // 2
    // 3
}

func Find(db string, collection string, docs interface{}) error{
    c:=dialContext
    s := c.Ref()
    defer c.UnRef(s)

    type person struct {
        Id_ bson.ObjectId `bson:"_id"`
        Name string `bson:"name"`
    };
    user:=new(person);
    err := s.DB(db).C(collection).Find(docs).One(&user)
    //idStr:=user.Id_.Hex()
    //fmt.Println(idStr)
    if err != nil {
        fmt.Println(err)
        return err
    }

    return err;
}

// goroutine safe
func Insert(db string, collection string, docs interface{}) error {
    c:=dialContext
    s := c.Ref()
    defer c.UnRef(s)

    //// 创建索引
    //index := mgo.Index{
    //  Key:        []string{"name"}, // 索引字段, 默认升序,若需降序在字段前加-
    //  Unique:     true,             // 唯一索引 同 mysql 唯一索引
    //  DropDups:   true,             // 索引重复替换旧文档,Unique为true时失效
    //  Background: true,             // 后台创建索引
    //}
    //if err := s.DB(db).C(collection).EnsureIndex(index); err != nil {
    //  fmt.Println(err)
    //  return err
    //}
    //if err := s.DB(db).C(collection).EnsureIndexKey("$2dsphere:location"); err != nil { // 创建一个范围索引
    //  fmt.Println(err)
    //  return err
    //}

    err := s.DB(db).C(collection).Insert(docs)
    if err != nil {
        fmt.Println(err)
        return err
    }

    return err
}

Cocos creator客户端注册及登陆

简单的合法性判断 工具

import messageDialog from './MessageDialog';
interface CheckRet{
    ret:boolean,
    msg:string
}
interface message{
    title:string,
    text:string
}
export default class Utils {
    //检测用户名是否合法
    static check_usr(str:string):CheckRet{
        let c=<CheckRet>{};
        var b :RegExp=/^[a-zA-Z\d]\w{2,10}[a-zA-Z\d]$/;
        if (b.test(str)) {
            c.ret = true;
            c.msg = "用戶名合法";
        }
        else {
            c.ret = false;
            c.msg = "用戶名不合法";
        }

        return c;
    }
    
    
    //判断密码输入是否合法,一个是长度,一个是没有特殊字符
    static check_psw(str:string):CheckRet{
        let c=<CheckRet>{};
        if(str.length > 5 && str.length<21){
            c.ret = true;
            c.msg = "";
        }else {
            c.ret = false;
            c.msg = "密码长度不合规范";
        }
        var b:RegExp =/^[a-zA-Z\d]\w{2,10}[a-zA-Z\d]$/;
        if (b.test(str)) {
            c.ret = true;
            c.msg = "";
        }else {
            c.ret = false;
            c.msg = "密码字符不合规范";
        }

        return c;
    }

        
    //判断手机号码格式是否合法
    static check_tel(str:string):CheckRet{
        let c=<CheckRet>{};
        var regx=/^(?:13\d|15\d|18[123456789])-?\d{5}(\d{3}|\*{3})$/;
        if(regx.test(str)){
            c.ret = true;
            c.msg = "";
        }else{
            c.ret = false;
            c.msg = "手机号不合规范";
        }

        return c;
    }
    
        
    //判断邮箱地址格式是否合法
    static check_mail(str:string):CheckRet{
        let c=<CheckRet>{};
        var regm = /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;//验证Mail的正则表达式,^[a-zA-Z0-9_-]:开头必须为字母,下划线,数字,
        if (str.match(regm)){
            c.ret = true;
            c.msg = "";
            
        } else{
            c.ret = false;
            c.msg = "邮箱地址不合规范";
        }

        return c;
    }

    static showTips(title:string,text:string){
        messageDialog.getInstance().showTips({title:title,text:text})
    }
}

注册流程

import NetMessageCtrl  from './NetMessageCtrl';
import Utils from './Utils';
const {ccclass, property} = cc._decorator

@ccclass
export default class Register extends cc.Component {

    @property(cc.EditBox)
    Name: cc.EditBox = null;

    @property(cc.EditBox)
    Pwd: cc.EditBox = null;

    onLoad(){
           
    }

    onBtnPanel(){
        this.node.parent.active = false
    }

    onBtnComfirm(){
        var name = this.Name.string;
        var pwd = this.Pwd.string;
        if(name && pwd){
            let check = Utils.check_usr(name)
            let checkPwd = Utils.check_psw(name)
            if(check.ret){
                if(checkPwd.ret){
                    NetMessageCtrl.getInstance().sendRegister(name,pwd);
                }
                else{
                    Utils.showTips("提示",checkPwd.msg)
                }
            }
            else{
                Utils.showTips("提示",check.msg)
            }
        }
        else{
            Utils.showTips("提示","请输入完整注册数据")
        }
    }
}

处理收到的回信

dealMessage(id: number,data: Uint8Array ){
      switch(id){
            case netConfig.ProtocolId.Test:
                this.dealTest(data)
                break;
            case netConfig.ProtocolId.UserResult:
                this.dealUserResult(data)
                break;
            default:
                break;
        }
    }

  //注册登陆登一系列用户行为的结果都通过netConfig.ProtocolId.UserResult协议返回
   dealUserResult(data: Uint8Array){
        console.log("get UserResult message!");
        let gameMsg = msg.UserResult.decode(data);
        console.log(gameMsg);
    }

Example gihub地址:

server: https://github.com/ddkgo/LeafServerExample.git

client: https://github.com/ddkgo/LeafServerCocosClient.git


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

创业36条军规

创业36条军规

孙陶然 / 中信出版社 / 2011-12 / 39.00元

《创业36军规》的作者孙陶然是一位数次成功创业的创业者,书中的内容有关创业的方方面面,从创业目的到股东选择,从经营到管理,从找方向到项目细节不一而足,写给每位心怀创业理想或正在创业路上的读者。 很多教人成才的书,作者未必成才;很多教人炒股的书,作者并不炒股;很多教人创业的书,作者不曾成功创业。一起来看看 《创业36条军规》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码