iOS版。 SpriteKit:如何在所有游戏场景中使用相同的发射器

时间:2015-03-20 12:12:18

标签: ios singleton skemitternode

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

因此我尝试使用单例类只创建一次发射器并在所有游戏场景中使用它。我为所有游戏场景创建了一个超级类,并在所有子场景的超类中创建了发射器。但是,我试图通过这些步骤得到的结果是行不通的。发射器仍然停止并在每个新场景中启动新的,因为它仍然在每个场景中创建新的。

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

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

P.S。同样的技术与音频播放器配合得很好! 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
}

0 个答案:

没有答案