2d網路遊戲開發(網路篇)(六)
在前面的章節中,我們實現了乙個簡單的聊天室。今天,我們仍然要圍繞這個主題,但採取別的方法,這個方法很有用,應該說是整個網路引擎的關鍵,它就是――rpc(remote procedure calls),翻譯成中文就可以理解成」遠端功能呼叫」。
通常情況下,你傳送乙個資訊,你必須實現下面的四個步驟:
1.建乙個資料報來儲存你的資料; 2.
必須建立乙個函式來實現資料報的編碼和傳送; 3.
建立乙個資料報識別函式,用來識別你的資料報,以便於你呼叫哪個函式來處理它; 4.
最後 建立乙個函式來解碼你的資料報並且處理它。
以上就是我們在編寫網路程式要做的四個步驟。
但raknet已經為你做好了這一切,那就是rpc,有了它,你只用實現兩個步驟,這樣你就有更多的時間集中到遊戲上。
1.將你的資料編碼; 2.
然後呼叫遠端系統的乙個相應函式來處理它.
rpc在你的遊戲中實現的過程如下:
a.告訴網路系統允許使用rpc呼叫函式
當然,你不需要rpc呼叫系統中的任何乙個函式,這樣勢必為你帶來很多的麻煩。你只需要幾個用rpc引數定義的函式就行了,你可以照著下面的例子來定義你的rpc函式。
c函式
void myfunction(rpcparameters *rpcparameters) {}
// 客戶端指標
rakclient *rakclient;
//註冊成為
rpcregister_as_remote_procedure_call(rakclient, myfunction);
c++靜態函式
static void myclass::myfunction(rpcparameters *rpcparameters) {}
// 客戶端指標
rakclient *rakclient;
//註冊成為
rpcregister_as_remote_procedure_call(rakclient, myclass::myfunction);
c++成員函式
class myclass : public networkidgenerator ;
//客戶端指標
rakclient *rakclient;
//註冊成為
rpcregister_class_member_rpc(rakclient, myclass, func1)
伺服器的註冊同上一樣。
b.給你的資料編碼
你的rpc方法能夠處理乙個有長度的字串或位元流,這就等同於將資料打包。
c.呼叫rpc函式進行處理
d.在遠端系統上相應的函式將對你的資料進行處理
以上就是rpc的處理過程。
下面,我們來看一下rpc的引數和結構:
char * input; 來自於遠端系統的資料;
unsigned int numberofbitsofdata; 我們接收的資料的大小;
playerid sender; 哪乙個系統呼叫這個rpc;
rakpeerinte***ce * recipient; rakpeer中的哪乙個例項將得到這次呼叫;
bool hastimestamp; 如果為真,那麼輸入的開始4個位元組表示時間;
raknet::bitstream * replytosender 用相應的資料流回應傳送者.
下面,我們來具體地看一下**:
char message1[300];
void printmessage(rpcparameters *rpcparameters)
}
下面,我們來具體地講解這個函式。
message1用於儲存得到的資訊。首先,我們列印我們得到的資訊,然後判斷我們是否是伺服器,如果是,那麼就呼叫客戶端的rpc.
這裡這個rpc函式原型如下:
bool rakserver::rpc ( char * uniqueid,
const char * data,
unsigned int bitlength,
packetpriority priority,
packetreliability reliability,
char orderingchannel,
playerid playerid,
bool broadcast,
bool shifttimestamp,
objectid objectid,
raknet::bitstream * replyfromtarget
) [virtual, inherited]
第乙個引數,我們註冊的rpc函式名;
第二個引數,我們要傳送的資料;
第三個引數,傳送的資料的大小;
第四個引數,資料報的安全級別,和send函式一樣;
第五個引數,資料報的可靠性,和send函式一樣;
第六個引數,和send函式一樣;
第七個引數,接收者id;
第八個引數,是否廣播;
第九個引數,與時間有關,以後講解;
第十個引數,如果是靜態函式,直接設定成
unassigned_object_id
第十乙個引數,保留。
if (rakserverinte***ce)
else
在伺服器或客戶端註冊rpc。
gets(message);
if(rakserverinte***ce)
else
得到資訊,然後呼叫rpc。
其它**不用改動,程式執行的效果如下:
圖注1
圖注2ok,今天的內容就到這裡了。
http://popul.jqcq.com)遊戲開發欄目,如你需要遊戲開發方面的書籍請參考金橋書城遊戲頻道(
如果你在使用
sdl時有什麼問題,請到金橋科普**(
http://popul.jqcq.com)遊戲開發欄目,我將詳細地為你解答。
2D網路遊戲開發(網路篇)(二)
2d網路遊戲開發 網路篇 二 在上一章中,我簡單的講解了什麼是raknet,它有那些好處。在這一章中,我們將講解如何在ide中配置raknet,並將測試乙個程式。由於raknet的作者使用的是vc net,所以在作者的主頁上,他詳細地講解了如何在vc net中配置raknet,如果你使用的vc ne...
2D網路遊戲開發(網路篇)(九)
2d網路遊戲開發 網路篇 九 前言 轉眼之間,就來到了這一系列教程的第九課來了,事先宣告一下,這些文章大多 於raknet的官方 或者例程。如果你覺得我的文章有地方看不懂,那也請你原諒我,因為我也和你一樣,也是重頭學習這個函式庫。在這種情況下,我還是請你閱讀它官方 上的。位元流簡介 描述 bitst...
2D遊戲開發(2)
每次給遊戲新增新功能時,通常也會引入一些新設定。為了讓所有的設定進行統一管理,我們可以配置乙個名為 setting的模組,這個模組中包含乙個setting的類,用來儲存所有的設定。usr bin env python3.5 filename setting 儲存所有的設定 class setting...