1

同じ画像のインスタンスが異なる場所にたくさんあるゲームを作ろうとしています。画像を一度宣言してから、そのビットマップを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回描くのは大変な無駄です。

4

1 に答える 1

0

displayWidthが0であるため、これにより強制的に閉じられます。コンストラクターで値を設定するのは間違っていますか?

はい、通常の動作では、SurfaceView構築時にまだレイアウトされていないことが示されているためです。代わりに、を使用して、そのサイズと形式SurfaceHolder.Callbackに関連する変更を検出する必要があります。SurfaceViewコードスニペットは、おそらくすでに関連するメソッドが存在することを示唆しています。

class GameView extends SurfaceView implements SurfaceHolder.Callback

を実装しているので、どこかCallbackにメソッドがあるはずです。surfaceChanged(SurfaceHolder holder, int format, int width, int height)渡されたパラメータを使用してwidthheightスケールを計算し、を適切にスケールダウンできますBitmap。同様に、で画像の読み込みを行うことができますsurfaceCreated(SurfaceHolder holder)

SurfaceViewスレッドドローイングの使用とスレッド化に関するその他のヒントについては、GoogleのLunar Landerサンプルプロジェクト、特にLunarViewクラスをご覧ください。

于 2012-04-28T03:06:14.530 に答える