0

我正在构建一个类似专注的游戏。按下按钮即可翻转瓷砖。然后我检查两个瓷砖是否翻转。当我不做检查时,瓷砖会按预期翻转。当我进行检查时,第一块瓷砖正确翻转。如果第二个图块与第一个图块匹配,则有时第二个图块在它们都执行消失动画之前不会执行翻转动画。

-(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 一样),以便我可以判断特定动画是否完成?(是的 - 键值编码很好地解决了这个问题!)

在 Bill 的帮助下,我现在已经开始标记动画的关键代码。结果动画确实播放了,但是在消失动画之后-这不是我需要发生的。所以我需要进行某种检查以确保在消失动画发生之前两次翻转都发生了。任何想法表示赞赏!

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

4

1 回答 1

0

我一直在尝试,最终做到了:

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

我没有在其他地方胡说八道,而是将计时器放在这种方法中,它似乎可以工作。当然,其他一些事情现在不起作用,但我认为这只是调整!谢谢!

于 2012-05-18T15:51:24.043 回答