Java,移动矩形后退和后退

时间:2014-09-01 05:58:57

标签: java

我试图动画一个物体来在两个边界之间来回移动。例如,一旦物体的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);
    }


}

2 个答案:

答案 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();