7

onDraw()私のアプリは、ビューのメソッドで次のコマンドを呼び出すことにより、独自のスプライトを実装します。

  canvas.drawBitmap(sprite.getBitmap(), sprite.getX(), sprite.getY(), null);

このアプリは物理シミュレーションであり、これまでのところ、これはうまく機能しています。しかし今、私は特定のイベントが発生したときにスプライトの画像間でモーフィングすることによってアニメーションを強化したいと思います。

たとえば、衝突が発生したときに、爆発のアニメーションを再生したいと思います。私のアイデアは、通常のスプライトビットマップを爆発PNGのビットマップに置き換え、Androidの「トゥイーンアニメーション」を使用して爆発を大きくすることでした。

ただし、Androidトゥイーンアニメーションの例ImageViewでは、XML構成のどこかに静的に定義されていることを前提としています。

onDraw()トゥイーンアニメーションを使用して描画されたビットマップをアニメーション化する方法はありますか?または、ある種のスプライトを使用するように変換する必要がありImageViewますか?後者の場合、Androidでの適切なスプライトアニメーションの例を教えていただけますか?

ありがとう

4

4 に答える 4

10

スプライトを含むあらゆるものをアニメーション化するために使用できる汎用の Tween エンジンを Java で作成しました。ガベージ コレクションを回避するために実行時に何も割り当てないため、Android とゲーム用に最適化されています。さらに、トゥイーンはプールされるため、ガベージ コレクションはまったくありません。

完全なデモは、ここで Android アプリケーションとして、またはここで WebGL html ページ (Chrome が必要) として見ることができます!

インターフェースを実装してTweenAccessor、Tween サポートをすべてのスプライトに追加するだけです。Sprite クラスを変更する必要さえありません。SpriteTweenAccessorを実装するクラスを作成TweenAccessor<Sprite>し、初期化時にエンジンに登録するだけです。GetStarted wiki ページを見てください;)

http://code.google.com/p/java-universal-tween-engine/

ロゴ

また、あらゆるアプリケーションに組み込むことができる視覚的なタイムライン エディターも構築しています。Flash オーサリング ツールと Expression Blend (Silverlight 開発ツール) に似たタイムラインが特徴です。

エンジン全体は詳細に文書化されており (すべての public メソッドとクラスには詳細な javadoc があります)、構文は Flash の世界で使用されている Greensock の TweenMax/TweenLite エンジンと非常によく似ています。すべての Robert Penner イージング方程式をサポートしていることに注意してください。

// Arguments are (1) the target, (2) the type of interpolation, 
// and (3) the duration in seconds. Additional methods specify  
// the target values, and the easing function. 

Tween.to(mySprite, Type.POSITION_XY, 1.0f).target(50, 50).ease(Elastic.INOUT);

// Possibilities are:

Tween.to(...); // interpolates from the current values to the targets
Tween.from(...); // interpolates from the given values to the current ones
Tween.set(...); // apply the target values without animation (useful with a delay)
Tween.call(...); // calls a method (useful with a delay)

// Current options are:

yourTween.delay(0.5f);
yourTween.repeat(2, 0.5f);
yourTween.repeatYoyo(2, 0.5f);
yourTween.pause();
yourTween.resume();
yourTween.setCallback(callback);
yourTween.setCallbackTriggers(flags);
yourTween.setUserData(obj);

// You can of course chain everything:

Tween.to(...).delay(1.0f).repeat(2, 0.5f).start();

// Moreover, slow-motion, fast-motion and reverse play is easy,
// you just need to change the speed of the update:

yourTween.update(delta * speed);

もちろん、強力なシーケンスを構築する方法を提供しなければ、トゥイーン エンジンは完成しません :)

Timeline.createSequence()
    // First, set all objects to their initial positions
    .push(Tween.set(...))
    .push(Tween.set(...))
    .push(Tween.set(...))

    // Wait 1s
    .pushPause(1.0f)

    // Move the objects around, one after the other
    .push(Tween.to(...))
    .push(Tween.to(...))
    .push(Tween.to(...))

    // Then, move the objects around at the same time
    .beginParallel()
        .push(Tween.to(...))
        .push(Tween.to(...))
        .push(Tween.to(...))
    .end()

    // And repeat the whole sequence 2 times
    // with a 0.5s pause between each iteration
    .repeatYoyo(2, 0.5f)

    // Let's go!
    .start();

納得していただければ幸いです :) ゲームや Android UI アニメーションでこのエンジンを使用している人はすでにたくさんいます。

于 2011-04-13T13:30:02.713 に答える
1

ImageViewxml ファイルから取得せずにトゥイーン アニメーションを実行できますが、実際にはビュー階層内のビューである必要があります。

あなたがしている描画はCanvas、ビュー階層に対して不透明です。次の 2 つのオプションがあると思います。

  1. カスタム ビューの上に をオーバーレイし、ImageViewトゥイーン アニメーションを使用してアニメーション化します。
  2. 描画ルーチンを使用Canvasして、爆発をアニメーション化します。

アプリにアニメーション スレッドが既にある可能性があることを考えると、ルーチンを maxtrix 変換と共に使用Canvasすることは理にかなっていると言えます。

于 2011-03-25T20:56:47.457 に答える
0

ゲームを作成している場合は、Vectors(Mathematical) を使用して画像の位置を更新し、getX と getY で描画できます。このベクトルを一定の速度で一定の方向に反復して更新する必要があります。

これらの Vector はネイティブではありません (ゲーム API にはあります)。

位置を繰り返して更新し、再描画するループが必要です。

ゲームの場合、ImageView などのコンポーネントを使用してアニメーションを作成することはお勧めできません。すべてのレイアウトを時間の経過とともに何度も計算するシステムが必要です。

于 2011-03-25T21:25:23.710 に答える
0

Adobe Flash で爆発を描画してアニメーション化し、swfSheetなどを使用してスプライト画像をエクスポートしてから、フレーム アニメーションを使用できます。

于 2011-03-25T20:57:36.377 に答える