Спрайт Cocos2d с пропуском CCAnimation при перемещении только на устройстве

Я написал демонстрационное приложение, которое отлично работает на симуляторе, но когда я ставлю его на реальное устройство, кости проскальзывают. Вот видео в качестве примера. После перезапуска приложения анимация в порядке. Ошибки произошли примерно через 1 минуту после повторного нажатия кнопки прокрутки.

http://youtu.be/N1k1QPa1brg

Весь код доступен по адресу:

https://github.com/rnystrom/MartionDemo Как я делаю анимацию в объекте кости:

CCAnimation *anim = [CCAnimation animationWithFrames:frames delay:delay];
if(self.sprite){
    // Animate the sprite
    [self.sprite runAction:[CCAnimate actionWithAnimation:anim restoreOriginalFrame:NO]];
}

Функция прокатки:

-(void)roll
{
    // Array that contains the new positions of dice
    // Predetermine the position, check if that will be on top of other dice
    NSMutableArray* checkPos = [NSMutableArray array];

    for(Dice* d in rollDiceArray){
        [d resetPosition];    

        // Select a random position within bounds
        NSInteger x = arc4random() % 600 + 50;
        NSInteger y = arc4random() % 600 + 150;
        CGPoint location = CGPointMake(x, y);

        // Check if die will touch other dice
        while (! [self checkPositionWithPoint:location array:checkPos]) {
            // If position overlaps another die, get a new position
            // PROBLEM: This is O(infinity)!
            x = arc4random() % 600 + 50;
            y = arc4random() % 600 + 150;
            location = CGPointMake(x, y);
        }

        // If position does not overlap, add it to array of positions to be checked
        [checkPos addObject:[NSArray arrayWithObjects:[NSNumber numberWithInteger:x], [NSNumber numberWithInteger:y], nil]];

        // Animate the dice to a position
        // Addition in the switch is for some randomness and correcting the animation's timing offset
        NSInteger numberFrames;
        float frameRate;
        float mod = (float)(arc4random() % 60) / 100;
        switch (d.fileNum) {
            case 0:
                numberFrames = kRayFrames;
                frameRate = numberFrames/24 + mod;
                break;
            case 1:
                numberFrames = kRayFrames;
                frameRate = numberFrames/24 + mod - 0.4;
                break;
            case 2:
                numberFrames = kTankFrames;
                frameRate = numberFrames/24 + mod + 0.2;
                break;
            case 3:
                numberFrames = kChickenFrames;
                frameRate = numberFrames/24 + mod;
                break;
            case 4:
                numberFrames = kCowFrames;
                frameRate = numberFrames/24 + mod + 0.2;
                break;
            case 5:
                numberFrames = kHumanFrames;
                frameRate = numberFrames/24;
                break;
            default:
                break;
        }

        id action = [CCMoveTo actionWithDuration:frameRate position:location];
        id ease = [CCEaseOut actionWithAction:action rate:4.0];
        [d.sprite runAction:ease];
    }
}

person rnystrom    schedule 17.12.2011    source источник


Ответы (1)


Это оказалось проблемой PerformSelector:afterDelay:. Я решил это, добавив некоторое время заполнения к моей задержке, чтобы все не происходило одновременно.

Я также добавил блок, чтобы действие можно было выполнить только после завершения анимации. Кажется, есть какая-то проблема при прерывании анимации в стиле CCMoveTo.

person rnystrom    schedule 02.06.2012