我正在编写一个基本的Java游戏,但我遇到了问题。
每次我试一试,如果我等了10秒钟,程序就会停止正常工作。我创建了一个名为Drawable
的类,它具有paint
函数。这个paint
函数在某个区域绘制一个矩形(在构造函数上给出)。
我有一个线程迭代arraylist中的所有drawable(随机添加,与另一个线程),并将1替换为x
。当它停止正常工作时,角色可以跳跃并完成所有动画,但是绘图停止移动。起初我以为这可能会出现ConcurrentModificationException
错误,但它没有在控制台上打印出来。
所以现在我真的不知道该怎么做。
在这里,我添加了Drawables
:
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
while (Game.isPlayingGame) {
try {
Thread.sleep((long) (Math.random()*2000));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
obstacles.add(new Drawable(
Constants.WIDTH,
(int) (Constants.HEIGHT / 2),
Constants.WIDTH - 100,
(int) (Constants.HEIGHT / 2) - 100,
Color.BLUE));
}
}
});
t2.start();
我在这里移动Drawables
:
Thread t = new Thread(new Runnable() {
@Override
public void run() {
while (Game.isPlayingGame) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (Drawable d : obstacles) {
d.x -= 1;
d.x2 -= 1;
if (d.x2 < 0) {
obstacles.remove(d);
}
}
}
}
});
t.start();
绘画方法:
@Override
public void paint(Graphics g) {
super.paint(g);
floor.paint(g);
Graphics2D g2d = (Graphics2D) g;
AffineTransform ant = g2d.getTransform();
g2d.rotate(Math.toRadians(rotation),
character.x - Constants.characterSize / 2,
character.y - Constants.characterSize / 2);
character.paint(g);
g2d.setTransform(ant);
for (Drawable d : obstacles) {
d.paint(g);
System.out.println(rotation_down);
if (!rotation_down) {
if (!character.onCollision(floor)) {
character.y += (int) gravityAccel; // gravity
character.y2 += (int) gravityAccel; // gravity
gravityAccel += 0.1;
} else {
Screen.canJump = true;
gravityAccel = 0;
}
}
}
repaint();
}
提前致谢。
答案 0 :(得分:1)
正确的同步取决于Drawable的确切内部。也可以使用CopyOnWriteArrayList。对于Drawable类,x和x2的递减应该是原子的并且至少与paint()方法同步:
synchronized getX2() {
return x2;
}
然而,拥有x2&lt;的对象是没有意义的。 0但这是一个单独的讨论。
您还希望拥有
if (d.getX2 == 0) {
obstacles.remove(d);
}
else {
d.moveToLeft();
}
并在你的第二个帖子中执行以下操作:
obstacles.remove(d)
首先进行检查的原因是,如果你以其他方式进行检查,你可以在x2已经为-1,d.paint()
尚未被调用的情况下进行升级,并{{1} } 叫做。除非你的paint()方法可以处理负坐标,否则这可能会导致问题。