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

Java 为什么碰撞检测有时只起作用?,java,android,collision-detection,Java,Android,Collision Detection,我正在创建一个android应用程序,我正在创建一个游戏,这个机器人必须能够从墙上和屏幕边缘弹起。这是我在MainGamePanel.java文件中的更新方法,我在其中调用冲突检测。 当它只需要从屏幕边缘反弹时,它就可以工作。然而,当我试图让它从墙上的物体上反弹时,它有时会起作用。如果没有,它有时会穿过墙壁,尽管只有在它上下移动时才会发生这种情况。它有时也会卡在墙上。我将如何修改碰撞检测以避免这些问题。任何帮助都将不胜感激 public void update() { // check

我正在创建一个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();
}
这是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;
    }
}

在update方法中,在for circulation中,似乎您在那里进行了逻辑操作,您会使其更具体吗?

我如何使其更具体?
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;
    }
}