2012-07-24 121 views
1

我一直在爲我的遊戲開發服務器代碼。它的功能非常好,但是90%的功能都在1類中。援助與代碼組織?

通常我很容易知道如何劃分東西。每個對象都是一個類,或者每個對話框都是一個類,併爲其子對象處理邏輯。

在這種情況下,服務器收到一個請求,然後告訴其他玩家或進程並通知相應的玩家。

這裏是頭文件:

class ServerCore : public ServerHost, public NetEventListener, 
     public ServerEventProvider 
    { 
     NetEventDecoder m_dec; 
     NetEventEncoder m_enc; 
     LoginManager m_login; 

     ServerPlayerManager m_playerMan; 
     ServerTableManager m_tableMan; 

     void sendToTarget(); 
     void sendToAllActive(); 
     void sendToActiveNotTarget(); 
     void sendToTable(int tableNo); 



    public: 
     ServerCore(); 
     virtual void onConnect (Lacewing::Server::Client &client); 
     virtual void onDisconnect (Lacewing::Server::Client &client); 
     virtual void onError (Lacewing::Error &error); 
     virtual void onReceive (Lacewing::Server::Client &client, char * data, int size); 
     virtual void sendChatMessageC(const std::string& message,ChatAreaEnum area); 
     virtual void requestTableC(int tableNo, int seatNo); 
     virtual void playerRequestSitC(int tableNumber, int seatNumber); 
     virtual void playerStoodUpC(); 
     virtual void hostGameC(const SpadesGameInfo& info); 
     virtual void gameMessageC(SpadesCSMessageEnum message, const std::vector<int>& params); 
     virtual void modifyListC(const std::string& player, GroupTypeEnum group, bool add); 
     virtual void canceledHostingRequestC(); 
     virtual void sendInviteC(int tableNo, const std::string& player); 

     virtual void loginResult(const std::string& name, ServerPlayer* player, 
      const std::string& sessionID, bool success, bool newSession); 
     virtual void readyToReceiveLobbyDataC(); 

     virtual void playerAbandonedGameC(); 
     virtual void watchTableC(int tableNo); 

     virtual void gameCompleted(int tableId); 

     virtual void playerWantsPlayAgainC(); 
     virtual ~ServerCore(void); 
    }; 
} 

我真的不知道我怎麼能打破這種分解成更小的類。它們執行的任務交給其他對象,如身份驗證和數據庫中的數據檢索,但所有事件當前都在這1個文件中處理。

網絡事件解碼器在通過線路接收到的字符串轉換網絡事件解碼器後調用相應的方法。

這樣做的效果很好,但遊戲會變得更大,我希望保持清潔和模塊化。

這個設計是個好主意嗎?如果不是,遊戲服務器開發中通常使用什麼類型的模式來保持事物更加面向對象?

感謝

回答

1

看你的課,command pattern想到的。事實上,以C結尾的方法看起來非常像命令。如果你有一個命令接口:

class Command { 
    virtual void execute() = 0; 
} 

,併爲每個命令一個單獨的子類,那麼NetEventDecoder可以接收到的字符串轉換成特定的命令進行解碼。另外,無論何時您發現自己將相同的數據傳遞給多個方法,這都暗示有一個類隱藏在那裏。例如,您可以將所有將tableNumber轉換爲Table類的方法。我也會擺脫Manager類,並更直接地建立關聯模型。

例如:

// A game server contains players and tables 
class GameServer { 
    map<string, Player *> players; 
    map<int, Table *> tables; 

    Player *findPlayer(const string &name); 
    Table *findTable(int tableNumber); 
    ... 
} 

// A player can perform various actions 
class Player { 
    string name; 

    bool requestSeat(Table *table); 
    void standUp(); 
    ... 
} 

// A table maintains the status of seats 
class Table { 
    int tableNumber; 

    bool requestSeat(int seatNumber); 
    ... 
} 

GameServer類以上簡單模型的遊戲,不與網絡打交道的。然後NetEventDecoderServerCore可以協調以提供網絡功能並調用GameServer上的命令。示例命令可能如下所示:

class PlayerStandUpCommand : public Command { 
    GameServer *server; 
    string playerName; 

    void execute() { 
    Player *player = server->findPlayer(playerName); 
    player->standUp(); 
    } 
}