Animation, Geschwindigkeit, MilliSecs()

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Eyes_Only

Betreff: Animation, Geschwindigkeit, MilliSecs()

BeitragMo, Dez 03, 2012 14:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Community.

ich beschäftige mich seit kurzem mit BlitzBasic und bin auf dieses Tolle Forum hier gestoßen.
Nachdem ich mir Robs Tutorial durchgearbeitet habe lese ich mir gerade in dem Buch 'Jetzt lerne ich Spiele programmieren mit BB" das Kapitel Grafikseminare durch.

Es geht darum den Tiger zu animieren...

Im Buch steht:

Zitat:
Bei der Zeitsteuerung hilft uns MilliSecs(). Jedes Teilbild soll eine festgelegte Anzahl Millisekunden sichtbar sein, etwa 150. Dazu speichern wir MilliSecs() in der Zwischenvariable ZaehlStart. Bei jedem Durchlauf überprüfen wir, ob die Lebensdauer eines Teilbilds beendet ist. In diesem Fall setzen wir die Zwischenvariable wieder auf MilliSecs() und den Teilbildzähler auf 0.


Der Code ist der folgende:

Code: [AUSKLAPPEN]
If ZaehlStart + 150 < MilliSecs() Then
      Frame = Frame + 1
      If Frame = 6 Then Frame = 0
      ZaehlStart = MilliSecs()
   EndIf


Was ich jetzt nicht verstehe ist, warum die Bilder jetzt mit 150ms sichtbar sind.
Die Zeile Code: [AUSKLAPPEN]
If ZaehlStart + 150 < MilliSecs() Then
ist doch nur eine normale If-Abfrage um sicher zu stellen, dass 150ms vergangen sind. Oder? Und warum muss man Code: [AUSKLAPPEN]
ZaehlStart = MilliSecs()
setzen?

Ich weiß, dass der Code das macht was er soll und wenn ich die 150 erhöhe oder verringere die Animation schneller oder langsamer läuft, ich möchte nur gerne verstehen warum das so ist.

Kann mir jmd. erklären wie das ganze funktioniert, ich komme einfach nicht drauf... Confused

Vielen Dank schonmal
 

funkmaster5000

BeitragMo, Dez 03, 2012 15:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Willkommen in der Community!

Also das funktioniert nach folgendem Prinzip:

Zu Beginn setzt du ja deinen Zähler auf eine bestimmte Zeit, nämlich die Zeit, die vergangen ist, seit dein PC angeschaltet wurde. Das passiert mit ZaehlStart = MilliSecs().

Addierst du auf diesen Wert 150 (ZaehlStart + 150) hast du einen Wert, der 150ms in der Zukunft liegt. Wenn du jetzt bei jedem Schleifendurchlauf die aktuellen Millisekunden abfragst ergibt sich so eine Verzögerung.

Irgendwann ist aber ZaehlStart + 150 vergangen. In diesem Fall, musst du ZaehlStart einen neuen Wert zuweisen, mit ZaehlStart = Millisecs(), da ZaehlStart ja plötzlich größer ist als ZaehlStart + 150 und so die If-Anweisung nicht mehr greifen würde.

Mit einer Uhrzeit ist das denke ich einfach zu erläutern:

Im 30-Minuten-Takt fährt der Bus.
Bus 1 = 14.00
Bus 2 = 14.30
Bus 3 = 15.00

Aktuelle Uhrzeit = 14.00

Repeat
If Aktuelle Uhrzeit < Aktuelle Uhrzeit + 30 Then Bus 1
If Aktuelle Uhrzeit = Aktuelle Uhrzeit + 30 Then
Bus 2
Aktuelle Uhrzeit = Aktuelle Uhrzeit *
Forever

*die aktuelle Uhrzeit entspricht in diesem Fall dann nämlich 14.30 und muss aktualisiert werden. Ansonsten würde Bus 3 ja nie losfahren, da du am Anfang die aktuelle Uhrzeit einmal als 14.00 definiert hast.
  • Zuletzt bearbeitet von funkmaster5000 am Mo, Dez 03, 2012 15:19, insgesamt einmal bearbeitet
 

Eyes_Only

BeitragMo, Dez 03, 2012 15:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank für die schnelle und umfangreiche Antwort.

Du schreibst:
Zitat:
Zu Beginn setzt du ja deinen Zähler auf eine bestimmte Zeit, nämlich die Zeit, die vergangen ist, seit dein PC angeschaltet wurde. Das passiert mit ZaehlStart = MilliSecs().


Wenn ich aber das erste mal bei der If-Abfrage ankomme, steht "Zaehlstart" doch aber noch auf 0 (weil ZaehlStart = MilliSecs() noch nie ausgeführt wurde) und er guckt ob 0+150 < MilliSecs() ist, richtig? Das würde ja bedeuten, dass ich beim ersten Durchlauf noch keine Verzögerung habe sondern eine Verzögerung erst dann eintritt, wenn das erste mal ZaehlStart = MilliSecs() ausgeführt wurde, habe ich das richtig verstanden?
 

funkmaster5000

BeitragMo, Dez 03, 2012 15:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Doch, du hast eine Verzögerung. Da Zaehlstart auf 0 steht und abgefragt wird, ob die Zeit kleiner ist als Zaehlstart + 150 also 0 + 150. Mein Busbeispiel war dementsprechend ein bisschen falsch.

Code: [AUSKLAPPEN]

Anfang:
Zaehlstart = 0ms
Zeit = 0ms
Zaehlstart + 150 = 150 ms

Schleife:
____________________________
Durchlauf 1:
Zeit = 120ms
Ist Zaehlstart + 150ms < Zeit, dann zähle ein Bild hoch

(Hier ist Zaehlstart + 150 (0 + 150 = 150) größer als die Zeit , also wird kein Bild hochgezählt und du hast eine Verzögerung)
___________________________
Durchlauf 5:
Zeit = 155ms
Ist Zaehlstart + 150ms < Zeit, dann zähle ein Bild hoch, setze Zaehlstart auf die aktuelle Zeit.

(Hier ist Zaehlstart + 150 kleiner als die Zeit, also wird ein Bild hochgezählt.)


Wenn bei Durchlauf 5 nicht der Befehl käme setze Zaehlstart auf die aktuelle Zeit, dann wäre Zaehlstart ja immer noch 0. Jetzt stell dir aber Durchlauf 6 vor. Da erhöht sich die Zeit ja wieder, meinetwegen auf 180ms. Zaehlstart wäre aber immernoch 0. Natürlich ist Zaehlstart + 150 dann in künftigen Durchläufen immer kleiner als die Zeit und das wäre falsch. Du würdest sofort ein Bild weiterzählen und du hättest keine Verzögerung mehr, da die If-Anweisung nicht mehr erfüllt ist. Deswegen musst du Zaehlstart einen neuen höheren Wert zuweisen und das ist in dem Fall dann die Zeit. Das machst du, sobald die Zeit 150 erreicht. Setzt du dann Zaehlstart = Zeit und fragst Zaehlstart + 150 ab (das wäre dann 300), wird dein Bild das nächste Mal bei 300 ms weitergezählt. Und so weiter. So bleibt der 150ms Takt erhalten.
 

Eyes_Only

BeitragMo, Dez 03, 2012 16:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen vielen Dank, das war gut zu verstehen. Very Happy
Schöne Ausführungen.

Aber in einem Punkt muss ich dir wiedersprechen:

Zitat:
Doch, du hast eine Verzögerung. Da Zaehlstart auf 0 steht und abgefragt wird, ob die Zeit kleiner ist als Zaehlstart + 150 also 0 + 150.


Wird durch Code: [AUSKLAPPEN]
If ZaehlStart + 150 < MilliSecs() Then
nicht eher abgefragt, ob Zaehlstart kleiner als Zeit (MilliSecs()) ist?

Angenommen ich starte meinen Computer und irgendwann führe ich das Spiel aus.
Angenommen der PC läuft schon 900000ms, dann wird doch geprüft, ob Zaehlstart+150 kleiner ist als MilliSecs(). Und da 150 auf jeden Fall kleiner ist als 900000 wird doch sofort ein Bild hochgezählt, ohne dass eine Verzögerung vorliegt oder sehe ich das falsch?

Ist vlt. ein bisschen kleinkariert... nicht böse sein... Wink

Vielen Dank nochmal für die schöne Hilfe. Das mit der grds. Verzögerung habe ich jetzt kapiert. *freu*
 

funkmaster5000

BeitragMo, Dez 03, 2012 16:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Bin ich nicht böse drum, du hast absolut recht. Ich wollte natürlich nur...äh...schauen, ob du aufpasst Very Happy

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group