因此我们必须使用给定的代码使球反弹。由于测试器中的计时器方法,下面的翻译方法基本上每 1 秒运行一次。此外,测试仪将 dx 传递为 0,将 dy 传递为 1。最初球向下移动,我试图让它在到达 y = 100 时弹回。我不明白为什么这段代码不起作用,因为从逻辑上讲它使对我来说……
public void translate(int dx, int dy) {
x += dx;
y += dy;
if(y >= 100){
dy = -1 * dy;
}
}
我用这段代码运行它,球一直向下移动。 y = 球的 y 方向和 x = 球的 x 方向
更新:感谢您的回答。因此,从我得到的结果来看,我需要在调用翻译方法的方法中添加 if 语句。调用翻译方法的代码是:
private void moveMyShape() {
Timer t = new Timer(DELAY, getActionListener());
t.start();
} //method
private ActionListener getActionListener() {
return new
ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
myMoveableShape.translate(0, 1);
myShape.repaint();
}
};
}
那么我该如何在这个方法中添加 if 语句呢?比如我如何跟踪球的 y 位置,以便我可以在 translate 方法上方添加 if 语句。顺便说一句,这个 actionListener 代码在不同的类中。它在测试类中。
第二次更新:是的,我在 myMoveableShape 中有一个 public static int getY()。在测试器中,我添加了这段代码:
public void actionPerformed(ActionEvent ae) {
if(MyMoveableShape.getY() > 100 || MyMoveableShape.getY() < 0){
myMoveableShape.translate(0,-1);
}
myMoveableShape.translate(0,1);
myShape.repaint();
但是球刚刚到达 y = 100 的位置就停止了移动。
最佳答案
当您将 int
传递给翻译方法时,它是“按值”,而不是“按引用”,因此您对值所做的任何更改都不会超出方法的范围。
您需要在您的代码的更高层执行 y 的检查和它的反转,可能在您从中调用 translate
的相同方法中。
更新:
在你的类中添加一个“速度”属性,比如
private int velocityY = 1;
public int getVelocityY() {
return velocityY;
}
public void setVelocityY(int vel) {
velocityY = vel;
}
然后您可以将该 block 修改为类似于
public void actionPerformed(ActionEvent ae) {
if(MyMoveableShape.getY() > 100 || MyMoveableShape.getY() < 0){
myMoveableShape.setVelocityY(-myMoveableShape.getVelocityY());
}
myMoveableShape.translate(0,myMoveableShape.getVelocityY());
myShape.repaint();
}
更新 2:根据您的评论,您可以试一试:
private boolean goingUp = false;
public void translate(int dx, int dy) {
x += dx;
if(goingUp){
y += dy;
} else {
y -= dy;
}
if(y >= 100 || y < 0){
goingUp = !goingUp; //Toggle it back and forth
}
}
关于java - 弹跳球 Java。不明白为什么球不弹跳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26518553/