• 【cocos2d-x 仙凡奇缘-网游研发(1) 登录&注册】


    转载请注明出处:http://www.cnblogs.com/zisou/p/xianfan01.html

    公司的项目总算告一段落了,年前憋到年后,总算要上线了,所以我也有了时间来搞我自己的游戏项目了,和大多数开发者一样,或许每个做游戏的心里面都有自己的一个世界属于自己的一个梦,这次我还要继续做梦,呵呵。

    《仙凡奇缘》官方网站

    www.xianfancoco.com

    好了,下面我赘述一下这个RPG网游的架构,服务器端由socket+http,语言我用c#,因为以前有了一套比较成熟的后台系统附带了一个tcp通讯协议的轻量级服务监控端。服务端主要还是以HTTP为主,C#的托管机制让我开发服务器变得相当快捷,相当顺当;

    有了上图,大家应该知道了做一个网游不易,一个人恐怕撸不起来。确实,这需要非常多的时间精力,和技术支持;但是我们从简化,从策划,服务端,客户端,任何模块我们都从简(从简不等于不做,是少做,而且做精一个就行),毕竟我们有雄心壮志,也难免实现宏伟目标;

    回归这次主要正题:注册登录;

    服务器端我已经做了提供了如下接口HTTP协议,采用POST协议方式获取客户端的消息:

    部分核心代码内容:

     1 if (!IsPostBack)
     2             {
     3                 APIId = Convert.ToInt32(Request.Form["APIId"]);
     4                 switch (APIId)
     5                 {
     6                     //注册
     7                     case 10000:
     8                         useremail = Request.Form["useremail"];
     9                         pwd = Request.Form["pwd"];
    10                         phonenumber = Request.Form["phonenumber"];
    11                         username = Request.Form["username"];
    12                         returnstring = APIId + "|" + C_user.reguser(useremail, pwd, phonenumber, username) + "|";
    13                         break;
    14                     //登陆
    15                     case 10001:
    16                         useremail = Request.Form["useremail"];
    17                         pwd = Request.Form["pwd"];
    18                         returnstring = APIId+ "|" + C_user.userlogin(useremail, pwd)+ "|" ;
    19                         break;
    20                     //创建角色
    21                     case 10002:
    22                         gamename = Request.Form["gamename"];
    23                         number = Request.Form["number"];
    24                         sex = Request.Form["sex"];
    25                         zhiye = Request.Form["zhiye"];
    26                         returnstring = APIId + "|" + C_user.reguser_passuserinfo(number,gamename,sex,zhiye) + "|";
    27                         break;
    28                     default:
    29                         returnstring = "数据有误";
    30                         break;
    31                 }
    32             }
    View Code

    目前主要开发了:登录,注册,和创建角色这三个协议,里面都是POST协议;

    客户端代码又如何呢?首先我们得有重要的利器(curl)的访问方式,我建立了HttpWebServer.cpp类,并且进行了封装;

    核心代码我贴出来:

    //回调
    size_t HttpWebServer::writehtml(uint8_t* ptr,size_t size,size_t number,void *stream)
    {
        CCLog("%s",ptr);
        string reuturndata = (char*)ptr;
        ToDo::showTip(reuturndata);
        return size*number;//这里一定要放回实际返回的字节数
    }
    
    string HttpWebServer::getReadyForPostData(CCArray* arraydata)
    {
        string datastr = "";
        for (int i = 0; i < arraydata->count(); i++)
        {
            CCString* ccdatastr = (CCString*)arraydata->objectAtIndex(i); 
            if(i==0)
            {
                datastr = ccdatastr->getCString();
            }
            else
            {
                datastr = datastr + "&" + ccdatastr->getCString();
            }
        }
        return datastr;
    }
    
    void HttpWebServer::CurlPost(string url,string postdata)
    {
        //APIId=10000&useremail=747204@qq.com&pwd=ysj55555&phonenumber=18618169949&username=ysj5555520
        //http://www.xianfancoco.com/AListenAPIweb/userComment.aspx
    
        CURL *curl;
        CURLcode res;
        std::string cc;
        curl=curl_easy_init();
        if(curl)
        {
            curl_easy_setopt( curl, CURLOPT_URL, url.c_str()); //请求的地址
            curl_easy_setopt(curl, CURLOPT_POST, true); 
            curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postdata.c_str());
            //启用POST提交 
            curl_easy_setopt( curl, CURLOPT_FOLLOWLOCATION, 23L); 
            curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,writehtml); //处理的函数
            curl_easy_setopt( curl, CURLOPT_WRITEDATA, &cc);        //缓冲的内存
            res=curl_easy_perform(curl);
            if(res!=CURLE_OK)
            {
                //CCLog("联网超时 %i",res);
            }
            curl_easy_cleanup(curl);
        }
        else
        {
            //CCLog("curl is null");
            return ;
        }
    }
    View Code

    里面我封装了如何发送包POST方法和如何组合包的方法,这样使用起来就会相当的简便;

    如服务器需要传:useremail = Request.Form["useremail"];
    那客户端也有对应的POST方式,下面就是我如何发送客户端登录的请求方式:

    CCArray * senddata = CCArray::create();
        string data;
        senddata->addObject(CCString::create("APIId=10001"));
        senddata->addObject(CCString::create("useremail=747204@qq.com"));
        senddata->addObject(CCString::create("pwd=ysj55555"));
        data =  HttpWebServer::getReadyForPostData(senddata);
        HttpWebServer::CurlPost(SERVICES_NAME_USER,data);
        senddata->release();
        TipBaseShowText(this,CCString::create("aaa"),CCString::create("SSS"),1.0f,1.0f,UI_TIP,true);

    这样的封装将是以后我大量的使用的标本,登录和注册是简单的必要的用户操作行为,用户在么有用户名之前需要点击注册;
    注册如下图:

     

    登录界面如下图

    输入框,以及登录或注册返回

    声明一下这次写这系列博客主要是为了分享游戏制作经验,由于这次是个人项目,和公司无关,是否开源还得看游戏3个月以后的情况而定,本游戏所用资源全部来自于商业内部资源;

    2014扬帆起航...

  • 相关阅读:
    mysql 实现 start with
    [URLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]
    163邮箱报错WARN: 535 Error: authentication failed.
    iOS开发SDWebImageOptions理解
    Core Graphices 设置渐变
    iOS 解压Assets.car文件
    Core Graphices 获取上下文
    2019春第五周作业
    2019年春季学期第4周作业.
    2019年春季学期第4周作业
  • 原文地址:https://www.cnblogs.com/zisou/p/xianfan01.html
Copyright © 2020-2023  润新知