因此我们必须使用给定的代码进行反弹。基本上,由于测试仪中的计时器方法,下面的转换方法每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位置并停止移动。
答案 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静态的东西?需要更多代码才能做得更好。