java移动对象(一个简单的机器模拟器)

rjzwgtxy  于 2021-07-11  发布在  Java
关注(0)|答案(1)|浏览(299)

我正在java上开发一个黄昏清洁器模拟器,在这个例子中,清洁器的形状是一个圆形的球。
这个程序很简单,用户输入“房间”的宽度和长度以及坐标x和y。
我想做但不能做的是创建一系列命令,每个命令由一个字符表示。我要执行三个命令:
1.char'a'=向前移动1米
2.char'l'=左转90度
3.右转90度
用户输入aala的示例,在这种情况下,预期输出是机器移动2米,然后左转90度,然后再次移动1米。希望我明白。
正如你在代码中看到的,我试图创建一个字符数组,但我不知道下一步该怎么做。。。
代码:

public class Cleaner extends JPanel {
    /* int lx = 1, ly = 1;
    int x = 200, y = 250;

    */
    int x, y;
    int width = 52, height = 50; // width and height of the "dust sucker"
    int lx , ly;

    // an array of chars
    char[] charArray ={ 'A', 'L', 'R'};     

    java.util.Timer move; // making the instance of Timer class from the util package
    static JFrame frame;

    Cleaner()
    {

        frame = new JFrame ("Cleaner started!"); // passing attributes to our fame
        frame.setSize (400, 400); // setting size of the starting window
        frame.setVisible (true);

        setForeground(Color.black); // setting color

        move = new java.util.Timer();

        move.scheduleAtFixedRate(new TimerTask()
        {

            public void run() 
            {
                if(x<0)
                    lx = 1;
                if(x>=getWidth()-45)
                    lx = -1; // -1 sets boundry for the dusk sucker
                if(y<0)
                    ly = 1;
                if(y>=getHeight()-45)
                    ly = -1; // -1 sets boundry for the dusk sucker

                x+=lx; // to make the machine move
                y+=ly;

                repaint();
            }

        }, 0, 5// speed of the machine
                );

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    public void paint (Graphics g) 
    {
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.fillOval(x, y, width, height);
    }

    public static void main (String[] args) 
    {
        // lx value

        String lxValue = 
                 JOptionPane.showInputDialog( "Enter lx" );
        // ly value
        String lyValue =
                  JOptionPane.showInputDialog( "Enter ly" );

        String xValue = 
                 JOptionPane.showInputDialog( "Enter x value" );
        // ly value
        String yValue =
                  JOptionPane.showInputDialog( "Enter y value" );

         // convert String inputs to int values 
          int firstInput = Integer.parseInt( lxValue ); 
          int secondInput = Integer.parseInt( lyValue );
          int thirdInput = Integer.parseInt( xValue ); 
          int forthInput = Integer.parseInt( yValue );

             Cleaner cleaner = new Cleaner();

                frame.add(cleaner);
          cleaner.lx = firstInput;
          cleaner.ly = secondInput;
          cleaner.x = thirdInput;
          cleaner.y = forthInput;       

    }

}

感谢您的帮助!

o2rvlv0m

o2rvlv0m1#

首先是一些基本知识:
覆盖 paintComponent() ,而不是在进行自定义绘制时绘制()。
使用 Swing Timer 为动画。对swing组件的所有更新都需要在事件调度线程(edt)上完成。
在这种情况下,清洁器的形状是一个圆球。
所以需要创建一个类来表示球。它的基本特性如下:
大小
位置
运动方向。
移动速度。
然后需要创建方法来更改属性。也许 吧:
move()-以当前速度沿当前方向移动
向右旋转()-调整方向
左转()-调整方向
然后可以创建一个arraylist来存储移动,并创建一个swing计时器来执行移动。
每当计时器触发时,您就从arraylist中删除该命令并执行该命令。通过调用上述3个方法之一。
检查:获取类外jpanel的宽度和高度,例如一个与您想要的相似(不精确)的示例。它演示了创建具有控制其运动所需属性的对象的概念。

相关问题