1

鳥が跳ねるiPhoneゲームを開発しています。

飛んでいる鳥の羽をアニメーション化するための画像を次のように設定しました。

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

ここで、鳥を動かす方法は、NSTimerを使用して0.03秒ごとに発砲し、imgBird[i].centerのx座標またはy座標から1を加算/減算することです。

私はここからこのようにすることを学びました。http://icodeblog.com/2008/10/28/iphone-programming-tutorial-animating-a-ball-using-an-nstimer/

しかし、問題は、別のタイマー(同じように船を動かすため)が作動するとすぐに鳥が遅くなり、船の動きを止めると元の速度に戻ることです。

NSTimer以外に鳥を動かし続けるためのより良い方法はありますか?

鳥の動きは無限ループです。

4

3 に答える 3

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"];

それが少し役立つことを願っています。

于 2009-07-01T13:08:13.147 に答える
1

あなたの質問から、複数のタイマーを使用しているようです。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そのように変更しても、アニメーションは同じように見えます。

于 2009-06-27T21:53:17.720 に答える
0

手動で鳥を動かす代わりに、コア アニメーションを使用することをお勧めします。ドキュメントのCAAnimationを見てください。基本的に、アニメーションを設定し、それを移動させたいパスを設定し、実行するように指示するだけです。それは残りの世話をします。また、ペースを遅くしたり加速したりするイージングもサポートされているため、より自然に見えます。

于 2009-06-27T14:32:08.853 に答える