Hallo,
ich habe mir mal das Spiele Tutorial von Quaxli angesehen und wollte nun mal ein wenig damit rumspielen. Da ich gerne mit Vektoren im 2D Raum arbeiten würde wollte ich mir eine Vektorklasse schreiben und diese als "Kraft" an einem Spielerobjekt nutzen. Dieses verwaltet alle auf ihm wirkende Kräfte in einem Vektor (?? aus java.util). Über diese wird dann iteriert um sie zu verkleinern (Reibung). Immer wenn ich nun im Spiel hochspringe (also einen Vektor zur Liste hinzufüge) klappt es super. Die Figur springt und fällt dann langsam zurück (sobald der Sprungvektor klein genug wird um durch den Gravitationsvektor ausgeglichen zu werden). Doch ein paar cm über dem Boden stürzt meine kleine Simulation mit folgendem Fehler ab:
Gamepanel implementiert das Runnable Interface, run ist mehr oder weniger aus dem Tutorial:
in do Logic wird nur die doLogic Funktion des Spielers aufgerufen. Hier passiert folgendes:
[JAVA=56]
public void doLogic(long delta)
{
synchronized (dimishingForces) {
for (ForceVector2D vector:dimishingForces)
{
if (vector.length() != 0) {
try {
vector.trimTo(vector.length() - (reibung * delta) / ((long) 1e9));
} catch (Exception e) {
e.printStackTrace();
}
}
if (vector.length() <= 0.05) {
dimishingForces.remove(vector);
}
}
}
}
[/code]
Der ForceVektor2D ist einfach von mir mit ein paar Hilfsfunktionen wie length, trimTo etc. Synchronized habe ich drumherum geschrieben aus Verzweiflung quasi
.
Ich habe noch nicht wirklich viel mit paralellen Threads gemacht und mich wundert diese Exception ehrlich gesagt. Ich dachte ich starte nur einen Thread und der läuft? Ich wüsste nicht welcher 2. Thread gleichzeitig auf die Liste zugreifen sollte?
Gruß,
rhan
ich habe mir mal das Spiele Tutorial von Quaxli angesehen und wollte nun mal ein wenig damit rumspielen. Da ich gerne mit Vektoren im 2D Raum arbeiten würde wollte ich mir eine Vektorklasse schreiben und diese als "Kraft" an einem Spielerobjekt nutzen. Dieses verwaltet alle auf ihm wirkende Kräfte in einem Vektor (?? aus java.util). Über diese wird dann iteriert um sie zu verkleinern (Reibung). Immer wenn ich nun im Spiel hochspringe (also einen Vektor zur Liste hinzufüge) klappt es super. Die Figur springt und fällt dann langsam zurück (sobald der Sprungvektor klein genug wird um durch den Gravitationsvektor ausgeglichen zu werden). Doch ein paar cm über dem Boden stürzt meine kleine Simulation mit folgendem Fehler ab:
Code:
Exception in thread "Thread-2" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:449)
at java.util.AbstractList$Itr.next(AbstractList.java:420)
at Player.doLogic(Player.java:59)
at GamePanel.doLogic(GamePanel.java:133)
at GamePanel.run(GamePanel.java:79)
at java.lang.Thread.run(Thread.java:613)
Gamepanel implementiert das Runnable Interface, run ist mehr oder weniger aus dem Tutorial:
Java:
public void run()
{
while (gameRunning) {
computeDelta();
if (isStarted()) {
checkKeys();
doLogic();
moveObjects();
}
repaint();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
}
}
}
in do Logic wird nur die doLogic Funktion des Spielers aufgerufen. Hier passiert folgendes:
[JAVA=56]
public void doLogic(long delta)
{
synchronized (dimishingForces) {
for (ForceVector2D vector:dimishingForces)
{
if (vector.length() != 0) {
try {
vector.trimTo(vector.length() - (reibung * delta) / ((long) 1e9));
} catch (Exception e) {
e.printStackTrace();
}
}
if (vector.length() <= 0.05) {
dimishingForces.remove(vector);
}
}
}
}
[/code]
Der ForceVektor2D ist einfach von mir mit ein paar Hilfsfunktionen wie length, trimTo etc. Synchronized habe ich drumherum geschrieben aus Verzweiflung quasi
Ich habe noch nicht wirklich viel mit paralellen Threads gemacht und mich wundert diese Exception ehrlich gesagt. Ich dachte ich starte nur einen Thread und der läuft? Ich wüsste nicht welcher 2. Thread gleichzeitig auf die Liste zugreifen sollte?
Gruß,
rhan