Сообщить, какая кнопка нажата в меню паузы, с помощью SpriteBuilder

#objective-c #cocos2d-iphone #spritebuilder

#objective-c #cocos2d-iphone #spritebuilder

Вопрос:

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

У меня есть другая кнопка для перезапуска уровня. Поскольку я загружаю в игру определенные объекты, при перезапуске сцены уровня мне нужно удалить все эти объекты, иначе я получаю сообщение об ошибке добавления дочернего элемента, который уже был добавлен. Это означает, что мне нужно каким-то образом связаться с моей игровой сценой, когда я нажимаю restart, чтобы удалить все эти объекты.

Ниже приведен мой код. Обычно я бы создал переменную в сцене паузы, доступную для моей игровой сцены. Когда нажата кнопка перезапуска, я бы изменил значение переменной в моей сцене паузы, а используя метод обновления в моей игровой сцене, я мог бы узнать, когда изменяется значение этой переменной. К сожалению, при выполнении этого с Spritebuilder возникает пара проблем. Обычно вы создаете новую сцену, выполняя следующие действия в Spritebuilder

 CCScene *pauseScene = [CCBReader loadAsScene:@"PauseScene"];
  

Если я сделаю это и создам переменную в моей сцене паузы (как показано ниже), то у меня не будет к ней доступа, поскольку я создаю pauseScene как экземпляр CCScene, а не моего класса PauseScene.

PauseScene.h

 #import "CCScene.h"

@interface PauseScene : CCScene

@property (nonatomic, assign) BOOL restartTapped;

@end
  

Теперь, если я попытаюсь вместо этого создать свой pauseScene как экземпляр моего класса PauseScene, то я получу предупреждение о несовместимых типах указателей, присваивающих ‘PauseScene *’ из ‘CCScene *’. Во время выполнения, если я игнорирую это предупреждение, всякий раз, когда я пытаюсь получить доступ restartTapped , он немедленно выдает ошибку и сообщает, что нераспознанный селектор отправлен в экземпляр …. Очевидно, что это не работает.

Я не совсем уверен, что делать. У меня есть аккуратный пример этой проблемы ниже, просто используйте PauseScene.h как приведенные выше, так и приведенные ниже. Если у вас есть решение, пожалуйста, дайте мне знать! Думаю, я, честно говоря, просто спрашиваю, как получить доступ к переменным из одного класса в другой с помощью Spritebuilder.

PauseScene.m

 #import "PauseScene.h"

@implementation PauseScene

-(void)restartFromPause{
    [self removeFromParent];
    [[CCDirector sharedDirector] resume];
}

@end
  

Главная сцена.m

 #import "MainScene.h"
#import "PauseScene.h"

@implementation MainScene

PauseScene *pauseScene;
float totalTime;

-(void)pauseFromMain {
    pauseScene = [CCBReader loadAsScene:@"PauseScene"];
    [[CCDirector sharedDirector] pause];
    [self addChild:pauseScene];
}

-(void)update:(CCTime)delta{
    totalTime  = delta;
    CCLOG(@"total time %f", totalTime);
    CCLOG(@"value of other variable %i", pauseScene.restartTapped); //gives an error, details given in my post
}

@end
  

Ответ №1:

 CCScene* pauseSceneCCScene = [CCBReader loadAsScene:@"PauseScene"];
PauseScene *pauseScene = (PauseScene *)[pauseSceneCCScene children][0];
  

Теперь вы можете получить доступ к pauseScene переменным, просто выполнив pauseScene.variableName .

Комментарии:

1. ПОТРЯСАЮЩИЙ ОТВЕТ!!! Я пытался найти другой способ сделать это, но это намного проще, чем то, что я намеревался сделать. И просто для справки на будущее, если вам нужно добавить эту сцену в качестве дочерней, вы должны добавить pauseSceneCCScene, а не pauseScene.