以資料為中心,多子產品之間使用全局變量來做消息通知,或者狀态改變,這樣子產品之間沒有直接的聯系。各個子產品都是直接使用全局變量而已。全局變量的問題這裡不探讨。
以我的執行個體講解,遊戲中的英雄(主角)在地圖上自動奔跑到 滑鼠點選的地方,或者網絡信令傳過來的坐标位置上。主角的自動移動方法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->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>->getChildByTag(PC.mapUserInfo.ID);</code>
<code>pc->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>->getChildByTag( PC.mapUserInfo.ID );</code>
<code>PCP->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