轉載請注明出處:http://www.cnblogs.com/zisou/p/xianfan01.html
公司的項目總算告一段落了,年前憋到年后,總算要上線了,所以我也有了時間來搞我自己的游戲項目了,和大多數開發者一樣,或許每個做游戲的心里面都有自己的一個世界屬於自己的一個夢,這次我還要繼續做夢,呵呵。
《仙凡奇緣》官方網站
好了,下面我贅述一下這個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 }
目前主要開發了:登錄,注冊,和創建角色這三個協議,里面都是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 ; } }
里面我封裝了如何發送包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揚帆起航...