0

好的,我一直在尝试解决这个问题并搜索网络和论坛,但我还没有运气。

我想做的是以下。我有一个 MainMenuScene,它是一个 SKScene。由于我在该场景中添加了许多 SKAction 和其他内容,因此我希望能够将其分解为不同的文件。因此,例如,当玩家按下“设置”按钮时,我会使用不同的文件来编写会发生的事情,而不是使用 MainMenuScene 并使其更大。

所以我的问题是:我希望能够从我的 SettingsSubScene.m 文件中引用 MainMenuScene.m 中的 SKScene。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 文件,但我还没有找到它。有人可以帮忙吗?

谢谢

4

3 回答 3

0

像这样修改你的initWithScene:方法:

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

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

 return self;
}
于 2014-01-22T06:16:25.433 回答
0

正如 akashg 上面所说,您在 initWithScene 覆盖中缺少 init。

于 2014-01-22T08:06:52.827 回答
0

一位朋友找到了答案。

我需要打电话:

@implementation SettingsSubScene
{
     MainMenuScene *_mainMenuScene;
}

而不仅仅是

@implementation SettingsSubScene
{
     SKScene *_mainMenuScene;
}

因为我的 mainMenuScene 不仅仅是一个 SKScene,而是扩展了它。

于 2014-01-22T07:04:18.943 回答