以數據為中心,多模塊之間使用全局變量來做消息通知,或者狀態改變,這樣模塊之間沒有直接的聯系。各個模塊都是直接使用全局變量而已。全局變量的問題這裡不探討。
以我的實例講解,游戲中的英雄主角)在地圖上自動奔跑到 鼠標點擊的地方,或者網絡信令傳過來的坐標位置上。主角的自動移動方法setAutoMovePos這裡不細說
原來的做法如下代碼
//Map.cpp文件 //鼠標按下事件 bool Map::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) { CCPoint point = pTouch->getLocation(); //獲取鼠標點擊地圖的 地圖坐標 float x = point.x - getPositionX(); float y = point.y - getPositionY(); //獲取主角的精靈控件 Player* pc = (Player*)this->getChildByTag(PC.mapUserInfo.ID); pc->setAutoMovePos( (int)x, (int)y );//引擎會幫助主角自動移動的 //表示 這個事件已經截獲,不再往下一層進發了 return true; } //設置主角自動尋路 void Map::auto_routing(void) { //獲取主角的精靈控件 Player* pc = (Player*)this->getChildByTag(PC.mapUserInfo.ID); pc->setAutoMovePos( (int)x, (int)y );//引擎會幫助主角自動移動的 }
網絡信令解析玩家的代碼片段如下
//xiyou_unpack.cpp文件 //230 自動尋路 void xiyou_unpack::unpack_MAP_AUTO_ROUTING(char* data, int32 len) { PC.mapUserInfo.map_destination_x= unpack.unpack_GET_H(); PC.mapUserInfo.map_destination_y= unpack.unpack_GET_H(); if( xiyou_game::getGameState() == XIYOU_STATE_MAP ) { map.auto_routing(); } }
以上代碼就可以說明問題了,在xiyou_unpack.cpp文件中需要引入Map.h,這樣2個不同的模塊就被耦合在一起了。
以下是用主角的數據為中心將xiyou_unpack.cpp與Map.cpp徹底分開,用PC的數據做聯系的代碼示例。
PC的數據增加布爾變量PC.mapUserInfo.isAutoMove標識是否開始自動移動。
//Map.cpp文件 //鼠標按下事件 bool Map::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) { CCPoint point = pTouch->getLocation(); float x = point.x - getPositionX(); float y = point.y - getPositionY(); //設置自動移動 PC.mapUserInfo.isAutoMove = true; PC.mapUserInfo.map_destination_x = (int)x; PC.mapUserInfo.map_destination_y = (int)y; return true;//表示 這個事件已經截獲,不再往下一層進發了 } //地圖刷新函數,每幀都會調用 void Map::mapUpdate(float dt) { if( PC.mapUserInfo.isAutoMove ) { PC.mapUserInfo.isAutoMove = false; Player* PCP = (Player*)this->getChildByTag( PC.mapUserInfo.ID ); PCP->setAutoMovePos( PC.mapUserInfo.map_destination_x, PC.mapUserInfo.map_destination_y ); } }
這樣在地圖刷新的每幀裡都做PC是否要自動移動的判斷,如果需要則自動移動。
在看信令解析模塊的位置修改
//xiyou_unpack.cpp文件 //230 自動尋路 void xiyou_unpack::unpack_MAP_AUTO_ROUTING(char* data, int32 len) { PC.mapUserInfo.map_destination_x= unpack.unpack_GET_H(); PC.mapUserInfo.map_destination_y= unpack.unpack_GET_H(); PC.mapUserInfo.isAutoMove = true; //開始自動尋路 }
這樣在信令到達客戶端的時候,自需要將PC的數據修改即可,地圖模塊在刷PC的數據,當刷到開始自動尋路的時候也獲得到PC的目的地坐標,則可開始自動行走了!
如上xiyou_unpack.cpp文件裡沒有了Map的對象,也就不用引入Map類了,這2個模塊就互不關心了,達到解耦合目的!
本文出自 “鍵碼視窗” 博客,謝絕轉載!