Добавление UITextView в сцену в SpriteKit

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

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

[self.view addSubview: textView];

Это все хорошо, если у вас есть только один SKScene, так как это сцена, отображаемая текущим представлением/SKView.

Моя проблема в том, что, когда я добавляю текст в представление * моей сцены, которое не является первой сценой, загруженной приложением (третьей или выше), приложение возвращается к первой загруженной сцене (это мое меню сцена) и радостно отображает нужный текст.

Кто-нибудь понял, почему? У меня есть сцена меню, переходящая на сцену один, на сцену два (в которой я хочу отобразить тест).

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

Я до сих пор несколько ошеломлен отсутствием SK-эквивалента UITextView.

В любом случае, любая помощь, указатели были бы замечательными, спасибо.

Хорошо, вот соответствующие части кода... Думаю. Контроллер:

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    // Configure the view.
    SKView *skView = (SKView *)self.view;
    skView.showsFPS = YES;
    skView.showsNodeCount = YES;
    skView.showsDrawCount = YES;

    // Create and configure the scene.
    SKScene *scene = [[GTMainMenu alloc] initWithSize:skView.bounds.size];

    // Present the scene.
    [skView presentScene:scene];
}

где GTMainMenu является подклассом SKScene и имеет кнопку (оранжевая рамка) для «действия» (подкласс GTScene, сам подкласс SKScene), это вызовет переход к действию, у которого есть еще одна кнопка для первого место действия. Только вы так и не доберетесь до сцены, так как viewDidLoad вернет вас в главное меню.

Это viewDidLoad сцены, который заставит ее «перепрыгнуть» обратно в главное меню:

- (void)didMoveToView:(SKView *)view
{
    [super didMoveToView:view];

    if (!self.contentCreated) {
        [self createSceneContents];

        self.contentCreated = YES;
    }

    UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(self.size.width/2, self.size.height/2+20, 200, 40)];
    textView.center = self.view.center;
    textView.textColor = [UIColor blackColor];
    textView.font = [UIFont systemFontOfSize:17.0];
    textView.backgroundColor = [UIColor whiteColor];
    textView.text = @"Where am I?";

    [self.view addSubview:textView];
}

Репозиторий git доступен здесь.

Это урезанная версия моего проекта, в которой удалено все, что не имеет отношения к рассматриваемой проблеме.

Если вы извините за код, моя основная работа — это Java, и в данный момент я борюсь с некоторыми концепциями в Objective C. О, и извините, мне удалось включить пользовательские настройки: S


person Gavin    schedule 09.03.2014    source источник
comment
Спасибо за правки. Я не уверен, что это специфично для iOS, хотя игра для iOS. Я думаю, что эта проблема может существовать и в OSX.   -  person Gavin    schedule 09.03.2014
comment
Ok; Я вижу, люди подписаны на теги. :D   -  person Gavin    schedule 09.03.2014
comment
Этот внезапный возврат к предыдущей сцене убедительно указывает на ошибку программирования с вашей стороны, но вы не предоставили написанный вами контекстно-релевантный код, поэтому мы не можем дать никаких рекомендаций.   -  person LearnCocos2D    schedule 10.03.2014
comment
Добавлены примеры кода и ссылка на репозиторий git.   -  person Gavin    schedule 10.03.2014


Ответы (2)


Метод viewWillLayoutSubviews вашего контроллера представления не защищен от повторного выполнения. Этот метод будет выполняться не только при запуске приложения, но и каждый раз, когда представление поворачивается и изменяется.

Добавьте проверку перед созданием/представлением сцены в этом методе:

if(self.view.scene == nil) { /* present scene */ }
person LearnCocos2D    schedule 10.03.2014
comment
Это может означать, что файл .h моего контроллера представления неверен, поскольку мой контроллер представления, по-видимому, не имеет свойства сцены. #import <UIKit/UIKit.h> #import <SpriteKit/SpriteKit.h> @interface GTViewController : UIViewController - person Gavin; 10.03.2014
comment
Дох! Требуется лишь небольшой кастинг. - person Gavin; 10.03.2014
comment
Спасибо LearnCocos2D, проблема решена. Урок усвоен, понимание жизненного цикла фреймворка. - person Gavin; 10.03.2014

Вы просматривали SKLabelNode? Я широко использовал его в своей игре SpriteKit. Если вам нужно, чтобы ваш SKLabelNode делал что-то необычное (физика и т. д.), вы можете просто добавить его к родительскому SKSpriteNode.

person Nick Barr    schedule 20.04.2014
comment
Мне нужно добавить форматированный текст и несколько слов, SKLabelNode, похоже, не справляется с этим. Это был мой первый звонок. Что меня удивляет, так это то, что во многих играх есть экраны с большим количеством текста, экраны с объяснением миссии, и все же, насколько я понимаю, SpriteKit не поддерживает это. Возможно, я просто злоупотребляю фреймворком. - person Gavin; 02.05.2014
comment
Попробуйте github.com/alex-alex/ASAttributedLabelNode, это фантастическая оболочка для NSAttributedStrings. Написание больших текстовых экранов в файле RTF со всеми параметрами форматирования, которые вам предоставляются, намного проще. - person Kevin Vaughan; 01.08.2015