2011-07-11 10 views
0

私は単純な2次元ゲームを開発しています。しかし、私は画面をクリックすると同じ敵と無制限に "スポーン"する必要があるこの時点でスタックしています。Android開発:SurfaceView配列からビットマップをロード

は、だから私は、配列である無制限で何かのために選択した最高だと思うが、私はどのようにbitmapArrayを取得すると、その後

誰かが私を助けてくださいcanvas.drawんBitmapArray内の各アイテムのアイデアを持っていません!

//サイモン

答えて

0

まず、限定された配列の並べ替えで終了します。第二に、このようなものを使用する場合はMemory Pool patternを推奨しているため、実行時に新しいインスタンスを作成しないようにします。私はhereを見つけることができるメモリプールパターンの例を書いています。

戻るあなたの質問に、最初の実装は次のようになります。

public class BitmapObject { 
    private Bitmap mBitmap; 
    private int mPositionX; 
    private int mPositionY; 
    private int mBitmapWidth; 
    private int mBitmapHeight; 
    private boolean mIsAlive; 

    public BitmapObject(Bitmap bitmap) { 
     mBitmap = bitmap; 
     mBitmapWidth = bitmap.getWidth(); 
     mBitmapHeight = bitmap.getHeight(); 
     mIsAlive = false; 
    }  

    public void draw(Canvas canvas) { 
     if (mIsAlive) { 
      canvas.drawBitmap(mBitmap, mPositionX, mPositionY, null); 
     } 
    } 

    public void setNewPosition(int touchX, int touchY) { 
     mPositionX = touchX - mBitmapWidth/2; 
     mPositionY = touchY - mBitmapHeight/2; 
    } 

    public void setIsAlive(boolean isAlive) { mIsAlive = isAlive; } 

    public boolean getIsAlive() { return mIsAlive; } 

} 

そして、あなたのSurfaceViewクラスでこのようにそれを使用します。

public class CanvasRenderer extends SurfaceView implements SurfaceHolder.Callback {  
    private static final int MAX_OBJECTS = 16; 
    private BitmapObject[] mBitmapObjectsArray; 

    public CanvasRenderer(Context context) { 
     super(context); 
     // Necessary SurfaceView initialization stuff. 

     Bitmap sprite = BitmapFactory.decodeResource(context.getResources(), 
      R.drawable.sprite); 
     mBitmapObjectsArray = new BitmapObject[MAX_OBJECTS]; 

     for (int x = 0; x < MAX_OBJECTS; x++) { 
      mBitmapObjectsArray[x] = new BitmapObject(sprite); 
     } 
    } 

    @Override 
    public void onDraw(Canvas canvas) {  
     canvas.drawColor(Color.BLACK); 
     for (int x = 0; x < MAX_OBJECTS; x++) { 
      mBitmapObjectsArray[x].draw(canvas); 
     } 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 
     // Stuff. 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) {  
     // Stuff. 
    } 

    @Override 
    public void onTouchEvent(MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      for (int x = 0; x < MAX_OBJECTS; x++) { 
       boolean isAlive = mBitmapObjectsArray[x].getIsAlive(); 
       if (!isAlive) { 
        mBitmapObjectsArray[x].setNewPosition((int) event.getX(), 
         (int) event.getY()); 
        mBitmapObjectsArray[x].setIsAlive(true); 
        break; 
       } 
      } 
     } 
    } 

} 
0

[OK]を、これが唯一のキャンバスに2ビットマップを描画する概念です。実際の実装ははるかに深刻です。

Bitmap renderbmp1 = Bitmap.createBitmap(bitmapWidth,bitmapHeight,Bitmap.Config.RGB_565); 
Bitmap renderbmp2 = Bitmap.createBitmap(bitmapWidth,bitmapHeight,Bitmap.Config.RGB_565); 

Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG); 
Canvas c = getHolder().lockCanvas(null); 
c.drawBitmap(renderbmp1, left1, top1, paint); 
c.drawBitmap(renderbmp2, left2, top2, paint); 
getHolder().unlockCanvasAndPost(c); 

renderbmp1.recycle(); 
renderbmp2.recycle(); 
関連する問題