Растровое изображение вместо Drawable - PullRequest
2 голосов
/ 04 сентября 2011

Я пытаюсь сделать простую игру (например, Арканоид) на Android.

Я использовал некоторые элементы из шаблона игры в пинг-понг, которые я нашел в интернете.

Поэтому я пытался изменить этот класс (GameObject), используя Bitmap вместо Drawable, но возникли некоторые проблемы.

У меня есть несколько вопросов:

  1. Объект Rect, который я здесь получил, использовал как поле с собственным разрешением, так как можно сделать что-то подобное, используя Bitmap?
  2. Существует ли что-то вроде .getBounds() для Bitmap?
  3. Можно ли как-нибудь сделать анимированные объекты (мигающие, изменить цвет и т. Д.) С помощью Drawable или Bitmap лучше для анимации?

Вот мой код:

package project.java.game.objects;

import android.graphics.Canvas;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;

public abstract class GameObject {

    // Directions
    public final static int DIR_LEFT = -1;
    public final static int DIR_RIGHT = 1;
    public final static int DIR_NONE = 0;
    public final static int DIR_UP = 1;
    public final static int DIR_DOWN = -1;


    /** Higer border of object */
    public int getTop() { return mPoint.y; }

    /** Lower border */
    public int getBottom() { return mPoint.y + mHeight; }

    /** Left border */
    public int getLeft() { return mPoint.x; }

    /** right border */
    public int getRight() { return mPoint.x + mWidth; }

    public int returnCenter(){ return mPoint.x + mWidth/2; }

    /** Central point */
    public Point getCenter() { return new Point(mPoint.x + mWidth / 2, mPoint.y + mHeight / 2); }

    /** Height of object */
    public int getHeight() { return mHeight; }

    /** Width */
    public int getWidth() { return mWidth; }

    /** @return Recatngle, which is limit objects */
    public Rect getRect() { 
        return mImage.getBounds(); 
    }

    /** for intersection */
    public static boolean intersects(GameObject obj1, GameObject obj2)
    {
        return Rect.intersects(obj1.getRect(), obj2.getRect());
    }


    /** for coordinates */
    protected Point mPoint;

    /** Height of image */
    protected int mHeight;

    /** Width */
    protected int mWidth;

    /** image */
    private Drawable mImage;

    /** speed */
    protected int mSpeed;

    /**Life level*/
    protected int mLifeLvl;

    /**
     * Constructor
     * @param image image which will use for object
     */
    public GameObject(Drawable image)
    {
        mImage = image;
        mPoint = new Point(0, 0);
        mWidth = image.getIntrinsicWidth();
        mHeight = image.getIntrinsicHeight();
    }

    /** point change position  */
    protected abstract void updatePoint();

    /** object change position */
    public void update()
    {
        updatePoint();
        mImage.setBounds(mPoint.x, mPoint.y, mPoint.x + mWidth, mPoint.y + mHeight);
    }

    /**to draw object */
    public void draw(Canvas canvas)
    {
        mImage.draw(canvas);
    }
    /** set Left bound */
    public void setLeft(int value) { mPoint.x = value; }

    /** set Right bound  */
    public void setRight(int value) { mPoint.x = value - mWidth; }

    /** set top bound */
    public void setTop(int value) { mPoint.y = value; }

    /** set Lower bound */
    public void setBottom(int value) { mPoint.y = value - mHeight; }

    /** center of object on OX */
    public void setCenterX(int value) { mPoint.x = value - mHeight / 2; }

    /** center of object on OY */
    public void setCenterY(int value) { mPoint.y = value - mWidth / 2; }
}

Ответы [ 3 ]

2 голосов
/ 05 сентября 2011

Чтобы получить размер растрового изображения, используйте методы getWidth() и getHeight().

Bitmap b = MediaStore.Images.Media.getBitmap(getContentResolver(), imageUri);
int width = b.getWidth();
int height = b.getHeight();  

Чтобы создать растровое изображение из растрового изображения нужного измерения, используйте метод createScaledBitmap класса Bitmap1008 *

Bitmap newBitmap  = Bitmap.createScaledBitmap(b, width, height, false);

Вы можете использовать класс Android Animation для применения анимации к растровому изображению через макет.Доступно в приложении APIDemos.(ApiDemos-> Views-> Animation-> 3D Transition)

1 голос
/ 05 ноября 2011

О, несколько дней назад я нашел решение для пересечения объектов - методы здесь только в качестве примера зависят от того, как вы создаете свой некоторый объектный класс

private boolean checkCollision(Someobject first, Someobject second) {
    boolean retValue = false;
    int width = first.getBitmap().getWidth();//get bitmap from ur object then get 
    int height = first.getBitmap().getHeight();//it size
    int firstXRangeStart = first.getCoordinates().getX();//get coordinates
    int firstXRangeEnd = firstXRangeStart + width;
    int firstYRangeStart = first.getCoordinates().getY();
    int firstYRangeEnd = firstYRangeStart + height;
    int secondXRangeStart = second.getCoordinates().getX();
    int secondXRangeEnd = secondXRangeStart + width;
    int secondYRangeStart = second.getCoordinates().getY();
    int secondYRangeEnd = secondYRangeStart + height;
    if ((secondXRangeStart >= firstXRangeStart && secondXRangeStart <= firstXRangeEnd)
        || (secondXRangeEnd >= firstXRangeStart && secondXRangeEnd <= firstXRangeEnd)) {
        if ((secondYRangeStart >= firstYRangeStart && secondYRangeStart <= firstYRangeEnd)
            || (secondYRangeEnd >= firstYRangeStart && secondYRangeEnd <= firstYRangeEnd)) {
            retValue = true;
        }
    }
    return retValue;
}Bitmap
0 голосов
/ 04 сентября 2011

Вы ищете BitmapDrawable Я думаю.

...