为什么碰撞检测有时会起作用?

时间:2014-07-17 05:40:13

标签: java android collision-detection

我正在创建一个Android应用程序,我正在创建一个游戏,机器人必须能够从墙壁和屏幕边缘反弹。这是我的MainGamePanel.java文件中的更新方法,我调用了碰撞检测。 它只需要从屏幕边缘反弹就可以工作。然而,当我试图让它从墙上的物体上反弹时,它有时会起作用。当它没有时,它有时会穿过墙壁,虽然这只会在它上下移动时发生。它有时也会卡在墙上。我如何修改碰撞检测,以便我不会遇到这些问题。任何帮助将非常感激。

public void update() 
{
    // check collision with right wall if heading right
    if (droid.getSpeed().getxDirection() == Speed.DIRECTION_RIGHT
            && droid.getX() + droid.getBitmap().getWidth() / 2 >= getWidth()) {
        droid.getSpeed().toggleXDirection();

    }
    // check collision with left wall if heading left
    else if (droid.getSpeed().getxDirection() == Speed.DIRECTION_LEFT
            && droid.getX() - droid.getBitmap().getWidth() / 2 <= 0) {
        droid.getSpeed().toggleXDirection();
        droid.getSpeed().setYv(0);
    }
    // check collision with bottom wall if heading down
    else if (droid.getSpeed().getyDirection() == Speed.DIRECTION_DOWN
            && droid.getY() + droid.getBitmap().getHeight() / 2 >= getHeight()) {
        droid.getSpeed().toggleYDirection();
        droid.getSpeed().setXv(0);
    }
    // check collision with top wall if heading up
    else if (droid.getSpeed().getyDirection() == Speed.DIRECTION_UP
            && droid.getY() - droid.getBitmap().getHeight() / 2 <= 0) {
        droid.getSpeed().toggleYDirection();
        droid.getSpeed().setXv(0);
    }

    for (int i = 0 ; i < listOfWs.length ; i++)
    {
        if (droid.getX() +(droid.getBitmap().getWidth()/2)+1 > listOfWs [i].giveLeft ()
                && droid.getX()-(droid.getBitmap().getWidth()/2)-1 < listOfWs [i].giveRight () 
                && droid.getY()+(droid.getBitmap().getHeight()/2)+1 > listOfWs [i].giveTop ()
                && droid.getY()-(droid.getBitmap().getHeight()/2)-1 < listOfWs [i].giveBottom () )
        {
            if(droid.getSpeed().getYv()==0){
                droid.getSpeed().toggleXDirection();//Takes the speed and multiplies it by -1 so it changes direction   
            }
            else{
                droid.getSpeed().toggleYDirection();    
            }
        }

    }
    // Update the lone droid
    droid.update();
}

这是我使用的droid.java文件。

public class Droid {
    private Bitmap bitmap; // the actual bitmap
    private int x;   // the X coordinate
    private int y;   // the Y coordinate
    public Speed speed;

    public Droid(Bitmap bitmap, int x, int y) {
         this.bitmap = bitmap;
         this.x = x;
         this.y = y;
         speed= new Speed();
    }
    public Bitmap getBitmap() {
         return bitmap;
    }
    public void setBitmap(Bitmap bitmap) {
        this.bitmap = bitmap;
    }
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }

    public void draw(Canvas canvas) {
        canvas.drawBitmap(bitmap, x - (bitmap.getWidth() /2), y - (bitmap.getHeight() / 2), null);
    }

    public void update() {
        x += (int)(speed.getXv() * speed.getxDirection());
        y += (int)(speed.getYv() * speed.getyDirection());
    }

    public Speed getSpeed(){
        return speed;
    }
}

这是speed.java文件。

public class Speed {

    public static final int DIRECTION_RIGHT = 4;
    public static final int DIRECTION_LEFT  = -4;
    public static final int DIRECTION_UP    = -4;
    public static final int DIRECTION_DOWN  = 4;

    private float xv = 1;   // velocity value on the X axis
    private float yv = 1;   // velocity value on the Y axis

    private int xDirection = DIRECTION_RIGHT;
    private int yDirection = DIRECTION_DOWN;

    public Speed() {
        this.xv = 1;
        this.yv = 1;
    }
    public Speed(float xv, float yv) {
        this.xv = xv;
        this.yv = yv;
    }

    public float getXv() {
        return xv;
    }

    public void setXv(float xv) {
        this.xv = xv;
    }

    public float getYv() {
        return yv;
    }

    public void setYv(float yv) {
        this.yv = yv;
    }

    public int getxDirection() {
        return xDirection;
    }

    public void setxDirection(int xDirection) {
        this.xDirection = xDirection;
    }

    public void setRight() {
        xDirection = DIRECTION_RIGHT;
    }

    public void setLeft() {
        xDirection = DIRECTION_LEFT;
    }
    public void setUp() {
        yDirection = DIRECTION_UP;
    }
    public void setDown() {
        yDirection = DIRECTION_DOWN;
    }

    public int getyDirection() {
        return yDirection;
    }

    public void setyDirection(int yDirection) {
        this.yDirection = yDirection;
    }

    // changes the direction on the X axis
    public void toggleXDirection() {
        xDirection = xDirection * -1;
    }

    // changes the direction on the Y axis
    public void toggleYDirection() {
        yDirection = yDirection * -1;
    }
}

1 个答案:

答案 0 :(得分:0)

在更新方法中,为了流通,你似乎在那里进行逻辑操作,你会更具体吗?