Как лучше всего сделать анимацию прыгающего мяча с бесконечной петлей на iPhone? - PullRequest
1 голос
/ 27 июня 2009

Я разрабатываю игру для iPhone, в которой птицы подпрыгивают.

Я настроил изображения для анимации крыльев летящей птицы так:

[imgBird[i] setAnimationImages:birdArrayConstant];
[imgBird[i] setAnimationDuration:1.0];
[imgBird[i] startAnimating];

Теперь я заставляю птицу двигаться, используя NSTimer для стрельбы каждые 0,03 секунды, который добавляет / вычитает 1 из координаты x или y из imgBird [i] .center.

Я узнал, как делать это отсюда. http://icodeblog.com/2008/10/28/iphone-programming-tutorial-animating-a-ball-using-an-nstimer/

Но проблема в том, что птицы замедляются, как только срабатывает другой таймер (для перемещения моего корабля таким же образом) и возвращается к первоначальной скорости, когда я прекращаю движение корабля.

Есть ли лучший способ сохранить движение птицы, кроме NSTimer?

Движение птицы - это бесконечный цикл.

Ответы [ 3 ]

4 голосов
/ 01 июля 2009

Вам нужно будет импортировать CoreGraphics и платформы QuartzCore в ваш проект.

Добавьте эти строки в начало вашего файла.

#import <QuartzCore/QuartzCore.h>
#import <CoreGraphics/CoreGraphics.h>

...

UIImageView *bird = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bird2.png"]];

CALayer *b = bird.layer;

// Create a keyframe animation to follow a path to the projected point

CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"scale"];
animation.removedOnCompletion = NO;


// Create the path for the bounces
CGMutablePathRef thePath = CGPathCreateMutable();

// Start the path at my current location
CGPathMoveToPoint(thePath, NULL, bird.center.x, bird.center.y);
CGPathAddLineToPoint(thePath, NULL,20, 500.0);

/*  // very cool path system.
CGMutablePathRef thePath = CGPathCreateMutable();
CGPathMoveToPoint(thePath,NULL,74.0,74.0);

CGPathAddCurveToPoint(thePath,NULL,74.0,500.0,
                      320.0,500.0,
                      320.0,74.0);
CGPathAddCurveToPoint(thePath,NULL,320.0,500.0,
                      566.0,500.0,
                      566.0,74.0);
*/

//animation.rotationMode = kCAAnimationRotateAuto;

animation.path = thePath;

animation.speed = 0.011;
//animation.delegate = self;
animation.repeatCount = 1000000;

// Add the animation to the layer
[b addAnimation:animation forKey:@"move"];

Надеюсь, это немного поможет.

1 голос
/ 28 июня 2009

Судя по вашему вопросу, вы используете более одного таймера. Используйте только один, чтобы оживить все ваши объекты. Где-то, когда ваше приложение запускается, имейте это:

[NSTimer scheduledTimerWithTimeInterval:0.03 target:self selector:@selector(mainLoop:) userInfo:nil repeats:YES];

Затем в основном цикле, что-то вроде этого:

- (void)mainLoop:(NSTimer *)timer
{
    // compute new position for imgBirds
    for (int i=0; i<kBirdCount; i++)
    {
        imgBirds[i].center = CGPointMake(somex, somey);
    }

    // compute new position for ship
    ship.center = CGPointMake(somex, somey);
}

Кроме того, вы должны вычислить somex и somey как функцию вашего интервала таймера. Таким образом, если вы измените его, ваша анимация будет выглядеть так же.

0 голосов
/ 27 июня 2009

Вы захотите использовать Core Animation вместо ручного перемещения птиц. Взгляните на CAAnimation в документации. Вы в основном настраиваете анимацию, путь, по которому вы хотите, чтобы она двигалась, и просто указываете ее запуск. Это позаботится обо всем остальном. Он также поддерживает ослабление, которое замедляет и ускоряет темп, чтобы он выглядел более естественным.

...