0

こんにちは、私のアプリケーションでは、非常に頻繁に発生する爆発アニメーションがあります。爆発を作成するとき、リソースから 3 つの画像を読み込み、爆発のアニメーションが終了したら、それらの 3 つの画像をリサイクルします。私は常にこれを行っており、フレームレートの低下に気付きました。静的ビットマップなどのようにこれを行うより良い方法はありますか?

4

1 に答える 1

1

私はかつて、爆弾が爆発した単純なキャンバスであるアプリケーションを作成しました。爆発の各ステップで構成されるタイル状のビットマップを使用し、その一部のみを描画しました。これは、アニメーション効果を作成するために頻繁に変更されます。currentTimestampに従ってステップを自動的に更新します

つまり、これは爆発クラスです。

public class ExplosionAnimated {

private static final String TAG = ExplosionAnimated.class.getSimpleName();

private Bitmap mBitmap;
private Rect mSourceRect;
private int mFrameCountX;
private int mFrameCountY;
private int mCurrentFrame;
private long mFrameTicker;
private int mFramePeriod;

private int mSpriteWidth;
private int mSpriteHeight;

private int mX;
private int mY;

private boolean mFinished = false;

public ExplosionAnimated(Bitmap pBitmap, int pX, int pY, 
        int pFrameCountX, int pFrameCountY, int pFps) {

    this.mBitmap = pBitmap;
    this.mX = pX;
    this.mY = pY;
    this.mCurrentFrame = 0;
    this.mFrameCountX = pFrameCountX;
    this.mFrameCountY = pFrameCountY;
    this.mSpriteWidth = pBitmap.getWidth() / pFrameCountX;
    this.mSpriteHeight = pBitmap.getHeight() / pFrameCountY;
    this.mSourceRect = new Rect(0, 0, this.mSpriteWidth, this.mSpriteHeight);
    this.mFramePeriod = 1000 / pFps;
    this.mFrameTicker = 0l;
}

public void update(long gameTime) {

    if (gameTime > this.mFrameTicker + this.mFramePeriod) {
        this.mFrameTicker = gameTime;

        this.mCurrentFrame++;
        if (this.mCurrentFrame >= this.mFramePeriod) {
            this.mCurrentFrame = 0;
            this.mFinished = true;
        }
    }

    if (!this.mFinished) {

        this.mSourceRect.left = this.mCurrentFrame * this.mSpriteWidth;
        this.mSourceRect.right = this.mSourceRect.left + this.mSpriteWidth;
    }
}

public void draw(Canvas canvas) {

    Rect destRect = new Rect(this.mX, this.mY, 
            this.mX + this.mSpriteWidth, 
            this.mY + this.mSpriteHeight);
    canvas.drawBitmap(this.mBitmap, this.mSourceRect, destRect, null);
}

public boolean isFinished() {
    return this.mFinished;
}
}

これらは、爆発を開始して描画するオブジェクト(たとえば、Bomb.java)のメソッドです。

public void explode(Context pContext, Canvas pCanvas) {

    this.mState = State.EXPLODING;
    this.mExplosion = new ExplosionAnimated(this.mExplosionBitmap, 
            (int) this.mX, (int) this.mY, 7, 3, 7);
}

public void doDraw(Canvas pCanvas) {

    if (this.mState == State.EXPLODING) {

        if (this.mExplosion.isFinished()) {
            this.mState = State.EXPLODED;
        } else {
            this.mExplosion.update(System.currentTimeMillis());
            this.mExplosion.draw(pCanvas);
        }
    } else {
        pCanvas.drawBitmap(this.mBombBitmap, this.mX, this.mY, null);
    } 
}

ThreadとSurfaceViewを使用して、爆弾(または爆発)を継続的に描画し、currentTimestampだけを使用して爆発を更新しました。

お役に立てば幸いです。必要に応じて、より多くのコードを表示して説明できます。

于 2012-08-12T20:15:04.793 に答える