弹跳球Java。无法理解为什么球没有反弹

时间:2014-10-22 22:58:35

标签: java

因此我们必须使用给定的代码进行反弹。基本上,由于测试仪中的计时器方法,下面的转换方法每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方向

更新:感谢您的回答。所以从我得到的东西我需要在调用translate方法的方法中添加if语句。调用translate的方法的代码是:

 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位置并停止移动。

2 个答案:

答案 0 :(得分:3)

当您将int传递给translate方法时,它是'按值',而不是'按引用',因此您对该值所做的任何更改都不会超出方法的范围。

您需要对代码中的y进行检查并将其反转,可能与您从translate调用的方法相同。

<强>更新

为您的班级添加'velocity'属性,例如

private int velocityY = 1;
public int getVelocityY() {
    return velocityY;
}
public void setVelocityY(int vel) {
    velocityY = vel;
}

然后您可以将该块修改为与

类似的内容
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
    }
  }

答案 1 :(得分:1)

尝试将if语句置于+ =语句之上。

像:

public void translate(int dx, int dy) 
{
  if(y >= 100)
  {
    dy = -1 * dy;
  }
  x += dx;
  y += dy;
}

我确定我错过了y和x静态的东西?需要更多代码才能做得更好。