天天看點

C++解耦合的一種方法

以資料為中心,多子產品之間使用全局變量來做消息通知,或者狀态改變,這樣子產品之間沒有直接的聯系。各個子產品都是直接使用全局變量而已。全局變量的問題這裡不探讨。

以我的執行個體講解,遊戲中的英雄(主角)在地圖上自動奔跑到 滑鼠點選的地方,或者網絡信令傳過來的坐标位置上。主角的自動移動方法setAutoMovePos這裡不細說

原來的做法如下代碼

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<code>//Map.cpp檔案</code>

<code>//滑鼠按下事件</code>

<code>bool</code> <code>Map::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)</code>

<code>{</code>

<code>CCPoint point = pTouch-&gt;getLocation();</code>

<code>//擷取滑鼠點選地圖的 地圖坐标</code>

<code>float</code> <code>x = point.x - getPositionX();</code>

<code>float</code> <code>y = point.y - getPositionY();</code>

<code>//擷取主角的精靈控件</code>

<code>Player* pc  = (Player*)</code><code>this</code><code>-&gt;getChildByTag(PC.mapUserInfo.ID);</code>

<code>pc-&gt;setAutoMovePos( (</code><code>int</code><code>)x, (</code><code>int</code><code>)y );</code><code>//引擎會幫助主角自動移動的</code>

<code>//表示 這個事件已經截獲,不再往下一層進發了</code>

<code>return</code> <code>true</code><code>;</code>

<code>}</code>

<code>//設定主角自動尋路</code>

<code>void</code> <code>Map::auto_routing(</code><code>void</code><code>)</code>

網絡信令解析玩家的代碼片段如下

<code>//xiyou_unpack.cpp檔案</code>

<code>//230   自動尋路</code>

<code>void</code> <code>xiyou_unpack::unpack_MAP_AUTO_ROUTING(</code><code>char</code><code>* data, int32 len)</code>

<code>PC.mapUserInfo.map_destination_x= unpack.unpack_GET_H();</code>

<code>PC.mapUserInfo.map_destination_y= unpack.unpack_GET_H();</code>

<code>if</code><code>( xiyou_game::getGameState() == XIYOU_STATE_MAP )</code>

<code>map.auto_routing();</code>

以上代碼就可以說明問題了,在xiyou_unpack.cpp檔案中需要引入Map.h,這樣2個不同的子產品就被耦合在一起了。

以下是用主角的資料為中心将xiyou_unpack.cpp與Map.cpp徹底分開,用PC的資料做聯系的代碼示例。

PC的資料增加布爾變量PC.mapUserInfo.isAutoMove辨別是否開始自動移動。

22

23

<code>//設定自動移動</code>

<code>PC.mapUserInfo.isAutoMove = </code><code>true</code><code>;</code>

<code>PC.mapUserInfo.map_destination_x = (</code><code>int</code><code>)x;</code>

<code>PC.mapUserInfo.map_destination_y = (</code><code>int</code><code>)y;</code>

<code>return</code> <code>true</code><code>;</code><code>//表示 這個事件已經截獲,不再往下一層進發了</code>

<code>//地圖重新整理函數,每幀都會調用</code>

<code>void</code> <code>Map::mapUpdate(</code><code>float</code> <code>dt)</code>

<code>if</code><code>( PC.mapUserInfo.isAutoMove )</code>

<code>PC.mapUserInfo.isAutoMove = </code><code>false</code><code>;</code>

<code>Player* PCP  = (Player*)</code><code>this</code><code>-&gt;getChildByTag( PC.mapUserInfo.ID );</code>

<code>PCP-&gt;setAutoMovePos( PC.mapUserInfo.map_destination_x, PC.mapUserInfo.map_destination_y );</code>

這樣在地圖重新整理的每幀裡都做PC是否要自動移動的判斷,如果需要則自動移動。

在看信令解析子產品的位置修改

<code>PC.mapUserInfo.isAutoMove = </code><code>true</code><code>;       </code><code>//開始自動尋路</code>

這樣在信令到達用戶端的時候,自需要将PC的資料修改即可,地圖子產品在刷PC的資料,當刷到開始自動尋路的時候也獲得到PC的目的地坐标,則可開始自動行走了!

如上xiyou_unpack.cpp檔案裡沒有了Map的對象,也就不用引入Map類了,這2個子產品就互不關心了,達到解耦合目的!

本文轉自 kome2000 51CTO部落格,原文連結:http://blog.51cto.com/kome2000/1289167

繼續閱讀