Problem mit while-Schleife

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Problem mit while-Schleife

    Ich versuche mich grade an einem kleinen Spiel, bei dem Spielsteine mit Zeitablauf bewegt werden oder durch den Spieler selbst bewegt werden können. Mit einem Stein läuft alles gut, wenn ich aber alles in eine while-Schleife packe, damit fortlaufend Steine kommen, funktioniert die Bewegung der Steine nicht mehr, dass heißt sie werden nicht mehr angezeigt. Er läuft sich in der while-Schleife irgendwie fest und ich habe keine Idee, wo ich ansetzen muss. Hat jemand ein Stichwort oder einen Tipp für mich?

    Quellcode

    1. func spielstarten() {
    2. while spiellaufenlassen {
    3. if (neuerSteinKannLos==true) {
    4. neuerSteinKannLos = false
    5. neuenSteinsetzen()
    6. spiellaeuft()
    7. } // if Ende
    8. }
    9. } // ENDE
    10. func spiellaeuft() {
    11. spielQueue.async(qos: .userInitiated) { // Hintergrund
    12. for _ in self.startPunktY...self.startPunktY+self.spielfeldhoehe {
    13. usleep(self.spielgeschwindigkeit)
    14. for item in self.aktuellerSpielstein {
    15. // Kontrolle ob unterer Spielfeldrand erreicht ist
    16. let neuePosY = item.yPosition + self.spielsteinbreite
    17. if neuePosY > self.spielfeldendeY {
    18. self.aktuellerSpielstein.removeAll()
    19. self.neuerSteinKannLos = true
    20. return
    21. }
    22. // Stein an alter Position löschen
    23. DispatchQueue.main.async {
    24. item.bild.removeFromSuperview()
    25. }
    26. // neue Position ermitteln
    27. item.yPosition = item.yPosition + 1
    28. // Stein neu zeichnen
    29. DispatchQueue.main.async {
    30. self.view.addSubview(item.anzeigen())
    31. }
    32. } // For Ende
    33. } // For Ende
    34. } // Hintergrund Ende
    35. } // ENDE
    Alles anzeigen
  • Wenn Du kein SpriteKit verwendest, bei dem regelmäßig die update Methode von SKScene für die Aktualisierung/Bewegung der Steine aufgerufen wird, dann könntest Du einen NSTimer bzw. mit Swift einen Timer verwenden.

    Besser ist es jedoch die Bewegung der Steine mit der Bildschirmausgabe zu synchronisieren, damit die Steine bei der Bewegung nicht ruckeln. ;)
  • Zum Debuggen einfach mal ein paar temporäre Logs reinmachen bzw. den Debugger starten. Damit solltest Du das Verhalten nachvollziehen können.

    Das mit der Schleife ist nicht gut. Wenn spiellaufenlassen true ist und neuerSteinKannLos false ist, dann hängt der Thread da fest und verbraucht einfach nur Rechenpower. Das mit dem usleep ist auch nicht gut. Da wird ein neuer Thread aufgemacht und gleich kommt ein sleep. Das geht anders.

    Wie MCDan es erwähnt hat, nimm einen Timer und werde die Schleife und das sleep los. Wenn der Timer auslöst, dann machst Du das if neuerSteiKannLos und wenn das ganze fertig ist, dann stellst Du einen neuen Timer (abzüglich der verbrauchten Zeit). Wenn die neue Zeit negativ ist, dann dauerte die Berechnung zu lange...

    Als Alternative SpriteKit.