程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C++解耦合的一種方法

C++解耦合的一種方法

編輯:關於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個模塊就互不關心了,達到解耦合目的!

 

本文出自 “鍵碼視窗” 博客,謝絕轉載!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved