Objective c 使用CADisplayLink的iOS动画
我正在使用CADisplayLink的动画和计时。当球碰到一块大石头时,它会立即被移走。如何设置移除石头(块)的动画,就像爆炸成小石头一样?以下是我目前拥有的代码:Objective c 使用CADisplayLink的iOS动画,objective-c,cocoa-touch,animation,Objective C,Cocoa Touch,Animation,我正在使用CADisplayLink的动画和计时。当球碰到一块大石头时,它会立即被移走。如何设置移除石头(块)的动画,就像爆炸成小石头一样?以下是我目前拥有的代码: - (void)checkCollisionWithBlocks { for (BlockView *bv in blocks) { if (CGRectIntersectsRect(bv.frame, ballRect)) { ballVelocity.y = -ballVeloci
- (void)checkCollisionWithBlocks
{
for (BlockView *bv in blocks) {
if (CGRectIntersectsRect(bv.frame, ballRect)) {
ballVelocity.y = -ballVelocity.y;
[blocks removeObject:bv];
[bv removeFromSuperview];
break;
}
}
}
CADisplayLink真的有点。。。这与您的计划有很大关系(用于将屏幕绘图更新同步到自定义动画)。我的解决办法是:点燃一些东西!虽然它不一定是爆炸,但这会导致您的块喷出蓝色火焰(您可以通过修改
self.fireColor
来更改颜色)
CAEmitterLayers会持续一段时间,因此,如果您想让火更快地熄灭,请使用停止选择器的计时。如果你想要更小或更大的火,或者火球停留的时间更长,可以使用init方法中的属性,无论哪种方式,你都会得到一个很酷的效果
所有的颜色必须是对UICOLL的强引用,否则核心动画会出现异常,并在调试器中抛出C++脾气脾气。不愉快。
CAEmitterLayer如果你没有使用Cocos2D(如果你没有,你到底怎么了?)我没有使用Cocos2D谢谢大家的关注。我在乞讨游戏编程我一直在工作的核心动画火,这会有帮助吗?(爆炸需要一些讨厌的图像处理)我猜我需要一些照片,但这是我第一次为这种东西制作动画。你能再解释一下吗?谢谢你的回答。作为我的老师,我会和你保持联系
- (void)checkCollisionWithBlocks
{
for (BlockView *bv in blocks) {
if (CGRectIntersectsRect(bv.frame, ballRect)) {
ballVelocity.y = -ballVelocity.y;
[blocks removeObject:bv];
[bv burpFire]
[bv removeFromSuperview];
break;
}
}
}
@interface BlockView : UIView
@property (nonatomic, strong) CALayer *rootLayer;
@property (nonatomic, strong) CAEmitterLayer *fireEmitter;
@property (nonatomic, strong) CAEmitterLayer *smokeEmitter;
@property (nonatomic, strong) UIColor *fireColor;
@property (nonatomic, strong) UIColor *smokeColor;
-(void)burpFire;
@end
@implementation BlockView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.rootLayer = [CALayer layer];
//Set the root layer's background color to black
self.rootLayer.backgroundColor = [UIColor blackColor].CGColor;
//Create the fire emitter layer
self.fireEmitter = [CAEmitterLayer layer];
self.fireEmitter.emitterPosition = CGPointMake(0, CGRectGetMaxY(frame) + 50);
self.fireEmitter.emitterMode = kCAEmitterLayerOutline;
self.fireEmitter.emitterShape = kCAEmitterLayerLine;
self.fireEmitter.renderMode = kCAEmitterLayerAdditive;
self.fireEmitter.emitterSize = CGSizeMake(0, 0);
//Create the smoke emitter layer
self.smokeEmitter = [CAEmitterLayer layer];
self.smokeEmitter.emitterPosition = CGPointMake(0, CGRectGetMaxY(frame) + 50);
self.smokeEmitter.emitterMode = kCAEmitterLayerPoints;
//Create the fire emitter cell
CAEmitterCell* fire = [CAEmitterCell emitterCell];
fire.emissionLongitude = M_PI;
fire.birthRate = 0;
fire.velocity = -80;
fire.velocityRange = -30;
fire.emissionRange = -1.1;
fire.yAcceleration = -200;
fire.scaleSpeed = 0.3;
self.fireColor = [UIColor colorWithRed:0.425 green:0.779 blue:0.800 alpha:0.100];
fire.color = self.fireColor.CGColor;
fire.contents = (id)[self CGImageNamed:@"fire.png"];
//Name the cell so that it can be animated later using keypaths
[fire setName:@"fire"];
//Add the fire emitter cell to the fire emitter layer
self.fireEmitter.emitterCells = [NSArray arrayWithObject:fire] ;
//Create the smoke emitter cell
CAEmitterCell* smoke = [CAEmitterCell emitterCell];
smoke.birthRate = 11;
smoke.emissionLongitude = M_PI / 2;
smoke.lifetime = 0;
smoke.velocity = -40;
smoke.velocityRange = 20;
smoke.emissionRange = M_PI / 4;
smoke.spin = 1;
smoke.spinRange = 6;
smoke.yAcceleration = 160;
smoke.contents = (id) [self CGImageNamed:@"smoke.png"];
smoke.scale = 0.1;
smoke.alphaSpeed = -0.12;
smoke.scaleSpeed = 0.7;
//Name the cell so that it can be animated later using keypaths
[smoke setName:@"smoke"];
//Add the smoke emitter cell to the smoke emitter layer
self.smokeEmitter.emitterCells = [NSArray arrayWithObject:smoke];
//Add the two emitter layers to the root layer
[self.layer addSublayer:self.smokeEmitter];
[self.layer addSublayer:self.fireEmitter];
[self burpFire];
}
return self;
}
//Return a CGImageRef from the specified image file in the app's bundle
-(CGImageRef)CGImageNamed:(NSString*)name {
NSString *url = [[NSBundle mainBundle] pathForResource:name ofType:nil];
return [UIImage imageWithContentsOfFile:url].CGImage;
}
-(void)burpFire {
float gas = 80.0 / 100.0;
//Update the fire properties
[self.fireEmitter setValue:[NSNumber numberWithInt:(gas * 1000)] forKeyPath:@"emitterCells.fire.birthRate"];
[self.fireEmitter setValue:[NSNumber numberWithFloat:gas] forKeyPath:@"emitterCells.fire.lifetime"];
[self.fireEmitter setValue:[NSNumber numberWithFloat:(gas * 0.35)] forKeyPath:@"emitterCells.fire.lifetimeRange"];
self.fireEmitter.emitterSize = CGSizeMake(100 * gas, 0);
//Update the smoke properites
[self.smokeEmitter setValue:[NSNumber numberWithInt:gas * 4] forKeyPath:@"emitterCells.smoke.lifetime"];
self.smokeColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:gas * 0.3];
[self.smokeEmitter setValue:(__bridge id)self.smokeColor.CGColor forKeyPath:@"emitterCells.smoke.color"];
[self setNeedsDisplay];
[self performSelector:@selector(burpFinished) withObject:nil afterDelay:1.5];
}
-(void)burpFinished {
float gas = 0.0 / 100.0;
//Update the fire properties
[self.fireEmitter setValue:[NSNumber numberWithInt:(gas * 1000)] forKeyPath:@"emitterCells.fire.birthRate"];
[self.fireEmitter setValue:[NSNumber numberWithFloat:gas] forKeyPath:@"emitterCells.fire.lifetime"];
[self.fireEmitter setValue:[NSNumber numberWithFloat:(gas * 0.35)] forKeyPath:@"emitterCells.fire.lifetimeRange"];
self.fireEmitter.emitterSize = CGSizeMake(100 * gas, 0);
//Update the smoke properites
[self.smokeEmitter setValue:[NSNumber numberWithInt:gas * 4] forKeyPath:@"emitterCells.smoke.lifetime"];
self.smokeColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:gas * 0.3];
[self.smokeEmitter setValue:(__bridge id)self.smokeColor.CGColor forKeyPath:@"emitterCells.smoke.color"];
}