Objective c 使用CADisplayLink的iOS动画

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

我正在使用CADisplayLink的动画和计时。当球碰到一块大石头时,它会立即被移走。如何设置移除石头(块)的动画,就像爆炸成小石头一样?以下是我目前拥有的代码:

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