我想在用户在屏幕上拖动手指时生成一些粒子。我已经安装了所有拖动代码,但是我的问题是我根本看不到任何绘制的粒子!
仔细研究一下,我提出了以下类,它是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]];
。 (gest是UIPanGestureRecogniser *)。我可能会缺少什么,或者需要做些什么才能获得粒子图?
谢谢
最佳答案
这里有两个birthRate
属性在起作用。
每个CAEmitterCell
都有一个birthRate
属性。
这是该细胞的出生率。CAEmitterLayer
具有birthRate
属性。
这是应用于每个单元格的birthRate
属性的乘数,以得出游戏中的实际出生率。
您的代码混淆了两者-您在初始化时将单元格的birthRate设置为零,但在toggle方法中更改了图层的birthRate乘数。
两种解决方案...
1-在toggleOn:
中设置单元格的birthRate,而不是层的乘数:
- (void) toggleOn:(bool)on
{
CAEmitterCell* emitterCell = [self.touchEmitter.emitterCells objectAtIndex:0];
[emitterCell setBirthRate:on? 300 : 0];
}
2-在初始化时,将单元格的出生率设置为非零:
touch.birthRate = 1.0;
然后,您在
toggleOn
中使用的乘数将应用于此数字。