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