2009-06-27 3 views
1

Я разрабатываю игру iPhone, в котором птицы подпрыгивать, как в этой игре: http://www.students.uni-mainz.de/rathb000/Fillit/Game.htmlКаков наилучший способ сделать анимацию шарика с бесконечным циклом на iPhone?

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

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

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

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

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

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

Движение птицы представляет собой бесконечный цикл.

ответ

4

Вам понадобится импортировать 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"]; 

Надежда, что помогает немного.

+0

Спасибо, Джон ...Теперь я делаю это так. –

0

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

+0

Спасибо. Да, я смотрю на код MoveMe прямо сейчас. Надеюсь, это решит проблему. Я должен поддерживать постоянную скорость птицы, которая должна облегчить ее. –

1

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

[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

Вы правы, что я использую более одного NSTimer. Но я должен сделать это, поскольку я аннулирую «movetimer» корабля, когда я хочу его остановить (в моем случае, касание внутри события для кнопки). И в funtion я вижу ваш проходящий NSTimer, но не использую его. Это ошибка или вы хотите, чтобы я понял то, что вы не кодировали? –

+0

У вас может быть bool для вашего движения корабля: если это правда, вы обновляете положение судна, если ложно, вы этого не делаете. Кроме того, NSTimer всегда передается методу при вызове с помощью запланированного NSTimer. –