Ссылка на сцену из другого класса в Sprite Kit

Хорошо, я пытался понять это и искал в Интернете и на форуме, но мне пока не повезло.

Я хочу сделать следующее. У меня есть MainMenuScene, которая является SKScene. Поскольку я добавил несколько SKActions и других вещей в эту сцену, я хотел иметь возможность разбить ее на разные файлы. Так, например, когда игрок нажимает кнопку «Настройки», я бы использовал другой файл, чтобы написать, что произойдет, вместо использования MainMenuScene и сделать его еще больше.

Итак, мой вопрос таков: я хочу иметь возможность ссылаться на SKScene в MainMenuScene.m из моего файла SettingsSubScene.m. SettingsSubScene.m выглядит следующим образом:

#import "SettingsSubScene.h"

@implementation SettingsSubScene
{
 SKScene *_mainMenuScene;
}

-(id)initWithScene:(SKScene *)mainMenuScene {

 _mainMenuScene = mainMenuScene;

 return self;
}

-(void)displaySettings {
SKSpriteNode *settingsGearLarge = (SKSpriteNode *)[_mainMenuScene childNodeWithName:@"settingsGearLarge"];

SKSpriteNode *background = [SKSpriteNode spriteNodeWithImageNamed:@"settings"];

background.anchorPoint = CGPointMake(0, 1);
background.position = settingsGearLarge.position;
background.zPosition = 0;
background.xScale = 0;
background.yScale = 0;

[_mainMenuScene addChild:background];

SKAction *appear = [SKAction scaleTo:1.0 duration:0.5];
appear.timingMode = SKActionTimingEaseInEaseOut;

[background runAction:appear completion:^{
    [SKActionEffects fullScale:background amount:0.05 forever:YES];
    [SKActionEffects fullWiggle:background amount:1 forever:YES];
}];

}

-(void)hideSettings {

}

@end

И я вызываю его из MainMenuScene.m, используя следующий код:

SettingsSubScene *settingsSubScene = [[SettingsSubScene alloc] initWithScene:self];
        [settingsSubScene displaySettings];

И я получаю ошибку exc_bad_access. Конечно, я делаю что-то не так, и держу пари, что есть способ сделать это вместо создания большого файла MainMenuScene, но я его еще не нашел. Кто-нибудь может помочь, пожалуйста?

Спасибо


person μ4ρκ05    schedule 21.01.2014    source источник
comment
В какой строке ошибка? Добавьте точку останова исключения, чтобы узнать. Вы получаете какие-либо предупреждения компилятора? Проанализируйте и исправьте их, они пытаются вам что-то сказать. Кроме того, если ваши дополнительные классы наследуются от классов SK*Node, у вас уже есть доступ к сцене через свойство self.scene.   -  person LearnCocos2D    schedule 22.01.2014


Ответы (3)


Измените свой метод initWithScene: следующим образом:

-(id)initWithScene:(SKScene *)mainMenuScene {

    if (self = [super init])
    {
        _mainMenuScene = mainMenuScene;
    }

 return self;
}
person ZeMoon    schedule 22.01.2014

Друг нашел ответ.

Мне нужно было позвонить:

@implementation SettingsSubScene
{
     MainMenuScene *_mainMenuScene;
}

вместо того, чтобы просто

@implementation SettingsSubScene
{
     SKScene *_mainMenuScene;
}

поскольку мой mainMenuScene — это не просто SKScene, а его расширение.

person μ4ρκ05    schedule 22.01.2014
comment
Наверное, я не совсем ясно выразился, что ищу. Выше сработало. Более того, мне на самом деле не нужен был объектный класс, поэтому я мог создавать статические методы, например +(void)displaySettingsInMainMenuScene:(MainMenuScene *)mainMenuScene {. Раньше я просто использовал SKScene вместо расширенного MainMenuScene, и поэтому он не работал. Хочу поблагодарить всех за ответы! - person μ4ρκ05; 22.01.2014

Как сказал akashg выше, вам не хватает инициализации в вашем переопределении initWithScene.

person joshd    schedule 22.01.2014