在Sprite Kit

时间:2016-11-04 13:47:06

标签: swift sprite-kit skemitternode

我需要有一个粒子发射器效果才能在2个点出现重复(为了分屏目的),我想知道是否有人遇到过这样做的方法。我的目标是在iOS 10上运行。这是我到目前为止所尝试的。

  1. targetNode分配给SKNode,然后每帧复制SKNodetargetNode对我来说在iOS 10中不起作用。
  2. 将粒子发射器分配给SKNode,并使用view.textureFromNode制作纹理以复制每一帧:占用帧的1/120,对我来说太慢了。
  3. 将自定义操作分配给将节点复制到另一个节点的粒子节点SKNode:操作将无法在iOS 10上运行
  4. 复制现有的粒子节点,希望种子不是随机的:种子是随机的
  5. 尝试在更新时复制粒子发射器:粒子只在原点产生
  6. 尝试过SKReferenceNode:只是发射器的副本,自行运行
  7. 我留给真正发光的唯一选择是写我自己的粒子发射器,我试图避免,所以我想知道是否有其他人有这个问题,并知道一个解决方案,以达到预期的效果。

    我能做的另一件事就是预渲染发射器,但如果我走这条路线,这会占用大量纹理内存。

    编辑:为了帮助可视化,我绘制了一张图片,白色边框显示了分屏的位置。黑色边框显示场景包装发生的位置。 enter image description here

    截至目前,播放器1和播放器2都在原始场景中。

    球员2正在向右走,并准备将世界包裹起来,将他移到世界的左手边,但他还没有击中它。所以我需要有一个场景的副本,以便它在视觉上看起来像一个场景。由于播放器1仍在原始场景上,原始发射器需要保持原位。玩家2将不得不在副本中看到相同的图像,否则一旦他通过该边界,就会发生“眩晕”效果,现在包裹的错觉已经消失。

    最终结果:

    我们只是说F %%%它,播放器1和播放器2将查看不同的发射器节点,我们将在需要时将发射器连接到每个播放器相机。

1 个答案:

答案 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];

}

leftScenerightScene是使用自动布局在故事板中定义的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];
}

我知道您不需要所有这些代码,但如果这是您想要的某种方式,我会发布它是为了完整性。这是结果: enter image description here