2013-06-27 3 views
4

Игра, которую я создаю, представляет собой игру-головоломку. Вы начинаете с меню, в котором пользователь решает, чтобы, например, пойти на одного игрока или мультиплеер. Если они выбирают Single Player, то у них есть возможность играть в 3 разных режима.Использование шаблона государственного дизайна для cocos2d

  • Практика

Там нет таймера

  • Stress

Игрок должен сделать головоломки в течение 10 секунд, пока на дисплее не deosn't удастся сделать загадку в течение 10 секунд, и они «умрут»

  • Время битвы

Игрок имеет 2 минуты, чтобы сделать, как много загадок, как это возможно.

Вы видите, что настоящая игра не меняется, но единственное, что меняется, - это то, как управлять временем. Я прочитал ваши статьи, и я обнаружил, что шаблон состояния будет соответствовать довольно приятным, и теперь единственная проблема, с которой я сталкиваюсь, - это то, как я мог реализовать этот шаблон.

Должен ли я делать суб состояния, как в меню состояния абстракции и игры играть абстракции или я должен просто создать одну универсальную игру государственной абстракции, а затем игнорировать вызовы, как «handleMenuSelection»?

Я не могу найти ни одного хорошего учебника, охватывающего это в cocos2d. Я могу найти множество небольших демонстраций, но трудно преобразовать их в большое приложение, когда я никогда не касался шаблона проектирования, помимо дизайна ООП.

КПП. ваши ссылки были очень полезны, открывая мои мысли для новых идей :)

ответ

4

Хорошо иметь один одноэлементный класс (общий объект), который поддерживает всю статистику.

Пример: Say 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 (неатомический, назначьте) INT рекорды;

+(MyGame*)sharedGameObject; 

// В MyGame.мм

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

Это то, что я бы использовал лично - я считаю, что одноэлемент, который вы можете вытащить из настроек, является самым простым методом реализации того, что вы хотите. –

+0

Я думаю, что это тоже полезно, но в итоге вы получаете столько же, если и переключатели, и код станет как гарнитура в кармане. Я также буду поддерживать мультиплеер позже в игре. Я бы просто положил bool в игровом менеджере, рассказывая, много ли он или нет? Мультиплеер будет по очереди, поэтому игра не будет зависеть от него, кроме того, разрешены только некоторые из режимов игры. (нет необходимости в бесконечном режиме практики, когда многопользовательская) – chrs

+0

Да, как и HighScore, вы можете использовать еще одну переменную bool для поддержания состояния многопользовательской игры или нет. Надеюсь, у вас есть идея. Также вам нужно сохранить и загрузить эту статистику в NSUserDefaults в начале и конце игры. – Guru

2

Трудно предложить хороший дизайн, учитывая, что информации очень мало. Попытавшись немного догадаться, я предлагаю вам прочитать о Strategy Design Pattern и State Design Pattern (another link), поскольку он может быть подходящим для того, что вы делаете, и это будет чистый способ управления несколькими режимами игры.