2013-10-27 69 views
33

我需要給我的應用程序添加一個雨滴效果,我一直在尋找實際執行這個想法的方法。如何將粒子效果添加到不是使用iOS 7的遊戲的iOS應用程序SpriteKit Particle?

我嘗試以下這種方法的CALayer教程:Link但我不能肯定這是否是最好的辦法,考慮到新的iOS 7 SpriteKit粒子發射器可在Xcode 5

我已經創建了.sks文件它在我的Hierarchy中,但我仍然無法將它添加到我的故事板/項目中。

就這麼說,我到底如何在視圖中添加SpriteKit Particle(sks)?我並不熟悉SpriteKit框架中的場景,圖層等,因爲我不是遊戲開發人員。 我最需要的細節和示例代碼可能的,這樣我可以想出解決辦法,請

更新: 我跟隨同胞的會員在回答中提供的方向:AyatollahAndy,請參見下面他的回答。儘管我可以在我的view中顯示SKScene,但是當收到任何觸摸事件時,該應用會崩潰。我得到如下:enter image description here

感謝

+0

我很高興聽到在我的應用程序中沒有SpriteKit的「整個軟件包」就可以實現這一點,正如我所說 - >我該如何將所述的粒子添加到普通視圖? O已經生成了'.sks'文件。 – vzm

+3

嗯,是的,你必須鏈接SpriteKit.framework意思是「整個包」。這並不重要,因爲這個庫是內置在iOS中的,並不會增加應用程序的大小。儘管如此,爲了渲染粒子效果,您必須創建一個帶有SKScene的SKView並將粒子效果放在它上面。除非其他所有視圖都由Sprite Kit節點組成,否則所有其他視圖都在頂部或底部。 – LearnCocos2D

+0

爲什麼不只是添加一個「部分透明的雨滴覆蓋」,並有一個[UIView animationXXX:]應用於它? – dklt

回答

49

在您的UIView中創建一個SKScene以添加SKEmitterNode粒子效果。這樣做的

方式一:

1.In故事板(或編程,如果你喜歡)對現有的View的頂部添加視圖對象,並將其調整到您的需要。
2.Change類新的視圖來SKView
3.In您的視圖控制器的.h文件中創建爲SKView屬性:

@property IBOutlet SKView *skView; 

4.Link的SKView你的故事板到skView財產。
5.創建一個新類,繼承SKScene。 MyScene.h看起來像:下面

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

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 

6。在您的主視圖控制器,包括場景類:

#import "MyScene.h" 

並將代碼添加到viewDidLoad中初始化的SKView:你的主要UIView

- (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]; 
} 

你應該再有一個工作SKScene

+0

我已經嘗試過了,儘管應用最初在我的視圖中以「Hello World」場景啓動時運行良好,當我「觸摸」應用崩潰並引發錯誤時,請參閱更新的問題及詳細信息。 – vzm

+0

http://stackoverflow.com/questions/19780215/skcolor-clearcolor-returning-a-black-color-instead – vzm

+1

如何擺脫黑色背景?我做了skView&scene backgroundColor屬性clearColor,但是我仍然得到黑色背景。 – marciokoko

-1

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

SKEmitterNode必須位於用節點場景(SKScene)定義的節點樹中。場景節點運行一個動畫循環,用於顯示節點樹的內容。 UIView是靜態的,不適用於它。

但是,您可能會在UIView中創建一個場景,但我從未嘗試過這樣做。

+0

你可以非常容易地在一個普通的UIView中添加一個粒子視圖!請看下面的答案 – Fattie

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; 
} 

最後,如果你需要的是一個發射器,它可以更容易地創建一個CAEmitterLayer並補充說,作爲一個子層到您的UIView來代替。當然,這意味着你必須以編程方式創建CAEmitterLayer,並且不能使用酷酷的Xcode粒子編輯器...

+1

imageview的背景是黑色的。有沒有辦法讓它清晰明瞭,以便它可以完美地與superview合併? – xiaowoo

3

實際上,有一種方法可以在沒有SpriteKit的情況下添加粒子 - CoreAnimation的CAEmitterCells。

這樣就可以輕鬆地在UIView中添加粒子。如果你想玩弄參數並輕鬆獲取代碼,請獲取這個應用程序(Particle X)。

它也支持SpriteKit,所以如果你想在遊戲中玩耍或設計粒子並立即得到它的代碼,這個應用程序是解決方案。

ps。如果你沒有注意到它,我是應用程序的開發者 - 在設計應用程序和遊戲時自己使用它。 :)

+0

這是超越光滑.......... – Fattie

16

注意!

對於2017年底的XCode9,這變得更加容易。他們做了它,你可以只添加一個SKView在故事板,然後選擇.sks文件

enter image description here

然而,這似乎不是真正的時刻工作,所以現在只是進行如下!


2017年

請注意上面的答案是非常不合時宜的。

現在很容易做到這一點。

您使用Apple內置的所見即所得的粒子編輯器。

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

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

在Xcode中,單擊創建新的

SpriteKit粒子文件

這將是一個.sks文件。

(不要選擇「SceneKit Particle System File」。選擇「SpriteKit Particle File」。)

單擊.sks文件。請注意右側上的許多控件。

enter image description here

顆粒將被實際移動,即它是一個 「活預覽」。

任何可以用粒子完成的事情,你都可以做到。這就像在遊戲引擎中使用粒子,除了性能好於180億倍。

下面的代碼板將會把你的新的粒子系統,裏面,普通的UIView「阿泰斯特」:

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) 

一下添加到您想要的任何東西。

如果你想要一個閃閃發光的按鈕,將其添加到按鈕。

如果你想整個屏幕淋浴彩虹,添加任何視圖大。

就是這麼簡單。


說你想只是一個爆產生火花,從而結束的

在可視化編輯器簡單地設定最大說50 ......

enter image description here

如果你這樣做,似乎它結束時,你可以只擺脫SKScene的。

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

    delay(1.5) { sk.removeFromSuperview() } 

在最後添加一行代碼似乎清理了一切。


順便說一句,如果你想爲粒子系統新奇的想法,一個偉大的想法是單擊以統一「資源商店」,其中各種顆粒藝術家買入和賣出的粒子系統。他們的工作會給你很棒的想法。

enter image description here

只需點擊右側列表中的 「顆粒」;觀看視頻。 (例如this dude's - link真的很有創意。)

+1

太棒了。謝謝!! – RichS

+0

你剛剛度過了我的一天。完美的作品! – Prateekro

+0

是絕對是現代的方法@Prateekro - 太棒了!很簡單! – Fattie

2

這裏的方法完全不同。我的哥們給了我這個很酷的方式去。使用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] 
    } 
} 

享受。

相關問題