如何将粒子效果添加到不是使用iOS 7 SpriteKit粒子的游戏的iOS应用程序?

vzm*_*vzm 34 objective-c uiview ios sprite-kit skemitternode

我需要在我的应用程序中添加雨粒子效果,我一直很难找到实际执行这个想法的方法.

我尝试按照这个CALayer方法教程:链接, 但我不太确定这是否是最好的方法,考虑到Xcode 5中提供的新的iOS 7 SpriteKit粒子发射器.

我已经创建了.sks文件并且它在我的层次结构中,但我仍然无法将其添加到我的故事板/项目中.

话虽如此,我究竟如何在我的视图中添加SpriteKit粒子(sks)?我对SpriteKit框架中的场景,分层等并不熟悉,因为我不是游戏开发人员.我需要尽可能多的细节和示例代码,以便我能够解决这个问题

更新:我已按照SO成员答案中提供的指示:AyatollahAndy,请参阅下面的答案.虽然我能够SKSceneview收到任何触摸事件时显示我的应用程序崩溃.我得到以下内容:在此输入图像描述

谢谢

And*_*yOS 50

SKScene在您的创建中UIView添加SKEmitterNode粒子效果.

一种方法:

1.在故事板中(或者以编程方式,如果您愿意)在现有视图的顶部添加View对象,并根据需要调整其大小.
2.将新视图的类更改为SKView
3.在视图控制器.h文件中为SKView:创建属性:

@property IBOutlet SKView *skView;
Run Code Online (Sandbox Code Playgroud)

4.将SKView故事板上的链接链接到skView属性.
5.创建一个新类,子类化SKScene.MyScene.h看起来像:

#import <SpriteKit/SpriteKit.h>
@interface MyScene : SKScene
@end
Run Code Online (Sandbox Code Playgroud)

下面的MyScene.m包含用于在触摸SKView时随时随地创建粒子效果的代码.

#import "MyScene.h"

@implementation MyScene

-(id)initWithSize:(CGSize)size {    
    if (self = [super initWithSize:size]) {
        /* Setup your scene here */

        self.backgroundColor = [SKColor colorWithRed:0.15 green:0.15 blue:0.3 alpha:1.0];
        SKLabelNode *myLabel = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"];
        myLabel.text = @"Hello, World!";
        myLabel.fontSize = 30;
        myLabel.position = CGPointMake(CGRectGetMidX(self.frame),
                                   CGRectGetMidY(self.frame));

        [self addChild:myLabel];
    }
    return self;
}

//particle explosion - uses MyParticle.sks
- (SKEmitterNode *) newExplosion: (float)posX : (float) posy
{
    SKEmitterNode *emitter =  [NSKeyedUnarchiver unarchiveObjectWithFile:[[NSBundle mainBundle] pathForResource:@"MyParticle" ofType:@"sks"]];
    emitter.position = CGPointMake(posX,posy);
    emitter.name = @"explosion";
    emitter.targetNode = self.scene;
    emitter.numParticlesToEmit = 1000;
    emitter.zPosition=2.0;
    return emitter;
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    /* Called when a touch begins */

    for (UITouch *touch in touches) {
        CGPoint location = [touch locationInNode:self];
        //add effect at touch location
        [self addChild:[self newExplosion:location.x : location.y]];
    }
}

-(void)update:(CFTimeInterval)currentTime {
    /* Called before each frame is rendered */
}

@end
Run Code Online (Sandbox Code Playgroud)

6.在主视图控制器中,包括您的场景类:

#import "MyScene.h"
Run Code Online (Sandbox Code Playgroud)

并向viewDidLoad添加代码以初始化SKView:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Configure the SKView
    SKView * skView = _skView;
    skView.showsFPS = YES;
    skView.showsNodeCount = YES;

    // Create and configure the scene.
    SKScene * scene = [MyScene sceneWithSize:skView.bounds.size];
    scene.scaleMode = SKSceneScaleModeAspectFill;

    // Present the scene.
    [skView presentScene:scene];
}
Run Code Online (Sandbox Code Playgroud)

然后你应该SKScene在你的主要工作UIView.

  • 我希望StackOverflow的所有答案都清晰易懂.非常感谢!! (4认同)

Fat*_*tie 32

2018

现代Xcode现在非常容易.

1.在Xcode中,单击以创建新的

"SpriteKit粒子文件"

它将是一个.sks文件.

(千万不能选"SceneKit粒子系统文件",选择"SpriteKit粒子文件".)

单击.sks文件一次.请注意右侧的许多控件.

在此输入图像描述

粒子实际上会移动,这是一个活生生的预览.任何可以通过粒子完成的事情,你都可以做到.就像在游戏引擎中使用粒子一样,性能要好180亿倍.

2.在任何你想要的地方有任何普通的UIView:

@IBOutlet weak var teste: UIView! // totally ordinary UIView
Run Code Online (Sandbox Code Playgroud)

3.只需使用以下代码链接:

下面的代码将把你的新粒子系统放在普通的UIView"teste"中:

import SpriteKit ...


let sk: SKView = SKView()
sk.frame = teste.bounds
sk.backgroundColor = .clear
teste.addSubview(sk)

let scene: SKScene = SKScene(size: teste.bounds.size)
scene.scaleMode = .aspectFit
scene.backgroundColor = .clear

let en = SKEmitterNode(fileNamed: "SimpleSpark.sks")
en?.position = sk.center

scene.addChild(en!)
sk.presentScene(scene)
Run Code Online (Sandbox Code Playgroud)

将此添加到您想要的任何内容.

如果您想要一个闪亮的按钮,请将其添加到按钮.

如果您希望整个屏幕淋浴彩虹,请将其添加到全屏视图.

就这么简单.


如何使用SpriteKit粒子文件的示例:

假设你想要一阵火花,结束.

将最大值设置为50 ...

在此输入图像描述

提示 - 如果你的效果"完成"(即,它不是一个循环),似乎你可以简单地摆脱SKScene完成时.像这样:

    ...
    scene.addChild(en!)
    sk.presentScene(scene)

    delay(1.5) { sk.removeFromSuperview() }
Run Code Online (Sandbox Code Playgroud)

最后一行代码似乎可以清理所有内容.


顺便说一句,如果你想要关于粒子系统的奇妙想法,那么一个好主意是点击Unity"资产商店",各种粒子艺术家买卖粒子系统.他们的工作会给你很好的想法.

在此输入图像描述

只需点击右侧列表中的"粒子"即可; 观看视频.(创新的例子.)


注意!Apple将会制作它,以便您可以非常简单地在故事板中制作SKView,并选择.sks场景.然而......

在此输入图像描述

......它还没有用!所以你需要上面的代码片段.


小智 7

您可以在您的UIKit层次结构中添加SKView作为子视图.如下所示的函数可以使用,允许您创建一个具有子视图效果的UIImageView,然后您可以将其添加到主视图中.一定要链接SpriteKit.

UIImageView *NewEffectUIImageViewWithFrame(CGRect frame)
{
    UIImageView *tempView = [[UIImageView alloc] initWithFrame:frame];

    SKView *skView = [[SKView alloc] initWithFrame:CGRectMake(0.0, 0.0, frame.size.width, frame.size.height)];
    [tempView addSubview:skView];

    SKScene *skScene = [SKScene sceneWithSize:skView.frame.size];
    skScene.scaleMode = SKSceneScaleModeAspectFill;
    skScene.backgroundColor = [UIColor clearColor];

    SKEmitterNode *emitter =  [NSKeyedUnarchiver unarchiveObjectWithFile:[[NSBundle mainBundle] pathForResource:@"SparkParticle" ofType:@"sks"]];
    emitter.position = CGPointMake(frame.size.width*0.5,0.0);

    [skScene addChild:emitter];
    [skView presentScene:skScene];

    return tempView;
}
Run Code Online (Sandbox Code Playgroud)

最后,如果你需要的只是一个发射器,那么创建一个CAEmitterLayer并将其作为子层添加到你的UIView 可能更容易.当然,这意味着你必须以编程方式创建CAEmitterLayer并且不能使用酷炫的Xcode粒子编辑器......