2

我正在使用 SpriteKit 和 Xcode 6 开发游戏。我有一个要在所有游戏场景中使用的 sks 文件。如果我在呈现后将发射器添加到每个场景中,则发射器会在旧场景中停止并在新场景中添加新星,因为它是在每个场景中创建的。

因此,我尝试使用单例类仅创建一次发射器并在所有游戏场景中使用它。我为所有游戏场景创建了一个超类,并在该超类中为所有子场景创建了发射器。但是,我试图通过这些步骤得到的东西不起作用。发射器仍然在每个新场景中停止并开始新的,因为它仍然在每个场景中创建新的。

如何使用相同的发射器只创建一次并在我的所有游戏场景中使用它而不停止并重新启动发射器?

这是我的代码。我错过了什么?

PS 同样的技术适用于音频播放器!http://www.galloway.me.uk/tutorials/singleton-classes/

//MyEmitterNode.h

#import <SpriteKit/SpriteKit.h>

@interface MyEmitterNode : SKEmitterNode

+(instancetype)sharedEmitterNode;
- (void)addEmitterNodeIntoScene:(SKScene *)scene;

@end

//--

//MyEmitterNode.m

#import "MyEmitterNode.h"

@interface MyEmitterNode ()

@property (strong, nonatomic) SKEmitterNode *mEmitterNode;

@end

@implementation MyEmitterNode

+ (instancetype)sharedEmitterNode {
    static MyEmitterNode *sharedEmitterNode = nil;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        sharedEmitterNode = [[self alloc] init];
    });

    return sharedEmitterNode;
}

- (void)addEmitterNodeIntoScene:(SKScene *)scene {
    self.mEmitterNode = [NSKeyedUnarchiver unarchiveObjectWithFile:[[NSBundle mainBundle] pathForResource:@"MyParticle" ofType:@"sks"]];
    [scene addChild:self.mEmitterNode];
}

@end

// -- MyScene: super classe for all game scenes

//MyScene.m 

- (void)didMoveToView:(SKView *)view {
    [[MyEmitterNode sharedEmitterNode] addEmitterNodeIntoScene:self];
}

// -- MyFirstScene: child class from MyScene

//MyFirstScene.m

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

    // do other stuff
}

// -- MySecondScene: child class from MyScene

//MySecondScene.m

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

    // do other stuff
}
4

0 回答 0