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

我需要给我的应用程序添加一个雨滴效果,我一直在寻找实际执行这个想法的方法。

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

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

这样说, 我到底如何添加一个SpriteKit粒子(sks)到我的视图? 我并不熟悉SpriteKit框架中的场景,分层等,因为我不是游戏开发人员。 我需要尽可能多的细节和示例代码,以便我可以解决这个问题

更新:我已经按照SO成员的回答提供了方向:AyatollahAndy,请看下面的答案。 尽pipe我能够在我的view显示SKSceneSKScene在收到任何触摸事件时,应用程序会崩溃。 我得到以下内容: 在这里输入图像说明

谢谢

在你的UIView创build一个SKScene来添加一个SKEmitterNode粒子效果。

一个这样做的方法:

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

 @property IBOutlet SKView *skView; 

4.将故事板上的SKView链接到skView属性。
5.创build一个新的类, SKScene 。 MyScene.h将如下所示:

 #import <SpriteKit/SpriteKit.h> @interface MyScene : SKScene @end 

下面的MyScene.m包含的代码可以随时随地创build一个粒子效果。

 #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 

在你的主视图控制器中,包含你的场景类:

 #import "MyScene.h" 

并添加代码到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]; } 

你应该在你的主UIView有一个工作的SKScene

注意!

对于2017年底的XCode9,这变得更加容易。 他们已经做到了,你可以在故事板中添加一个SKView,然后select.sks文件

在这里输入图像说明

但是,目前看起来并不是真正的工作,所以现在就按照下面的步骤进行操作!


2017年

请注意上面的答案已经过时了。

现在做这件事非常容易。

您使用苹果公司内置的WYSIWYG粒子编辑器。

任何你想要的任何普通的UIView:

 @IBOutlet weak var teste: UIView! // totally ordinary UIView 

在Xcode中,点击创build一个新的

SpriteKit粒子文件

它将是一个单一的.sks文件。

(不要select“SceneKit Particle System File”,select“SpriteKit Particle File”。)

在.sks文件上单击一次。 注意右边的许多控件

在这里输入图像说明

粒子实际上正在移动 ,即它是一个“活的预览”。

任何可以用粒子完成的事情,你都可以做到。 这就像在游戏引擎中使用粒子,除了性能是180亿倍更好。

下面的代码块会把你的新粒子系统放在普通的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) 

将此添加到任何你想要的。

如果你想要一个闪闪发光的button,把它添加到一个button。

如果你想整个屏幕淋浴彩虹,添加任何看法很大。

这很容易。


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

在可视化编辑器中,只需将max设置为50 …

在这里输入图像说明

如果你这样做,似乎你可以摆脱SKScene完成。

  ... scene.addChild(en!) sk.presentScene(scene) delay(1.5) { sk.removeFromSuperview() } 

在最后添加一行代码似乎清理了一切。


顺便说一句,如果你想要粒子系统的奇妙想法,一个好主意是点击Unity的“资产商店”,在那里各种粒子艺术家购买和销售粒子系统。 他们的工作会给你很棒的想法。

在这里输入图像说明

只需点击右边列表中的“粒子” 观看video。 (例如, 这个老兄的链接真的很有创意。)

您可以在您的UIKit层次结构中添加SKView作为子视图。 像下面这样的函数可以工作,允许你创build一个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; } 

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

实际上,有一种方法可以在没有SpriteKit的情况下添加粒子 – CoreAnimation的CAEmitterCells。

这样你就可以轻松地在你的UIView中添加粒子。 如果你想玩弄参数,并轻松获得代码,得到这个应用程序( 粒子X )。

它也支持SpriteKit,所以如果你想在游戏中玩耍或devise粒子,并立即得到它的代码,这个应用程序是解决scheme。

PS。 如果你没有注意到,我是应用程序的开发者 – 在devise应用程序和游戏时自己使用它。 🙂

这里采用完全不同的方法来尝试。 我的哥们给了我这个很酷的方式去。 使用CAEmitterCell 。 所有的代码! 看起来你需要一个spark.png图片。

 extension UIView { final public func ignite() { let emitter = CAEmitterLayer() emitter.frame = self.bounds emitter.renderMode = kCAEmitterLayerAdditive emitter.emitterPosition = self.center self.layer.addSublayer(emitter) let cell = CAEmitterCell() let bundle = Bundle.init(for: UIColor.self) let image = UIImage(named: "spark", in: bundle, compatibleWith: traitCollection) cell.contents = image?.cgImage cell.birthRate = 1500 cell.lifetime = 5.0 cell.color = UIColor(red: 1.0, green: 0.5, blue: 0.1, alpha: 1).cgColor cell.alphaSpeed = -0.4 cell.velocity = 50 cell.velocityRange = 250 cell.emissionRange = CGFloat.pi * 2.0 emitter.emitterCells = [cell] } } 

请享用。

你不能直接在UIView使用粒子效果。

SKEmitterNode必须位于由节点场景( SKScene )定义的节点树中。 场景节点运行一个animation循环,呈现节点树的内容以供显示。 UIView是静态的,不会为它工作。

但是,你可能能够在你的UIView创build一个场景,但是我从来没有试过这样做。