IOS 7 SpriteKit - Создание игровых меню/кнопок (Сцены и другие контроллеры представлений)

Итак, я начал работать над проектом в SpriteKit, и я надеюсь, что смогу реализовать сцену "главного меню" с помощью нескольких кнопок. Можно было бы перейти на экран выбора уровня, выбрать параметры и т.д. Затем с экрана выбора уровня будет несколько других кнопок, которые при выборе будут запускать игру и загружать выбранный уровень.

Мой вопрос: как должен быть создан проект? Должен ли каждый экран (выбор уровня, главное меню, опции) быть собственной сценой и иметь один главный контроллер? Или мне нужно иметь несколько контроллеров просмотра для всего? Или, может быть, контроллер просмотра для каждого уровня (хотя это не имеет особого смысла), который управляется навигационным контроллером в раскадровке?

Немного поиграв с ним и прочитав онлайн, я заметил, что я могу использовать контроллер вида, чтобы иметь UIButtons для моего главного меню. Тем не менее, они сохраняются через сменную сцену, но это не то, что я хочу. Это означало бы, что мне нужно было бы скрыть кнопки на каждой новой сцене, которая меня беспокоит, потому что я не уверен, что именно происходит с кнопками. Я знаю, что можно создавать кнопки из SKSpriteNodes (аналогично классу, который Graf опубликовал, и многие люди использовали). Это лучший вариант? Вместо того, чтобы использовать UIButtons в VC, я бы проверял, было ли прикосновение к этой кнопке node в методе touchhedBegan и касалось методаEnded, примерно так:

UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInNode:self];
SKNode *node = [self nodeAtPoint:location];

if ([node.name isEqualToString:@"scene button"])
{
    LevelScene *scene = [LevelScene sceneWithSize:self.view.bounds.size];
    scene.scaleMode = SKSceneScaleModeAspectFill;
    [self.view presentScene:scene];
}

Правильно ли это подходит?

В конце концов, я хочу, чтобы можно было добавлять паузы, экраны игр и т.д., и не уверен, что достаточно просто заменить сцены. Кроме того, вместо отдельной реализации для каждого уровня я мог бы загрузить их из файла .plist

Я также рассматриваю факт того, смогу ли я анимировать кнопки. Полагаю, я бы хотел, чтобы они плавали вокруг или становились больше, когда они были выбраны (когда пользователь коснулся его, но не отпустил), и я считаю, что UIButton не позволит этого, так как это не SKSpriteNode.

Извините за такой длинный пост, но, надеюсь, это дает достаточно информации, чтобы помочь мне и получить меня на правильном пути! Спасибо!

Ответ 1

если вы хотите простое меню, вы можете создать его с помощью SpriteKit, но если вам нужно сложное меню, вы должны использовать UIKit.

Предположим, что вы хотите создать меню выбора уровня с эффектом CoverFlow, которое будет сложно реализовать с нуля на SpriteKit, но для UIKit вы можете найти библиотеки, такие как iCarousel, который с легкостью реализует потрясающие эффекты CoverFlow и прокрутки.

SKLabelNode на данный момент поддерживает только одну текстовую строку, поэтому, если вы хотите добавить очень длинное сообщение в своей игре, это будет сложно, но если вы используете UIKit, вместо этого вы можете использовать UITextView для отображения своего длинное сообщение.

подробное меню "Покупки приложений" будет легче создать с помощью UIKit.

UIKit позволит избежать много головной боли, я действительно рекомендую вам использовать его.

как должен быть настроен проект?

Вам нужна только 1 сцена

MenuviewController → (Push Segue) → LevelSelectionController → (Push Segue) → GameScene

Я предполагаю, что я захочу, чтобы они плавали вокруг или становились больше, когда они были выбраны (когда пользователь коснулся его, но не отпустил), и я считаю, что UIButton не разрешит его, поскольку это не SKSpriteNode.

вы можете добавить анимацию в UIButton с UIView animateWithDuration или CABasicAnimation

Это означало бы, что мне нужно было бы скрыть кнопки для каждой новой отображаемой сцены

Решите его с помощью функции

- (void)setHidden:(BOOL)hide {
    UIButton *tmpButton = (UIButton *)[self.view viewWithTag:100];
    tmpButton.hidden = hide ? YES : NO;
}

Скрыть его вот так

[self setHidden:YES];

Надеюсь, что это поможет

Удачи!

Ответ 2

Хотя ответ @Albert - хороший, я всегда использовал SKLabelNode. Это класс, который уже находится внутри рамки SpriteKit и не требует использования жестов.

Это заставляет задуматься, как он реагирует на действия? Ну, это на самом деле довольно просто.

Я просто использую метод touchesBegan:withEvent:, и я проверяю, нажата ли надпись node. Вот пример.

// in .m file
@interface ClassName () {
   SKLabelNode *menuItem1;
   SKLabelNode *menuItem2;
}

@implementation

- (id) initWithSize:(CGSize)size // can't fully remember this one...
{
     if(self = [super initWithSize:size]) {
        // here you create your labels
        menuItem1 = [SKLabelNode labelNodeWithFontNamed:@"Your font."];

        // this will position this at the center, top 1/3 of the screen
        menuItem1.position = CGPointMake(self.frame.size.width/2, self.frame.size.height * .3); 
        menuItem1.text = @"Menu 1";
        [self addChild:menuItem1]; // takes care of the first

        menuItem2 = [SKLabelNode labelNodeWithFontNamed:@"Your font."];

        // place at center, lower 1/3 of screen
        menuItem2.position = CGPointMake(self.frame.size.width/2, self.frame.size.height * .6); 
        menuItem2.text = @"Menu 2";
        [self addChild:menuItem2];
    }
    return self;
}

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
     UITouch *t = [touches anyObject];
     CGPoint touchLocation = [t locationInNode:self.scene];

      if(CGRectContainsPoint(menuItem1.frame, touchLocation)) {
          // do whatever for first menu
      }

      if(CGRectContainsPoint(menuItem2.frame, touchLocation)) {
          // do whatever for second menu
      }
}

надеюсь, что это поможет!

Ответ 3

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

И мой ответ на самом деле не определен, но вот мой совет: для внутриигровой игры я настроил бы программный интерфейс программно - кажется, много работы, но для видеоигры это на самом деле не так уж плохо. Но какое-то меню может быть в настройке раскадровки или в файле xib - как в главном меню, так и в другом подменю вне игры.

Для касания добавьте эту функцию к вашей сцене .m

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{

    CGPoint location = [[touches anyObject] locationInNode:self];
}

И затем вы можете использовать CGRectContainsPoint();

Или вы можете добавить к нему контроллер UITapGestureRecognizer.

UITapGestureRecognizer * recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];

recognizer.delegate = self;

[view addGestureRecognizer:recognizer];

Настройка кнопок в SKScene