我需要有一个粒子发射器效果才能在2个点出现重复(为了分屏目的),我想知道是否有人遇到过这样做的方法。我的目标是在iOS 10上运行。这是我到目前为止所尝试的。
targetNode
分配给SKNode
,然后每帧复制SKNode
:targetNode
对我来说在iOS 10中不起作用。 SKNode
,并使用view.textureFromNode
制作纹理以复制每一帧:占用帧的1/120,对我来说太慢了。 SKNode
:操作将无法在iOS 10上运行我留给真正发光的唯一选择是写我自己的粒子发射器,我试图避免,所以我想知道是否有其他人有这个问题,并知道一个解决方案,以达到预期的效果。
我能做的另一件事就是预渲染发射器,但如果我走这条路线,这会占用大量纹理内存。
编辑:为了帮助可视化,我绘制了一张图片,白色边框显示了分屏的位置。黑色边框显示场景包装发生的位置。
截至目前,播放器1和播放器2都在原始场景中。
球员2正在向右走,并准备将世界包裹起来,将他移到世界的左手边,但他还没有击中它。所以我需要有一个场景的副本,以便它在视觉上看起来像一个场景。由于播放器1仍在原始场景上,原始发射器需要保持原位。玩家2将不得不在副本中看到相同的图像,否则一旦他通过该边界,就会发生“眩晕”效果,现在包裹的错觉已经消失。
最终结果:
我们只是说F %%%它,播放器1和播放器2将查看不同的发射器节点,我们将在需要时将发射器连接到每个播放器相机。
答案 0 :(得分:7)
这只是起作用(我想是按照预期),但我不知道它的性能有多大或者它如何适合你的需求和当前的游戏。无论如何,也许它可以在某种程度上帮助你。首先,在你的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];
}
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];
}