私は自分のゲームのサーバーコードに取り組んできました。それは本当にうまく機能しますが、関数の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つのファイルで処理されています。
ネットイベントデコーダは、ネットワーク経由で受信した文字列から変換した後、適切なメソッドを呼び出します。
この方法でそれを行うことは非常にうまくいきますが、ゲームは大きくなるでしょう、そして私はクリーンでモジュール式であり続けたいです。
このデザインは良い考えですか?そうでない場合、ゲームサーバーの開発では、オブジェクト指向を維持するために通常どのような種類のパターンが使用されますか?
ありがとう