同じ画像のインスタンスが異なる場所にたくさんあるゲームを作ろうとしています。画像を一度宣言してから、そのビットマップをonDraw()で使用したいと思っていました。ただし、クラスで宣言されている任意の種類の変数を使用すると、値を保持することに注意しているため、エラーが発生します。サーフェスビューの使用に移行したばかりなので、何かが足りないのかもしれません。現在、1つの画像を描画しようとしていますが、アイデアは同じであり、複数のインスタンスに到達すると使用されます。私が今持っているもの:
class GameView extends SurfaceView implements SurfaceHolder.Callback
{
private GameThread _thread;
// vars for display, scale, etc
private int displayWidth;
private int displayHeight;
private double scale;
private Bitmap groundPic;
public GameView(Context context) {
super(context);
// set the surface holder for callback
getHolder().addCallback(this);
_thread = new GameThread(getHolder(), this);
displayWidth = getWidth();
displayHeight = getHeight();
scale = displayWidth / 512.0; // ground image is 512;
}
@Override
public void onDraw(Canvas canvas)
{
groundPic = BitmapFactory.decodeResource(getResources(), R.drawable.ground);
groundPic = Bitmap.createScaledBitmap(groundPic, displayWidth, 50, true);
canvas.drawColor(getResources().getColor(R.color.background_colour));
// draw ground
canvas.drawBitmap(groundPic,0, getHeight() - 50, null);
}
displayWidthが0であるため、これにより強制的に閉じられます。コンストラクターで値を設定するのは間違っていますか?ビューを作成した後、ContentView()を設定する前に、アクティビティから呼び出すinit()を作成してみました。すべての設定をonDraw()内に入れれば機能することはわかっていますが、実際には非効率的だと感じました。私がやりたかったのは(しかしエラーを引き起こした)init()を持ち、その中にクラス変数となるgroundPicを設定することでした。そうすると、onDrawは小さくて高速になり、これを作成し続けることができなくなりました。すべてのサイクルで同じビットマップオブジェクト。地面にも30発のミサイルを描くので、1回だけ作れるのに1サイクルごとに同じビットマップを30発作って、特定の場所で30回描くのは大変な無駄です。