我的问题是,我让星星随着一个线程移动,它们移动垂直并且它运行良好但是我为该星做了一个随机的X
,有时它会像这样与其他星星交叉:
这是我JPanel
的代码:
上课后台移动
public class Backgroundmoving extends JPanel {
ArrayList<starmoving> star;
public Backgroundmoving() {
this.setSize(650, 501);
star = new ArrayList<>();
for (int i = 0; i < 20; i++)
this.addStar();
}
public void addStar() {
int x, y;
x = (int) (Math.random() * 625);
y = (int) (Math.random() * 476);
starmoving e = new starmoving(x, y);
star.add(e);
Thread t = new Thread(e);
t.start();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
draw(g);
}
public void draw(Graphics g) {
g.drawImage(new ImageIcon("background.png").getImage(), 0, 0, 650, 501, null);
for (int i = 0; i < star.size(); i++) {
star.get(i).draw(g);
}
repaint();
}
public static void main(String[] args) {
// TODO code application logic here
JFrame gui = new JFrame();
gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gui.setSize(650, 510);
gui.setResizable(false);
gui.add(new Backgroundmoving());
gui.setVisible(true);
}
}
上课 starmoving
public class starmoving implements Runnable {
int x;
int y;
int yVel;
public starmoving(int x, int y) {
this.x = x;
this.y = y;
yVel = 1;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
private void move() {
y += yVel;
if (y > 476) {
y = 0;
x = (int) (Math.random() * 625);
}
}
private boolean isOffScreen() {
if (y <= 476)
return false;
return true;
}
public void draw(Graphics g) {
g.drawImage(new ImageIcon("star.png").getImage(), x, y, 12, 12, null);
}
@Override
public void run() {
while (true) {
move();
try {
Thread.sleep(7);
} catch (InterruptedException ex) {
System.out.println(ex.getMessage());
}
}
}
}
答案 0 :(得分:0)
我不希望星星交叉,在随机X之前想到一个if但是我怎么知道其他星是否在那个X中?
你有一个包含所有“StarMoving”对象的ArrayList。因此,您需要遍历该列表以确保没有任何对象相交。
除此之外,您还有其他问题。
使用正确的Java类名称。 Java类应该以大写字符开头。 (即“眩光”是错误的)
不要为动画使用多个线程。您当前的代码启动20个线程。你应该有一个Thread,然后迭代你的ArrayList来移动所有星星。
不要在draw()方法中读取图像。目前你的代码是每7ms读取一次图像。这不是很有效。图像应该被读取一次,然后存储为您班级的属性。