以數據為中心,多模塊之間使用全局變量來做消息通知,或者狀態改變,這樣模塊之間沒有直接的聯系。各個模塊都是直接使用全局變量而已。全局變量的問題這裡不探討。
以我的實例講解,游戲中的英雄主角)在地圖上自動奔跑到 鼠標點擊的地方,或者網絡信令傳過來的坐標位置上。主角的自動移動方法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個模塊就互不關心了,達到解耦合目的!
本文出自 “鍵碼視窗” 博客,謝絕轉載!