Разработка Android: SurfaceView Загрузка растрового изображения из массива - PullRequest
0 голосов
/ 11 июля 2011

Я занимаюсь разработкой простой 2d игры.Но я застрял в этой точке, где мне нужно «неограниченно» порождать одного и того же врага, когда я нажимаю на экран.

Так что я думаю, что лучший выбор для чего-то с неограниченным - это массив, но я понятия не имею, какполучить bitmapArray, а затем для каждого элемента в BitmapArray сделать canvas.draw

Кто-нибудь, пожалуйста, помогите мне!

// Simon

Ответы [ 2 ]

0 голосов
/ 11 июля 2011

Прежде всего, вы получите своего рода ограниченный массив. Во-вторых, я рекомендую шаблон пула памяти при использовании подобных вещей, чтобы вы не создавали новые экземпляры во время выполнения.

Возвращаясь к вашему вопросу, первая реализация будет выглядеть примерно так:

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 голосов
/ 11 июля 2011

Хорошо, это всего лишь концепция рисования 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...