我试图动画一个物体来在两个边界之间来回移动。例如,一旦物体的x坐标达到500,它就会向相反的方向移动到200,然后再次向后移动直到达到500,依此类推。但是,矩形只会移动到500然后停止。这是我的代码的简化版本:
public class Test
{
public static class Game extends JComponent implements ActionListener
{
int width=100;
int height=100;
int x=300;
int y=200;
Timer timer;
public Game()
{
timer = new Timer(20,this);
timer.start();
}
public void paint(Graphics g)
{
g.drawRect(x,y,width,height);
g.setColor(Color.red);
g.fillRect(x,y,width,height);
}
public void actionPerformed(ActionEvent e)
{
if(x>100)
{
x+=5;
}
if(x>500)
{
x-=5;
}
repaint();
}
}
public static void main(String[] args)
{
JFrame frame = new JFrame("Test");
frame.setPreferredSize(new Dimension(800,600));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new Game());
frame.pack();
frame.setVisible(true);
}
}
答案 0 :(得分:4)
根据您的逻辑以这种方式查看,x
大于100
时,添加5
,同时大于500
减去5
500
...
因此,一旦达到100
以上,它就会大于500
并且大于5
...所以你要加上和减去delta
,意味着它不会去任何地方。
您需要的是一个基本public void actionPerformed(ActionEvent e) {
x += delta;
if (x > 500) {
delta *= -1;
x = 500;
} else if (x < 100) {
delta *= -1;
x = 100;
}
repaint();
}
值,用于描述要应用的更改量。然后,您将根据范围翻转此值...
paint
您可能还想查看Performing Custom Painting(建议不要覆盖super.paint
,您应该调用{{1}}以免破坏绘画链)和Initial Threads
答案 1 :(得分:1)
您的代码中存在一个小的逻辑错误。
if(x>100)
{
x+=5;
}
if(x>500)
{
x-=5;
}
如果x
大于500,它也大于100.因此,当它达到505时,它将添加5,然后每次更新减去5。我建议您根据movingRight
更改x
变量。
boolean movingRight = true; // start moving right
… // start of update method
if(movingRight)
{
x+=5;
}
else
{
x-=5;
}
if (x == 500) // turn around and go the other way
{
movingRight = false;
}
else if (x == 200) // turn around and go the other way
{
movingRight = true;
}
repaint();