C++解耦合的一種方法

以數據爲中心,多模塊之間使用全局變量來做消息通知,或者狀態改變,這樣模塊之間沒有直接的聯繫。各個模塊都是直接使用全局變量而已。全局變量的問題這裏不探討。

 

以我的實例講解,遊戲中的英雄(主角)在地圖上自動奔跑到 鼠標點擊的地方,或者網絡信令傳過來的座標位置上。主角的自動移動方法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個模塊就互不關心了,達到解耦合目的!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章