私は単純な2次元ゲームを開発しています。しかし、私は画面をクリックすると同じ敵と無制限に "スポーン"する必要があるこの時点でスタックしています。Android開発:SurfaceView配列からビットマップをロード
は、だから私は、配列である無制限で何かのために選択した最高だと思うが、私はどのようにbitmapArrayを取得すると、その後
誰かが私を助けてくださいcanvas.drawんBitmapArray内の各アイテムのアイデアを持っていません!
//サイモン
私は単純な2次元ゲームを開発しています。しかし、私は画面をクリックすると同じ敵と無制限に "スポーン"する必要があるこの時点でスタックしています。Android開発:SurfaceView配列からビットマップをロード
は、だから私は、配列である無制限で何かのために選択した最高だと思うが、私はどのようにbitmapArrayを取得すると、その後
誰かが私を助けてくださいcanvas.drawんBitmapArray内の各アイテムのアイデアを持っていません!
//サイモン
まず、限定された配列の並べ替えで終了します。第二に、このようなものを使用する場合は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;
}
}
}
}
}
を
[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();