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