2012-04-27 4 views
1

私は、同じイメージのインスタンスがさまざまな場所にあるゲームを作ろうとしています。イメージを一度宣言してから、そのビットマップをonDraw()で使用したいと考えていました。しかし、クラスで宣言されている変数を使用すると、その値を保持しているメモがあるのでエラーが発生します。 私はちょうどsurfaceviewを使用するように移動したので、多分私はそれで何かを見逃しています。私は現在、1つのイメージを描画しようとしていますが、アイデアは同じで、複数のインスタンスに到達すると使用されます。面白いonDrawの同じ画像の複数のインスタンスを効率的に描画します

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アムであるので、これは近い力が発生します。私は今持っている何 ?私はビューを作成した後でsetContentView()を呼び出す前に、自分のアクティビティから呼び出すinit()を作成しようとしました。 すべての設定をonDraw()内に置くとうまくいくことが分かりますが、実際には効率が悪いと感じました。 私は(エラーを引き起こした)期待していたのは、init()とその内部に、クラス変数となるgroundPicを設定してから、onDrawを小さくして速くすることでした。この同じビットマップオブジェクトは、すべてのサイクルで使用されます。私は地上でも30個のミサイルを作っていくつもりだから、1回だけ作って30回の特定の場所で作ってみると、毎回同じビットマップを30回作ってしまうと大変だ。 誰かが正しい方向に私を指し示して、これが適切に働くことができれば、それは大いに感謝されます。

答えて

0

これは、displayWidthが0なので強制終了させます。 コンストラクタの値を設定していませんか?

はい、通常の動作では、SurfaceViewは構築時にまだレイアウトされていないことが示されています。代わりにSurfaceHolder.Callbackを使用して、SurfaceViewのサイズとフォーマットに関連する変更を検出する必要があります。あなたがCallbackを実装しているので、あなたがどこかsurfaceChanged(SurfaceHolder holder, int format, int width, int height)メソッドを持っている必要があり

class GameView extends SurfaceView implements SurfaceHolder.Callback 

:あなたのコードスニペットは、あなたはおそらくすでに存在する関連するメソッドを持っていることを示唆しています。 widthheightのパラメータを使用して、スケールを計算し、Bitmapを適切にスケールダウンすることができます。同様に、surfaceCreated(SurfaceHolder holder)に画像を読み込むこともできます。

SurfaceViewとスレッド描画の詳細については、GoogleのLunar Lander sample project、特にLunarViewクラスをご覧ください。

+0

ありがとうございました!私はHandlersとRunnablesを試してみることにしました。これまでのところうまくいきましたが、次の試合では必ずSurfaceViewを試してみましょう。 偉大な指針、私は本当にそれを感謝します。 –

関連する問題