>将targetNode分配给SKNode,然后复制每个框架的SKNode:targetNode在iOS 10中不起作用。
>将粒子发射器分配给SKNode,并使用view.textureFromNode使纹理复制每帧:占用1/10秒的帧,对我来说太慢了。
>将自定义操作分配给将节点复制到另一个SKNode的粒子节点:操作将不会在iOS 10上运行
>复制现有的粒子节点,希望种子不是随机的:种子是随机的
>尝试在更新时复制粒子发射器:粒子刚刚产生在原点
>尝试SKReferenceNode:只是一个发射器的副本,它自己运行
剩下的唯一选择是写我自己的粒子发射器,我想避免,所以我想知道有没有人有这个问题,知道一个解决方案来达到预期的效果。
我可以做的另一件事是预先投射发射器,但如果我走这条路线,这将占用大量纹理内存。
编辑:为了帮助可视化,我画了一张照片,白色的边框显示了分屏显示的位置。黑色边框显示场景环绕的位置。
截至目前,玩家1和玩家2都在原始场景。
球员2正在右转,即将打入世界之路,将他移动到世界的左手边,但他还没有打进来。所以我需要一个场景的副本,使它在视觉上看起来像一个场景。由于玩家1仍然在原始场景,原始的发射器需要留在原地。玩家2将不得不在副本中看到相同的图像,否则一旦他通过该边框,将会发生“毛刺”效应,并且包装的错觉现在已经消失了。
最后结果:
我们刚刚说F %%%它,播放器1和播放器2将会看到不同的发射器节点,我们将在需要时将发射器附加到每个播放器的相机。
#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]; }
leftScene和rightScene是使用自动布局在故事板中定义的UIView,每个屏幕都占用一半的屏幕。另外一个类更改为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]; }
我知道你不需要所有这些代码,但如果这是你想要的某种方式,我会发布它为了完整。结果如下: