4

私が作っているゲームはワードパズルゲームです。たとえば、ユーザーがシングルプレイヤーかマルチプレイヤーかを決定するメニューから始めます。シングルプレイヤーを選択した場合、3 つの異なるモードをプレイするオプションがあります。

  • 練習

タイマーはありません

  • ストレス

プレイヤーは、10 秒以内にパズルを解くことができず「死ぬ」まで、繰り返し 10 秒以内にパズルを解かなければなりません。

  • タイムバトル

プレイヤーは 2 分間でできるだけ多くのパズルを解きます。

ほら、実際のゲームプレイは変わりませんが、唯一の違いは時間の管理方法です。私はあなたの記事を読み、State パターンが非常にうまく適合することを発見しました。今私が抱えている唯一の問題は、そのパターンをどのように実装できるかということです。

メニュー ステートの抽象化とゲーム プレイの抽象化のようにサブ ステートを作成する必要がありますか? それとも、1 つのユニバーサル ゲーム ステートの抽象化を作成してから、「handleMenuSelection」などの呼び出しを無視する必要がありますか?

cocos2dでこれをカバーするオンラインの良いチュートリアルが見つかりません。小さなデモはたくさんありますが、OOP デザイン以外のデザイン パターンに触れたことがない場合、それを大きなアプリケーションに変換するのは困難です。

ところで。あなたのリンクは、新しいアイデアのために私の心を開いてくれました :)

4

2 に答える 2

4

すべての統計を維持する 1 つのシングルトン クラス (共有オブジェクト) があると便利です。

例: MyGame を使用してすべてのゲーム統計を保存するとします。// MyGame.h 内

typedef enum
{
    kGameMode_Practice = 1001,
    kGameMode_Stress,
    kGameMode_TimeBattle,
 }GameMode;



@interface MyGame: NSObject
{
    GameMode  mGameMode;
    int       mHighScore;
} 
@property(nonatomic,assign) GameMode  gameMode;

  @property(nonatomic,assign) int highScore;

+(MyGame*)sharedGameObject;

// MyGame.mm 内

static MyGame *gGame = nil;

  @implementation MyGame
  @synthesize gameMode=mGameMode;
  @synthesize highScore=mHighScore;

 +(MyGame*)sharedGameObject
 {
    if(!gGame)
    {
        gGame = [[MyGame alloc] init];
    }
    return gGame;
 }

 -(void)saveData //Call this from applicationWillResignActive
 {
         NSUserDefaults *userDafs = [NSUserDefaults standardUserDefaults];
         [userDafs setInteger:self.highScore forKey:@"highScore"];
         [userDafs setInteger:self.gameMode forKey:@"gameMode"];

         [[NSUserDefaults standardUserDefaults] synchronize];
 }

 -(void)loadData //call this from UIApplication didFinishLaunchingWithOptions 
 { 
     NSUserDefaults *userDafs = [NSUserDefaults standardUserDefaults];
     self.highScore = [userDafs integerForKey:@"highScore"]
     self.gameMode = (GameMode)[userDafs integerForKey:@"gameMode"]

 }

//メニューボタンを選択してゲームモードを設定できます

 [MyGame sharedGameObject].gameMode = kGameMode_Practice

//ゲーム内の任意の場所をチェックするには

   if([MyGame sharedGameObject].gameMode == kGameMode_Practice)

また、アプリの終了時にこれらの値を保存し、アプリの起動時に同じ値をロードします。

    [[MyGame sharedGameObject] saveData];

ゲームモードに基づいて、ゲームプレイを変更できます。ゲームプレイロジックに単一の一般的なクラスを使用し、ゲームモードを確認して微調整を行います.3つのタイプに対して3つの個別のクラスを設計する場合、将来的にすべてのファイルで1つを更新する必要があります..可能な限り一般的なコードを持つことは良いことです. .

于 2013-06-29T17:13:41.947 に答える
2

情報がほとんどないため、適切な設計ガイドラインを提案することは困難です。少し推測してみると、Strategy Design PatternState Design Pattern (別のリンク) について読むことをお勧めします。これは、あなたがしていることに適している可能性があり、複数のゲームモードを管理するためのクリーンな方法になるからです。 .

于 2013-06-27T16:46:21.157 に答える