以數據爲中心,多模塊之間使用全局變量來做消息通知,或者狀態改變,這樣模塊之間沒有直接的聯繫。各個模塊都是直接使用全局變量而已。全局變量的問題這裏不探討。
以我的實例講解,遊戲中的英雄(主角)在地圖上自動奔跑到 鼠標點擊的地方,或者網絡信令傳過來的座標位置上。主角的自動移動方法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個模塊就互不關心了,達到解耦合目的!