Позоваване на сцена от друг клас в 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 каза по-горе, липсва ви init във вашата замяна на initWithScene.

person joshd    schedule 22.01.2014