2D網路遊戲開發(網路篇)(六)

2021-04-08 11:18:42 字數 3194 閱讀 4675

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...