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



我正在编程一个基本的java游戏,但我有一个问题。每次我尝试的时候,如果我等待10秒钟,程序就会停止正常工作。我创建了一个类,叫做Drawable,它有一个paint函数。这个paint函数在特定区域上绘制一个矩形(在构造函数中给出)。我有一个线程,迭代在数组列表中的所有可提取(随机添加,与另一个线程),只是减去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();
}

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

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

然而,拥有一个x2 <但这是一个单独的讨论。>

你还需要有

synchronized getX2() { 
    return x2; 
}

,在第二个线程中这样做:

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

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

最新更新