如何将粒子效果添加到不是使用iOS 7的游戏的iOS应用程序SpriteKit Particle?
我需要给我的应用程序添加一个雨滴效果,我一直在寻找实际执行这个想法的方法。
我试着遵循这个CALayer方法教程: 链接,但我不太确定这是否是最好的方法,考虑到Xcode 5中提供的新的iOS 7 SpriteKit粒子发射器。
我已经创build了.sks
文件,它在我的层次结构中,但是我仍然无法将其添加到故事板/项目中。
这样说, 我到底如何添加一个SpriteKit粒子(sks)到我的视图? 我并不熟悉SpriteKit框架中的场景,分层等,因为我不是游戏开发人员。 我需要尽可能多的细节和示例代码,以便我可以解决这个问题
更新:我已经按照SO成员的回答提供了方向:AyatollahAndy,请看下面的答案。 尽pipe我能够在我的view
显示SKScene
, SKScene
在收到任何触摸事件时,应用程序会崩溃。 我得到以下内容:
谢谢
在你的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一个场景,但是我从来没有试过这样做。