在Sprite Kit中复制粒子发射器效果

我需要有一个粒子发射器的效果出现在两个点重复(为了分割屏幕的目的),我想知道是否有人遇到这样做的方法。我的目标是在iOS 10上运行。这是我迄今为止所做的尝试。
targetNode分配给SKNode然后复制SKNode每个帧:targetNode对我来说在iOS 10中不起作用。
将粒子发射器指定给一个SKNode,并使用view.textureFromNode制作纹理以复制每帧:占用帧的1/120,对我来说太慢。
将自定义操作分配给将节点复制到另一个节点中的粒子节点:操作将不会在iOS 10上运行。
复制现有的粒子节点,希望种子不是随机的:种子是随机的
在更新时尝试复制粒子发射器:粒子仅在原点生成
尝试了skreferencenode:只是发射器的一个副本,单独运行
我唯一的选择是写我自己的粒子发射器,这是我试图避免的,所以我想知道是否有人有这个问题,并知道一个解决方案,以达到预期的效果。
我可以做的另一件事是预渲染发射器,但如果我走这条路线,这将占用大量的纹理内存。
编辑:为了有助于可视化,我画了一张图片,白色边框显示分割屏幕的位置。黑色边框显示场景包装的位置。
enter image description here
从现在起,玩家1和玩家2都在原始场景中。
第二名球员走在右边,准备打一个世界杯,把他移到世界的左边,但他还没有打。所以我需要一个场景的副本,这样它看起来就像一个场景。由于播放机1仍在原始场景中,因此原始发射器需要保持在原位。玩家2必须在副本中看到相同的图像,否则一旦他通过边界,就会产生“浮华”的效果,包装的假象就消失了。
最终结果:
我们刚刚说了f%%%%,播放器1和播放器2将查看不同的发射器节点,我们将在需要时将发射器连接到每个播放器相机。


最佳答案:

这是可行的(我想是按预期的),但我不知道有多少是性能,或它如何适合您的需要和您目前的游戏。不管怎样,也许它能在某种程度上帮助你。首先,在你的gameviewcontroller中…分割屏幕:)

#import "GameViewController.h"
#import "GameScene.h"

@implementation GameViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Configure the view.
    SKView * leftSKView = (SKView *)self.leftScene;
    leftSKView.ignoresSiblingOrder = YES;
    leftSKView.showsFPS = YES;
    leftSKView.showsNodeCount = YES;

    SKView * rightSKView = (SKView *)self.rightScene;
    rightSKView.ignoresSiblingOrder = YES;
    rightSKView.showsFPS = YES;
    rightSKView.showsNodeCount = YES;




    // Create and configure the scene.
    GameScene *scene = [GameScene nodeWithFileNamed:@"GameScene"];
    scene.scaleMode = SKSceneScaleModeAspectFill;

    // Present the scene.
    [leftSKView presentScene:scene];
    [rightSKView presentScene:scene];

}

leftScenerightScene是在故事板中定义的ui视图,使用自动布局来获取每个屏幕的一半。还将类更改为skview(它是uiview)。非常微不足道…
然后在游戏场景中添加一个发射器,它将在这两个视图之间共享。因为只使用一个发射器,所以发射的粒子(它们的移动方式)将被镜像。所以在游戏场景中,只需添加一个粒子:
-(void)didMoveToView:(SKView *)view {
    /* Setup your scene here */


    SKEmitterNode *emitter =  [NSKeyedUnarchiver unarchiveObjectWithFile:[[NSBundle mainBundle] pathForResource:@"MyParticle" ofType:@"sks"]];
    emitter.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidX(self.frame));
    emitter.name = @"explosion";
    emitter.targetNode = self;
    [self addChild:emitter];
}

我知道您不需要所有这些代码,但是如果这是您想要的,在某种程度上,我将发布它以确保完整性。结果是:
enter image description here