Понг Отражение от стен

Я делаю игру типа понг на java, и я пытаюсь заставить мяч отскакивать от стен, но всякий раз, когда мяч ударяет по мячу, он просто останавливается, он не отражается от стены, и я не могу понять Зачем.

Класс Ball, который управляет движением мяча

public class Ball {
private double x;
private double y;
private double time;
private double  xreflection=1.0;
private double yreflection=1.0;
private BallTrajectory traj=new BallTrajectory(20, 20);

public Ball(double x, double y) {
    this.x=x;
    this.y=y;
}
public void tick() {
        time+=1.0/60.0;
        if(x==0)
            xreflection=1.0;
        else if(x==Game.Width-15)
            xreflection=-1.0;
        if(y==0)
            yreflection=1.0;
        else if(y==Game.Height-15)
            yreflection=-1.0;
    x+=traj.xvel()*xreflection;
    y-=traj.yvel(time)*yreflection;

}
public void render(Graphics g) {
    g.setColor(Color.pink);
    g.fillOval((int)x, (int)y, 15,15);
}

}

Этот класс обрабатывает траекторию мяча, когда он движется по типу снаряда.

public class BallTrajectory {
private double initvel;
private double theta;

public BallTrajectory(double initvel, double theta) {
    this.initvel=initvel;
    this.theta=theta;
}
public double xvel() {
    double xvelo=initvel*Math.cos(Math.toRadians(theta));
    return xvelo;
}

public double yvel(double time) {
    double yvelo=initvel*Math.sin(Math.toRadians(theta))-(9.8*time);
    return yvelo;
}

public double xpos(double time) {
    double xpos=initvel*Math.cos(Math.toRadians(theta))*time;
    return xpos;
}

public double ypos(double time) {
    double ypos=initvel*Math.sin(Math.toRadians(theta))*time-.5*9.8*Math.pow(time, 2);
    return ypos;
}

person Joe Butler    schedule 03.12.2018    source источник
comment
Вам действительно нужно начать изучать, как отлаживать код, в том числе проверять вашу логику, выводить операторы и использовать отладчик.   -  person MadProgrammer    schedule 04.12.2018
comment
Я думаю, поскольку значения равны doubles, маловероятно, что они будут точно целевым значением, вместо этого вы можете использовать if (x <= 0) { и т. Д. И т. Д.   -  person MadProgrammer    schedule 04.12.2018


Ответы (1)


Не проводя целого ряда тестов, я бы предположил, что очень маловероятно, что x когда-либо будет в точности равно Game.Width или 0. Вместо этого вы должны проверить, что значение находится "в пределах границ", может быть что-то вроде ...

public void tick() {
  time += 1.0 / 60.0;
  if (x <= 0) {
    xreflection = 1.0;
  } else if (x >= Game.Width - 15) {
    xreflection = -1.0;
  }
  if (y <= 0) {
    yreflection = 1.0;
  } else if (y >= Game.Height - 15) {
    yreflection = -1.0;
  }
  x += traj.xvel() * xreflection;
  y -= traj.yvel(time) * yreflection;
}

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

person MadProgrammer    schedule 04.12.2018