1

私は、レベルの1つで、羊が地雷によって爆破される可能性があるゲームを持っています。爆発アニメーションは、512x515pngファイル内に爆発画像の4x4配列を含むpngを使用することで制御されます...以下を参照してください。

ここに画像の説明を入力してください

次に、次のコードを使用して爆発をアニメートします。

            exp_bitmap_number_to_draw = (int)(time_since_death / 100);

            if (exp_bitmap_number_to_draw < 16)
            {
                explosion_dst_rect.left = b2sx(sheep_x[i]) - sheep_radius * 5;
                explosion_dst_rect.right = b2sx(sheep_x[i]) + sheep_radius * 5;

                explosion_dst_rect.bottom = b2sy(sheep_y[i]) + sheep_radius * 5;
                explosion_dst_rect.top = b2sy(sheep_y[i]) - sheep_radius * 5;

                explosion_src_rect.left = 128 * (exp_bitmap_number_to_draw % 4);
                explosion_src_rect.top = 128 * (exp_bitmap_number_to_draw / 4);

                explosion_src_rect.right = explosion_src_rect.left + 128;
                explosion_src_rect.bottom = explosion_src_rect.top + 128;

                canvas.drawBitmap(explosion_bitmap, explosion_src_rect, explosion_dst_rect, null);
            }

ここで、explosion_src_rectはRectであり、explosion_dst_rectはRectFです。b2sx()とb2sy()は、「競技場」の羊の絶対座標から画面の座標に変換する関数です。オフセットを追加するだけです。

このコードは、ネクサスSやギャラクシーS IIなど、私が試したいくつかの電話で完全に機能します。しかし、ちょうど今、友人がサムスンギャラクシータブ8.9でコードを試し、爆発が間抜けに見えたことを発見しました。彼は私にこの部分的なスクリーングラブを送ってくれました:

ここに画像の説明を入力してください

これを引き起こしている可能性のあるアイデアはありますか?

4

3 に答える 3

4

リソースが正しい密度で利用できない場合、システムはデフォルトのリソースをロードし、現在の画面の密度に一致するように必要に応じてそれらをスケールアップまたはスケールダウンします。Androidでリソースを事前にスケーリングしたくない場合があります。nodpi事前スケーリングを回避する最も簡単な方法は、構成修飾子を使用してリソースをリソースディレクトリに配置することです。例: res/drawable-nodpi/icon.png`res/drawable-nodpi/したがって、ビットマップをフォルダに入れる必要があります。ご覧ください:http://developer.android.com/guide/practices/screens_support.html

于 2012-06-01T17:12:46.337 に答える
0

あなたが言ったように、爆発フレームの1つのサイズではなく、宛先の長方形の幅がキャンバスの幅/ 4に設定されています。電話は通常同じサイズですが、大きいタブレットの方がはるかに大きくなります。画面サイズ-ドキュメントに記載されているとおり:

指定されたビットマップを描画し、宛先の長方形を埋めるために自動的にスケーリング/変換します[...]この関数は、ビットマップに関連付けられた密度を無視します。これは、ソースとデスティネーションの長方形の座標空間がそれぞれの密度にあるため、適切なスケーリング係数がすでに適用されている必要があるためです。

したがって、キャンバスサイズにスケーリングされていないビットマップは、src Rectから描画されますが、2つの場所の密度を無視して、DSTを埋めるように指示されているため、srcの境界を超えて拡張されます。

解決策については、正確にはわかりませんが、すべてのサイズの画像を使用するのは珍しいでしょう/res。ビットマップのロード方法によっては、ビットマップを拡大縮小できる場合がありますが、その場合、ビットマップ全体の固定幅の変換をより動的にする必要があります。

それがどういうわけか役立つことを願っています:)

于 2012-06-01T17:23:45.617 に答える
0

私はここで尋ねたのと同じ問題を抱えていました。答えは、通常の方法ではなく、次のようにビットマップをロードすることでした。

getResources()。openRawResource(imageId)

于 2012-06-01T17:29:42.880 に答える