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
}