Hallo,
Ich bin gerade damit beschäftigt ein ziemlich anspruchsloses Partikelsystem zu programmieren. Dazu habe ich eine Klasse "Partikel" mit den Eigenschaften Farbe, Lebensdauer, Geschwindigkeit und Position erschaffen. In dieser Klasse ist ein Konstruktor an den alle Paramter übergeben werden, eine Methode draw, die ein Rechteck mit 1*1 Höhe/Breite, an die gewünschte Position, in der gewünschten Farbe, zeichnet und eine update Funktion, die Bewegungen und Lebensdauer verwaltet.
Desweiteren existiert eine Klasse "Partikelsystem". Diese verfügt über einen Vektor, in den ich eine beliebige Anzahl von Partikeln, mit gewollten Eigenschaften, speichere. Partikelsystem hat eine Methode draw, die über einen Iterator alle Partikel im Vektor durchgeht und bei denen die Methode draw aufruft. Das gleiche gilt für die Methode update.
Das funktioniert auch alles soweit, bis zu dem Punkt an dem ich tote Partikel aus dem Vektor löschen will. Dies wollte ich so implementieren, dass in der update Methode des Partikelsystems, mit Hilfe eines Iterators, jeder Partikel überprüft wird und wenn er tot ist, gelöscht wird. Doch das macht anscheinend ein Problem.
Am besten ich poste an dieser Stelle mal etwas Code:
Die draw und update Methode aus der Klasse Partikelsystem:
In der Klasse GamePanel extends JPanel implements Runnable (nach Tut von Quaxli
) habe ich eine run Methode:
Die doLogic Methode:
und die paintComponents Methode:
Der Fehler, der auftaucht, sobald ein Partikel gelöscht werden soll, ist folgender: "Exception in thread "Thread-1" java.util.ConcurrentModificationException"
und weiter unten ein Verweis: "at partikelsystem.PartikelSystem.update(PartikelSystem.java:61)"
Diese Exception wird wohl geworfen, wenn ein Iterator eine Änderung an einem System vornimmt, über welches gerade ein anderer Iterator saußt. Zumindest habe ich es so verstanden. Aber mir ist nicht ganz klar warum dies geschieht. Während der //Partikel loeschen - Schleife ist doch kein anderer Iterator am Werk. ???:L
Danke schonmal im Vorraus
Ich bin gerade damit beschäftigt ein ziemlich anspruchsloses Partikelsystem zu programmieren. Dazu habe ich eine Klasse "Partikel" mit den Eigenschaften Farbe, Lebensdauer, Geschwindigkeit und Position erschaffen. In dieser Klasse ist ein Konstruktor an den alle Paramter übergeben werden, eine Methode draw, die ein Rechteck mit 1*1 Höhe/Breite, an die gewünschte Position, in der gewünschten Farbe, zeichnet und eine update Funktion, die Bewegungen und Lebensdauer verwaltet.
Desweiteren existiert eine Klasse "Partikelsystem". Diese verfügt über einen Vektor, in den ich eine beliebige Anzahl von Partikeln, mit gewollten Eigenschaften, speichere. Partikelsystem hat eine Methode draw, die über einen Iterator alle Partikel im Vektor durchgeht und bei denen die Methode draw aufruft. Das gleiche gilt für die Methode update.
Das funktioniert auch alles soweit, bis zu dem Punkt an dem ich tote Partikel aus dem Vektor löschen will. Dies wollte ich so implementieren, dass in der update Methode des Partikelsystems, mit Hilfe eines Iterators, jeder Partikel überprüft wird und wenn er tot ist, gelöscht wird. Doch das macht anscheinend ein Problem.
Am besten ich poste an dieser Stelle mal etwas Code:
Die draw und update Methode aus der Klasse Partikelsystem:
Code:
//draw
public void draw(Graphics g) {
for(Iterator<Partikel> iter=partikel.iterator(); iter.hasNext();) {
iter.next().draw(g);
}
}
//update
public void update() {
//Bewegung/Farbe veraendern
for(Iterator<Partikel> iter=partikel.iterator(); iter.hasNext();) {
iter.next().update();
}
//Partikel loeschen
for(Iterator<Partikel> iter=partikel.iterator(); iter.hasNext();) {
if(iter.next().tot()) partikel.remove(iter);
}
}
In der Klasse GamePanel extends JPanel implements Runnable (nach Tut von Quaxli
Code:
public void run() {
while(0==0) {
computeDelta(); //momentan nur fuer FPS anzeige
doLogic();
repaint();
try {
Thread.sleep(10);
} catch (InterruptedException e) {}
}
}
Die doLogic Methode:
Code:
//doLogic
public void doLogic() {
ps.update() //ps ist das Partikelsystem
}
und die paintComponents Methode:
Code:
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
//FPS Anzeige
g.setColor(Color.red);
g.drawString("FPS: " + Long.toString(fps), 20, 10);
ps.draw(g);
}
Der Fehler, der auftaucht, sobald ein Partikel gelöscht werden soll, ist folgender: "Exception in thread "Thread-1" java.util.ConcurrentModificationException"
und weiter unten ein Verweis: "at partikelsystem.PartikelSystem.update(PartikelSystem.java:61)"
Diese Exception wird wohl geworfen, wenn ein Iterator eine Änderung an einem System vornimmt, über welches gerade ein anderer Iterator saußt. Zumindest habe ich es so verstanden. Aber mir ist nicht ganz klar warum dies geschieht. Während der //Partikel loeschen - Schleife ist doch kein anderer Iterator am Werk. ???:L
Danke schonmal im Vorraus