原始代碼中,xiyou_unpack.cpp(網絡層)直接調用 Map::auto_routing(),導致:
① 網絡層依賴地圖層頭文件
② 雙向編譯依賴,單元測試困難
③ 業務邏輯散落在多模塊,難以維護
原則:模塊間零直接調用,僅通過共享數據結構(全局/單例 PC)隱式通信。
角色分工:
- 輸入層(鼠標/網絡) → 寫入意圖數據
- 邏輯層(地圖幀更新) → 讀取意圖、執行、清除標記
// 原始:Map.cpp 直接持有 Player 指針調用
bool Map::ccTouchBegan(...) {
Player* pc = (Player*)getChildByTag(...);
pc->setAutoMovePos(x, y); // 緊耦合
}
void xiyou_unpack::unpack_MAP_AUTO_ROUTING(...) {
map.auto_routing(); // 網絡層依賴 Map
}
// 共享數據結構擴展
struct MapUserInfo {
int map_destination_x, map_destination_y;
bool isAutoMove = false; // 新增:意圖標記
} PC.mapUserInfo;
// Map.cpp:輸入處理 → 寫數據
bool Map::ccTouchBegan(CCTouch* pTouch, CCEvent* pEvent) {
CCPoint pt = pTouch->getLocation();
PC.mapUserInfo.map_destination_x = pt.x - getPositionX();
PC.mapUserInfo.map_destination_y = pt.y - getPositionY();
PC.mapUserInfo.isAutoMove = true; // 發起意圖
return true;
}
// Map.cpp:幀更新 → 讀數據、執行、清標記
void Map::mapUpdate(float dt) {
if (PC.mapUserInfo.isAutoMove) {
PC.mapUserInfo.isAutoMove = false; // 消費意圖
Player* pc = (Player*)getChildByTag(PC.mapUserInfo.ID);
pc->setAutoMovePos(PC.mapUserInfo.map_destination_x,
PC.mapUserInfo.map_destination_y);
}
}
// xiyou_unpack.cpp:網絡信令 → 僅寫數據,零 Map 依賴
void xiyou_unpack::unpack_MAP_AUTO_ROUTING(char* data, int len) {
PC.mapUserInfo.map_destination_x = unpack.unpack_GET_H();
PC.mapUserInfo.map_destination_y = unpack.unpack_GET_H();
PC.mapUserInfo.isAutoMove = true; // 發起意圖
}
| 指標 | 重構前 | 重構後 |
|---|---|---|
| 編譯依賴 | 網絡層 → Map.h | 雙向無依賴 |
| 單元測試 | 需構造完整 Map | 構造 PC 數據即可 |
| 新增輸入源 | 修改 Map 類 | 僅寫 PC 數據 |
| 邏輯集中度 | 分散 | Map::mapUpdate 唯一執行點 |
「數據為中心」是游戲開發、實時系統解耦的經典模式,將控制流依賴轉化為數據流依賴,實現模塊獨立演化。