Ios 网间网操作系统。SpriteKit:如何在所有游戏场景中使用相同的发射器

Ios 网间网操作系统。SpriteKit:如何在所有游戏场景中使用相同的发射器,ios,singleton,skemitternode,Ios,Singleton,Skemitternode,我正在使用SpriteKit和Xcode 6开发一个游戏。我有一个sks文件,我想在所有游戏场景中使用。如果在演示后将发射器添加到每个场景中,发射器将在旧场景中停止,并在新场景中启用新的发射器,因为它是在每个场景中创建的 因此,我尝试使用单例类创建发射器一次,并在所有游戏场景中使用它。我为所有游戏场景创建了一个超类,并在该超类中为所有子场景创建了发射器。但是,我试图通过这些步骤得到的结果不起作用。发射器仍然在每个新场景中停止并开始新的,因为它仍然在每个场景中创建新的 我如何使用同一个发射器只创建

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

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

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

这是我的密码。我错过了什么

另外,同样的技术也适用于音频播放器

//MyEmitterNode.h
#进口
@接口MyEmitterNode:SKEmitterNode
+(instancetype)SharedMitterNode;
-(无效)新世增补:(SKScene*)场景;
@结束
//--
//MyEmitterNode.m
#导入“MyEmitterNode.h”
@接口MyEmitterNode()
@属性(强,非原子)SKEmitterNode*mEmitterNode;
@结束
@实现MyEmitterNode
+(instancetype)sharedEmitterNode{
静态MyMitterNode*sharedEmitterNode=nil;
静态调度一次;
一次发送(一次发送)^{
SharedMitterNode=[[self alloc]init];
});
返回sharedimitter节点;
}
-(void)addimiternodeintosene:(SKScene*)场景{
self.mEmitterNode=[NSKeyedUnarchiver unarchiveObjectWithFile:[[NSBundle mainBundle]pathForResource:@“sks”类型的“MyParticle”;
[scene addChild:self.mEmitterNode];
}
@结束
//--MyScene:适用于所有游戏场景的超级经典
//MyScene.m
-(void)didMoveToView:(SKView*)视图{
[[MyMitterNode sharedEmitterNode]AddMitterNode到场景:self];
}
//--MyFirstScene:来自MyScene的子类
//我的第一场戏
-(void)didMoveToView:(SKView*)视图{
[超级动态视图:视图];
//做其他事情
}
//--MySecondScene:来自MyScene的子类
//MySecondScene.m
-(void)didMoveToView:(SKView*)视图{
[超级动态视图:视图];
//做其他事情
}

这只是我的观点,但肯定不是一个解决方案……您的MyMitterNode应该是NSObject的子类,而不是SKEmitterNode,因为您不会像发射器一样使用它,也就是说,不会将其添加到场景中。此外,当您希望某项任务执行一次且仅执行一次时,也会使用dispatch_once。每次调用AddEmitterNodeToScene时(甚至MyEmitterNode只实例化一次),也就是每次调用MyScene的didMoveToView时,您都在创建新的发射器节点。这就是每次出现一些场景的时候…所以你就明白了…@Whirlwind你说得对。每次调用AddemitterNodeIntosene时,我都会创建新的发射器节点:-(我仍在寻找解决方案。谢谢。没有人?一定可以添加一个在所有场景中都可用的节点,而不必每次在每个场景中都删除和创建它。一定有一种技术使其成为可能。它与音频播放器配合使用非常好。为什么不与节点配合使用?不知道?谢谢!
//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
}