G
Guest
Gast
Hi, ich bastele an einem kleinen 2D-Spiel mit BufferStrategy.
Das Spiel besteht aus dem Thread, der rendert und dann gibt es da noch die Event Listener.
Jedenfalls befinden sich die Objekte, die gerendert werden müssen in einem Vector. Allerdings werden diesem Vektor Objekte hinzugefügt und aus ihm welche gelöscht.
Weil das häufig parallel passiert bekomme ich eine "ConcurrentModificationException". Ich dachte ich könnte das über ein einfaches "synchronize" lösen, aber das hat nicht funktioniert. Ich zeige euch mal etwas Code:
Wie ihr seht kann auf das Shape "currentShape" und den Vekor "Shapes" von zwei Seiten zugegriffen werden. Wie lös ich das Problem, dass es dabei "knallt"?
"InvokeLater" kann ich hier nicht verwenden, weil ich selber neuzeichne, oder?
Das Spiel besteht aus dem Thread, der rendert und dann gibt es da noch die Event Listener.
Jedenfalls befinden sich die Objekte, die gerendert werden müssen in einem Vector. Allerdings werden diesem Vektor Objekte hinzugefügt und aus ihm welche gelöscht.
Weil das häufig parallel passiert bekomme ich eine "ConcurrentModificationException". Ich dachte ich könnte das über ein einfaches "synchronize" lösen, aber das hat nicht funktioniert. Ich zeige euch mal etwas Code:
Code:
public class Editor extends Thread{
private BufferedCanvas canvas;
private Vector<Shape> shapes = new Vector<Shape>();
private Shape currentShape;
//...
public void run() {
while (true) {
Graphics2D g = canvas.getGraphicsContext();
g.setColor(Color.WHITE);
g.fillRect(0,0,800,600);
g.setColor(Color.RED);
if (currentShape != null) g.draw(currentShape);
for (Shape shape: shapes) g.draw(shape);
canvas.draw();
try { Thread.sleep(10); } catch (Exception e) {}
}
}
private class MouseInputHandler extends MouseAdapter{
public void mousePressed(MouseEvent e){
currentShape = new Line2D.Float(e.getPoint(),e.getPoint());
}
public void mouseReleased(MouseEvent e){
if (currentShape != null) {
synchronized (currentShape){
synchronized (shapes){
shapes.add(currentShape);
}
currentShape = null;
}
}
}
}
}
Wie ihr seht kann auf das Shape "currentShape" und den Vekor "Shapes" von zwei Seiten zugegriffen werden. Wie lös ich das Problem, dass es dabei "knallt"?
"InvokeLater" kann ich hier nicht verwenden, weil ich selber neuzeichne, oder?