动画有时不会发生

时间:2012-04-07 17:20:53

标签: ios core-animation

我正在建立一个像浓度一样的游戏。通过按钮按下翻转瓷砖。然后我检查两块瓷砖是否被翻转。当我不进行检查时,瓷砖按预期翻转。当我进行检查时,第一个瓷砖正确翻转。如果第二个图块与第一个图块匹配,则有时第二个图块在完成其消失动画之前不会执行其翻转动画。

-(void)twoTilesFlipped {

NSInteger i = 0;
for (i = 0; i < [bottomLayers count]; i++)
{
    if ([[flippedStatus objectAtIndex:i] isEqualToString: @"flipped"]) 
    {
        CALayer *tileOne = [bottomLayers objectAtIndex:i];
        NSInteger y = 0;
        for (y = 0; y < [bottomLayers count]; y++) 
        {
            if (y == i) 
            {
                continue;
            }

            if ([[flippedStatus objectAtIndex:y] isEqualToString: @"flipped"])

            {
                CALayer *tileTwo = [bottomLayers objectAtIndex:y];
                if (tileOne.contents == tileTwo.contents) {
                    _matchLabel.text = @"It's a match!";
                    [self disappearTheTiles:tileOne :tileTwo :i :y];
                    [self isGameOver];
                } else {
                    _matchLabel.text = @"Not a match!";
                    [self flipTheTilesBack:i :y];
                }
            }
        } return;

    }
}}

我是iOS编程的新手(以及一般的编程(有点))。

哦,这是翻转瓷砖的方法:

- (void)flipTiles:(UIButton *)buttonPressed {
int b = buttonPressed.tag;

CALayer *top = [topLayers objectAtIndex:b];
CALayer *bot = [bottomLayers objectAtIndex:b];

if ([[flippedStatus objectAtIndex:b] isEqualToString: @"flipped"]) 
{
    top = [bottomLayers objectAtIndex:b];
    bot = [topLayers objectAtIndex:b];
}

CAAnimation *topAnimation = [self flipAnimationWithDuration:0.75f forLayerBeginningOnTop:YES scaleFactor:0.75f];
CAAnimation *bottomAnimation = [self flipAnimationWithDuration:0.75f forLayerBeginningOnTop:NO scaleFactor:0.75f];

CGFloat zDistance = 1500.0f;
CATransform3D perspective = CATransform3DIdentity; 
perspective.m34 = -1. / zDistance;
top.transform = perspective;
bot.transform = perspective;

topAnimation.delegate = self;
[CATransaction begin];
[top addAnimation:topAnimation forKey:@"buttonPressed"];
[bot addAnimation:bottomAnimation forKey:@"buttonPressed"];

[CATransaction commit];
if ([[flippedStatus objectAtIndex:b] isEqualToString: @"notFlipped"]) {
    [flippedStatus replaceObjectAtIndex:b withObject:[NSString stringWithFormat:@"flipped"]];
} else {
    [flippedStatus replaceObjectAtIndex:b withObject:[NSString stringWithFormat:@"notFlipped"]];
}
//NSLog(@"And if we got here, why didn't it flip? Huh?!");}

日志打印,但有时瓷砖在消失动画之前不会翻转。

我想尽可能地清楚,但我无法理解为什么它有时会起作用,而不是其他时候。我认为它与“for”循环和嵌套的“ifs”有关,但我不明白为什么动画不会发生,特别是因为NSLog总是出现在控制台中......

我在这里和其他网站上看了很多与动画相关的问题 - 在书籍和教程中阅读了许多动画部分,但到目前为止,没有任何内容可以作为答案。当然,如果有人需要,我可以提供整个项目...

我曾尝试在战略地点添加时间间隔,但无济于事。我也尝试跟踪瓷砖的翻转状态,这似乎不起作用。在-animationDidStop中是否有一种方法可以判断第二个瓷砖是否已完成其翻转?我想我要问的是,有没有办法命名CAAnimation(就像有一个UIViewAnimation),以便我可以判断一个特定的动画是否完成? (是的 - 键值编码可以很好地解决这个问题!)

在比尔的帮助下,我现在开始对动画进行关键代码标记。原来动画确实发挥了,但是在消失动画之后 - 这不是我需要发生的事情。因此,我需要进行某种检查以确保在发生消失动画之前发生翻转。任何想法都赞赏!

添加更多跟踪后,似乎消失的动画在翻转动画之前发生 - 但有时只是。对我来说,具有挑战性的部分是弄清楚如何告诉消失的动画只发生在两个翻转动画发生之后。努力吧!建议仍然鼓励!

1 个答案:

答案 0 :(得分:0)

我一直在尝试并最终做到了这一点:

-(void)buttonPressed: (UIButton*)buttoni 
{
    [self flipTiles:(UIButton *)buttoni];
    [NSTimer scheduledTimerWithTimeInterval:2.0
                                     target:self
                                   selector:@selector(twoTilesFlipped)
                                   userInfo:nil
                                    repeats:NO];
}

我没有在其他地方捣乱,而是把计时器放在这个方法中,它似乎有效。当然其他一些东西现在还不行,但我认为这只是调整!谢谢!