2013-03-14 41 views
0

我想在用戶在屏幕上拖動手指時產生一些粒子。我有所有的拖動代碼,但我的問題是,我根本無法看到任何粒子繪圖!如何添加一個UIView與CAEmitterLayer到我的遊戲?

有了一點谷歌搜索,我拿出我所做的UIView的子類下面的類:

#import "PrettyTouch.h" 
#import <QuartzCore/QuartzCore.h> 

@implementation PrettyTouch 
{ 
    CAEmitterLayer* touchEmitter; 
} 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
     touchEmitter = (CAEmitterLayer*) self.layer; 
     touchEmitter.emitterPosition= CGPointMake(0, 0); 
     touchEmitter.emitterSize = CGSizeMake(5,5); 
     CAEmitterCell* touch = [CAEmitterCell emitterCell]; 
     touch.birthRate = 0; 
     touch.lifetime = 0.6; 
     touch.color = [[UIColor colorWithRed:0.2 green:0.3 blue:1.0 alpha:0.06] CGColor]; 
     touch.contents = (id)[[UIImage imageNamed:@"part.png"]CGImage]; 
     touch.velocity = 0; 
     touch.velocityRange = 50; 
     touch.emissionRange = 2*M_PI; 
     touch.scale = 1.0; 
     touch.scaleSpeed = -0.1; 
     touchEmitter.renderMode = kCAEmitterLayerAdditive; 
     touchEmitter.emitterCells = [NSArray arrayWithObject:touch]; 

    } 
    return self; 
} 
+ (Class) layerClass 
{ 
    //tell UIView to use the CAEmitterLayer root class 
    return [CAEmitterLayer class]; 
} 

- (void) setEmitterPosition:(CGPoint)pos 
{ 
    touchEmitter.emitterPosition = pos; 
} 
- (void) toggleOn:(bool)on 
{ 
    touchEmitter.birthRate = on? 300 : 0; 
} 


@end 

然後在我的遊戲視圖控制器類,在viewDidLoad中,我做到了這一點:

@implementation PlayViewController 
{ 
    //... 
    PrettyTouch* touch; 

} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    //... 
    touch = [[PrettyTouch alloc]initWithFrame:self.view.frame]; 
    touch.hidden = NO; 
    [self.view addSubview:touch]; 
    //... 

然後在我的UIPanGestureRecogniser功能我叫[touch toggleOn:YES];當手勢開始和[touch setEmitterPosition:[gest locationInView:self.view]];當函數被調用。 (手勢是UIPanGestureRecogniser *)。

我可能會丟失什麼,或者我需要做什麼來獲取粒子繪圖?

謝謝

+1

只有使用[tag:xcode]標籤才能瞭解有關IDE的問題。謝謝! – Undo 2013-03-14 13:05:23

回答

3

中有兩種遊戲birthRate特性在這裏。

  • 每個CAEmitterCell有一個birthRate財產。
    這是該細胞的硬線出生率。

  • CAEmitterLayer有一個birthRate財產。
    這是一個乘數應用於每個單元的birthRate屬性以導出實際的出生率。

您的代碼混淆兩個 - 你設定的細胞的出生率爲零在初始化,但改變層的出生率乘數在您的切換方法。

兩個解決方案...

1 - 中toggleOn:設置單元格的出生率,而不是層的乘數:

- (void) toggleOn:(bool)on 
    { 
    CAEmitterCell* emitterCell = [self.touchEmitter.emitterCells objectAtIndex:0]; 
    [emitterCell setBirthRate:on? 300 : 0]; 
    } 

2 - 在你的初始化,細胞的出生率設置爲非零:

touch.birthRate = 1.0; 

您在toggleOn中使用的乘數將應用於此數字。

+0

哦,非常感謝你爲我發現! 雖然你在這裏,我不妨問,我正在使用[下圖](http://i.imgur.com/2Efn9UO.png),粒子看起來就像正方形和黑色背景。我認爲使用kCAEmitterLayerAdditive會使圖像以添加的方式顯示出閃亮的一點,有沒有辦法讓圖像像這樣工作,或者我應該去做另一個帶有透明度的PNG?無論如何謝謝。 – Holly 2013-03-14 17:42:51

+1

@Holly,如果你給它一些東西來複合,你現有的圖像將會工作:使用alpha 1.0爲你的CAEmitterLayer設置一個非白色背景色,它應該像你期望的那樣運行。但是透明的筆刷會更加多才多藝(例如,如果沒有設置背景,它會做正確的事情) – foundry 2013-03-14 18:36:16

相關問題