次の例 (ここで説明) を使用して、スプライト シートをアニメーション化します。
例から私は私のオブジェクトを書きました:
public class Sprite {
private int x, y;
private int width, height;
private Bitmap b;
MainGamePanel ov;
int currentFrame = 0;
public Sprite(MainGamePanel mainGamePanel, Bitmap blob) {
this.ov = mainGamePanel;
this.b = blob;
// 1x12
height = b.getHeight();
width = b.getWidth()/12;
x = y = 50;
}
private void update(int dist) {
currentFrame = ++currentFrame % 12;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
//return _b;
}
public void draw(int shift, Canvas canvas, int dist) {
update(dist);
int srcX = currentFrame * width;
Rect src = new Rect(srcX, 0, srcX+width, height);
Rect dst = new Rect(x, y+shift, x+width, y+height+shift);
canvas.drawBitmap(b, src, dst, null);
}
ここでは、100 ミリ秒ごとに画像 (ビットマップ) から別の部分を取り出して表示します。
1 -> 2 -> 3 -> 4 -> ... -> 12
だから私の生き物は翼で飛んで動きます。
オブジェクトを1 つだけ表示する場合は問題ないように見えますが、ループで 20 のクリーチャーを実行しようとすると、次のようになります。
Bitmap blob = BitmapFactory.decodeResource(getResources(), R.drawable.sprite3);
for(int i=0; i<20; i++){
spriteList.add(new Sprite(this, blob));
}
....
for(int i=0; i<spriteList.size(); i++){
sprite = spriteList.get(0);
sprite.draw(canvas, dist);
}
描画されたオブジェクトの数に応じて、オブジェクトが遅くなり始めます。
のせいだと思いますThread.sleep(100);
。
パフォーマンスの問題は見られません。
各オブジェクトがスリープすると、すべてのオブジェクトが一時停止するように聞こえます。
20 個のオブジェクトの場合、このスリープは 2 秒になります。
確かに私は次のような回避策を使用します:
int sleep = 100/spriteList.size();
Thread.sleep(sleep);
しかし、コードは乱雑に見えます。
誰かがそれを修正する方法を手伝ってくれますか?
ここにsprite3画像があります:
[編集]
たぶん、各オブジェクトを別々のスレッドで作成する必要がありますか?