Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Es handelt sich hierbei das Spiel: Hooptoss zu programmieren. Ich hab soweit alles fertig allerdings komm ich bei einem Problem nicht vorran. Um es euch etwas leichter zu machen, ist hier drunter ein Screen vom Spiel.
Die Stäbe (Pegs) unten bewegen sich hin un her.
Mit der Maus lege ich die Position des Kreises (oben) fest.
Sobald ich nun auf die Maus klicke fällt dieser runter. Ist er auf der gleichen Höhe wie die Stäbe wir ermittelt ob sich ein Stab im Kreis befindet. Falls ja, soll sich dieser löschen, der Score geht rauf und man fängt wieder oben an. Falls nicht get der Score runter und man fängt wieder oben an.
Problem:
Mir gelingt es immer nur die Position des letzen Stabes zu speichern. Dh der Stab wird nur gelöscht fals es der letze in der Liste ist.
Hier der Code:
Java:
public void doStep(int width, int height) {
if (ring.isFalling()) {
ring.setY(ring.getY() + ring.getSpeed());
}
for (int i = pegs.size()-1;i>=0;i--) {
Peg peg = pegs.get(i);
// if peg touches the left side it will be placed on the right side
if (peg.getX() + peg.getSpeed() <= 0) { peg.setX(width); }
// if peg tocuhes the right side it will be placed on the left side
if (peg.getX() + peg.getSpeed() >= width) { peg.setX(0); }
// peg moving
peg.setX(peg.getX() + peg.getSpeed());
int ringLeft = ring.getX() - ring.getWidth() / 2;
int ringRight = ringLeft + ring.getWidth();
int pegLeft = peg.getX() - peg.getWidth() / 2;
int pegRight = pegLeft + peg.getWidth();
int ringBottom = ring.getY() + ring.getWidth() / 2;
int pegTop = peg.getY();
if (ringBottom >= pegTop) {
// ( | | )
if (ringLeft <= pegLeft && pegRight <= ringRight) {
score += 2 * peg.getWidth();
pegs.remove(peg);
ring.setFalling(false);
ring.setY(8);
} else {
score -= 10;
ring.setFalling(false);
ring.setY(8);
}
}
}
}
Nein mein Objekt wurde bereits in einer andern Methode erstellt. Hier lauf ich nur von hinten nach vorne einmal ganz durch und ändere immer die Position der Stäbe.
als erstes:
über eine ArrayList kann man mit foreach gehen:
Java:
for (Peg element: pegs){pegs.doSomething()...}
2. wenn du eine Collection manipulieren willst, über die du gerade drüber iterierst, dann wirst du eine Exception fangen, dass du die aktuelle Collection nicht verändern darfst.
Dafür nimmt man dann einen Iterator -> Java Iterator googlen, fertig.
Leider schreibst du nicht, wie sich der Fehler äussert. Wo genau fällt dir das auf? Wie oft wird deine Schleife durchlaufen? Was sagt der debugger, wenn du in deinen Bool-Vergleich schaust?
Mit for each tritt ein CurrentModification-Error auf und das ist auch der Grund warum ich rückwärts durch die Liste laufe.
Ich bekomm auch keine Fehler angezeigt.
Es ist so, dass ich ein Timer habe der dauernd diese Methode aufruft, sodass die Stäbe halt dauernd einen "Step" machen. Thoretisch fängt er beim letzen Stab an, der bewegt sich dann und dabei wird auch noch kontrolliert ob er sich im Kreis befindet. Dann kommt der 2t letze in der Liste und da müsste eigentlich das gleiche passieren. Allerdings wenn ich die Position unten printe lasse ist sie nochimmer die des letzen Stabes.
Das Problem ist eigentlich, dass er nicht dauernd alle Positionen kontrolliert, sondern nur die des letzen Stabes. Dh immer nur der letze Stab kann gelöscht werden.
Na Klasse...e ist ja nicht so, dass es das bloß machen würde, um dich zu ärgern. Indem du das umgehst lädsts du Fehler ja geradezu ein, z.B. wenn sich die Länge deine rListe zwischendurch ändert, während durchgelaufen wird. Dann überlege doch besser mal, wie du e hinbekommst, dass die Exception nicht geworfen werden muss.