gpt4 book ai didi

java - 我的 java 程序意外停止正常工作

转载 作者:行者123 更新时间:2023-11-30 07:09:46 25 4
gpt4 key购买 nike

我正在编写一个基本的 Java 游戏,但遇到了问题。每次我尝试时,如果我只等待 10 秒钟,程序就会停止正常工作。我创建了一个名为 Drawable 的类,它具有 paint 函数。这个paint函数在特定区域上绘制一个矩形(在构造函数中给出)。我有一个线程迭代数组列表中的所有可绘制对象(使用另一个线程随机添加),然后将其 x 减去 1。当它停止正常工作时,角色可以跳跃并执行所有动画,但可绘制对象停止移动。起初我认为这可能会给出 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();
}

提前致谢。

最佳答案

正确的同步取决于您的 Drawable 的确切内部结构。还可以使用 CopyOnWriteArrayList。对于 Drawable 类,x 和 x2 的减量应该是原子的,并且至少与 Paint() 方法同步:

synchronized moveToLeft() { 
x-=1;
x2-=1;
}

但是,拥有 x2 < 0 的对象是没有意义的,但这是一个单独的讨论。

您还想拥有

synchronized getX2() { 
return x2;
}

并在你的第二个线程中执行如下操作:

if (d.getX2 == 0) { 
obstacles.remove(d);
}
else {
d.moveToLeft();
}

首先进行检查的原因是,如果您以其他方式进行检查,则可以在 x2 已经是 -1 的情况下进行,obstacles.remove(d) 尚未执行尚未调用,并且 d.paint() 被调用。除非您的 Paint() 方法可以处理负坐标,否则这可能会导致问题。

关于java - 我的 java 程序意外停止正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39417662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com