Timer, Millisecs() und zeitliche Abläufe für Anfänger
Übersicht BlitzBasic FAQ und Tutorials
MidimasterBetreff: Timer, Millisecs() und zeitliche Abläufe für Anfänger |
Mi, Apr 07, 2010 9:15 Antworten mit Zitat |
|
---|---|---|
Timer, Millisecs() und zeitliche Abläufe für Anfänger
Dies ist ein Tutorial für blutige Anfänger. Es erklärt wie Spiel-Elemente eine Kette von Ereignissen durchleben können und der Rest des Spiels trotzdem weiterläuft. z.B. Explosionen, Sprünge, etc... (Ich bitte alle, sich mit eigenen Einträgen rauszuhalten und dafür lieber den Thread "Kritik an Midimaster-Tutorials" zu nutzen. Dieses Tutorial soll den Anfänger möglichst durch keine Diskussionen irritieren.) Kritik hier hin: Kritik-Thread Allen Anfängern lege ich wärmstens ans Herz dieses Tutorial durchzuarbeiten. Es spart euch viele Fehler in späteren Programmen. Fragen von Hilfesuchenden bitte ins BB-Beginners-Corner ( https://www.blitzforum.de/forum/viewforum.php?f=18 ), aber auf keinen Fall hier hin posten! Das Tutorial ist didaktisch konzipiert aufgebaut. Die Lektionen bauen aufeinander auf. Die Befehle werden nie vollständig erklärt, sondern immer nur soweit man es für diese Lektion unbedingt braucht. Lektion I: Wohin führt dieses Tutorial? Lektion I Lektion II: CreateTimer() oder Millisecs()? Lektion II Lektion III: Frames, Stoppuhr, Schilder. Lektion III Lektion IV: mehrere Timer und Flags Lektion IV Lektion V: Ausblicke |
||
- Zuletzt bearbeitet von Midimaster am So, Mai 02, 2010 9:20, insgesamt 2-mal bearbeitet
MidimasterBetreff: Lektion I: Wohin führt dieses Tutorial? |
Mi, Apr 07, 2010 9:26 Antworten mit Zitat |
|
---|---|---|
Lektion I: Wohin führt dieses Tutorial?
Immer wieder scheitern neue Blitz-User an dem Problem mitten im laufenden Spiel eine der Spielfiguren eine länger dauernde Aktion durchführen zu lassen. Folgende Aktionen fallen wir dabei ein: A. Eine Explosion beendet das Leben des Gegners. Nun soll die Explosion in 10 Frames an der Stelle, wo der Treffer war ablaufen. Der Rest des Spieles soll aber weiterlaufen. B. Der Spieler springt über ein Hindernis. Dabei soll der höchste Punkt nicht auf ein Mal erreicht werden, sondern es soll eine Art Flug zu sehen sein. C. Der User soll eine Text-Eingabe machen können, während das Spiel im Hintergrund weiterläuft. D. Alle 30 Sekunden soll ein neuer Gegner geboren werden. E. Eine Stoppuhr wird in der Bildschirmecke angezeigt. F. Die Spielfiguren sollen unabhängig von der Rechnerleistung auf jedem Computer gleich schnell laufen. Auf all diese Probleme ist das Arbeiten mit Timern die Lösung. Außerdem möchte ich kurz klären, wann man den CreateTimer() nutzt und wann man besser mit Millisecs() arbeitet. |
||
- Zuletzt bearbeitet von Midimaster am Mi, Apr 07, 2010 10:17, insgesamt einmal bearbeitet
MidimasterBetreff: Lektion II: CreateTimer() oder Millisecs()? |
Mi, Apr 07, 2010 10:11 Antworten mit Zitat |
|
---|---|---|
Lektion II: CreateTimer() oder Millisecs()?
CreateTimer() und WaitTimer() Der große Unterschied zwischen Millisecs() und CreateTimer() besteht darin, dass CreateTimer() die Kontrolle an das Betriebssystem abgibt und erst nach einer eingestellten Zeit dem Programm wieder Rechenleistung zur Verfügung stellt. Aufgrund dieser Tatsache eignet sich der CreateTimer() nicht führ eine Nutzung einzelner Aktionen in deinem Programm, wo im Hintergrund deines Programmes anndere Aktionen weiterlaufen sollen. Die optimale Verwendung ist das Einsparen von Rechnerleistung, die unnötig vom Spiel gefressen würde. Dies schont die Hardware des Computers. Teste einfach beide Beispiele und beobachte die Systemleistung im Windows Tast Manager (STRG+ALT+ENTF): ohne CreateTimer:BlitzBasic: [AUSKLAPPEN] Graphics 800,600 mit CreateTimer:BlitzBasic: [AUSKLAPPEN] Graphics 800,600 Der Wert 60 bedeutet dabei, dass du wünscht, der Timer soll 60x pro Sekunde wieder in dein Programm zurückspringen. Diese 60 nimmt man deshalb so oft, weil dies auch genau der Bildwiederholungsfrequenz deines Monitors entspricht. Die Variable MyTimer dient dazu, den erstellten Timer genau zu bezeichnen, um ihn später im Zusammenhang mit WaitTimer() wieder ansprechen zu können. Der Inhalt der Variablen MyTimer ist ein "Pointer" und hat nichts mit irgendwelchen Zeitangaben zu tun. Mit WaitTimer() gibst du dann jedesmal die Kontrolle an das Betriebsystem ab, das nach dem Ablauf einer 1/60-tel Sekunde genau an dieser Stelle in dein Programm zurückkehrt. Durch diesen Befehl wird also erreicht, dass das Bild garantiert höchstens 60x pro Sekunde aufgebaut wird. Öfter würde keinen Sinn machen und nur Energie verschwenden. Wichtig ist in diesem Fall das FLIP 0 zu verwenden, da BlitzBasic leider sonst nach jedem normalen FLIP ebenfalls eine 1/60-tel Sekunde wartet, aber eben nicht effizient über den WaitTimer(), sondern über eine energiefressende eigene Warteschleife. Millisecs() Dieser Befehl liefert dir eine Art "Uhrzeit", aber mit 1/1000-Sekunden Genauigkeit. Der Timer ist Bestandteil des Betriebsystem und startet beim Rechnerneustart mit 0. Du kannst mit ihm also immer feststellen, wielange dein Rechner heute schon läuft: BlitzBasic: [AUSKLAPPEN] Graphics 800,600 Der Millisecs()-Timer läßt sich nicht auf 0 zurücksetzen. Aber Du könnstes im Moment des Startens deines Programms den aktuellen Wert ermitteln und den dann später im Programm immer von Millisecs() abziehen. Als Ergebnis erhältst du den Zeitraum, seit Dein Programm läuft: BlitzBasic: [AUSKLAPPEN] Graphics 800,600 Ebenso ist natürlich eine Art CountDown möglich. Dabei wird StartZeit% auf einen Wert in der Zukunft gesetzt: BlitzBasic: [AUSKLAPPEN] Graphics 800,600 Diese beiden typischen Verwendungen von Millisecs() sind Grundlage aller Arbeiten mit Timern in deinen eigenen Spielen. |
||
- Zuletzt bearbeitet von Midimaster am Do, Apr 08, 2010 2:16, insgesamt einmal bearbeitet
MidimasterBetreff: Lektion III: Frames, Stoppuhr, Schilder |
Do, Apr 08, 2010 2:14 Antworten mit Zitat |
|
---|---|---|
Lektion III: Frames, Stoppuhr, Schilder.
Du hast ein Sprite, bei dem ab einem bestimmten Moment (z.b. ein Treffer) an dieser Stelle eine Animation (z.B. Expolosion) aublaufen soll. Das erledigst Du mit einer Kombination auf Warten auf Tastendruck und Timer: BlitzBasic: [AUSKLAPPEN] Graphics 800,600 Vor der Repeat-Schleife wird eine Bildfolge mit 6 Tiles (je32x3pixel) geladen. Da BildNr% und AnimationStart% jeweils 0 sind, wird bei DrawImage nichts gemalt. Auch die IF-Verzweigung kann deshalb nicht arbeiten. Durch den Tastendruck wird nun der Timer AnimationStart% gesetzt und damit kann die If-Verzweigung arbeiten. Dort wird nun BildNr% um 1 hochgezählt und der Timer um 300msec weitergerückt. Bei DrawImage wird nun solange Tile 1 gemalt, bis nach 300msec die IF-Verzweigung wieder aktiv werden kann. Wenn BildNr% den Wert 7 erreicht, wird der Timer AnimationStart% wieder auf 0 gestellt und der Spuk ist vorbei. Was Du daraus lernen kannst: Zitat: 1.
Das Zeichnen eines Explosions-Sprite ist immer aktiv in der Hauptschleife. Man sieht nur nichts, solange BildNr auf 0 steht. 2. Die Explosion wird durch ein Ereignis ausgelöst (Treffer oder Kollision,etc...). Dort musst du nur den Timer aktivieren. 3. Der Timer wird nun in einer eigenen IF-Verzweigung dafür sorgen, dass die Bildfolge abläuft und er wird sich auch selbst beenden. Alle 30 sec ein neuer Gegner: ...ist eigentlich jetzt ganz leicht. Der Timer sorgt in seiner IF-Verzweigung dafür, dass ein neuer Gegner erzeugt wird und verstellt sich dann selbst um 30 sec in die Zukunft: BlitzBasic: [AUSKLAPPEN] If GegnerTimer<MilliSecs() Then Auch eine Stoppuhr dürfte kein Problem mehr sein: BlitzBasic: [AUSKLAPPEN] Graphics 800,600 Ein Textfeld wird für 3 Sekunden eingeblendet: BlitzBasic: [AUSKLAPPEN] Repeat |
||
- Zuletzt bearbeitet von Midimaster am Do, Apr 08, 2010 10:20, insgesamt 2-mal bearbeitet
MidimasterBetreff: mehrere Timer und Flags |
Do, Apr 08, 2010 10:16 Antworten mit Zitat |
|
---|---|---|
mehrere Timer und Flags
du kannst so viele Timer mit Millisecs() aktivieren wie du willst. Letztendlich sind es nur Integer-Variablen. So könnte etwa jeder Gegner schon im Typ mehrere Timer erhalten, die dafür sorgen, dass der Gegner nach einer gewissen Zeit etwas ändert. BlitzBasic: [AUSKLAPPEN] Type GegnerTyp Ein Texteingabe-Feld, während das Spiel weiterläuft BlitzBasic: [AUSKLAPPEN] Graphics 800,600 Zunächst nehmen wir dieses harmlose Ballspiel als Hintergrund. Die Funktion EingabeFenster soll dann ein Fenster öffnen, um dem User die Möglichkeit der Namenseingabe zu bieten. Wir erstellen diese Funktion nun in mehreren Schritten: Im ersten Schritt aktiviert ein Tastendruck das Fenster. Ein Timer sorgt dafür, dass es nun 3 Sekunden lang angezeigt wird: BlitzBasic: [AUSKLAPPEN] Function EingabeFenster() Im zweiten Schritt sorgt die Tatsache, dass der Timer entweder noch nicht gestellt wurde, bzw abgelaufen ist dafür, dass der aktuelle Spielername in das Fenster übernommen wird: BlitzBasic: [AUSKLAPPEN] Function EingabeFenster() Im dritten Schritt wird nun der lokale Name aus den getippten Tasten zusammengesetzt. Die erste Taste (mit der das Fenster aktiviert wurde) wird ignoriert: BlitzBasic: [AUSKLAPPEN] Function EingabeFenster() Nun kommt noch ein blinkender Cursor dazu. Die Variable BlinkTimer% sorgt dafür, dass der Strich mal gezeichnet wird, mal nicht. Die Variable BlinkFlag% merkt sich welcher Zustand aktuelle vorliegt. Durch die Werte 300 und 700 wird erreicht, dass die "nicht sichtbare" Phase des Cursors nicht zu lange wird. BlitzBasic: [AUSKLAPPEN] .... Auch eine Möglichkeiten des Löschens mit BACKSPACE lässt sich einfügen: BlitzBasic: [AUSKLAPPEN] .... ...sowie eine Möglichkeit des schnellen Beendens des Fensters mit der <RETURN>-Taste. Wieder wird einfach der Timer so gestellt, als wären die 3 Sekunden bereits abgelaufen. Ein Timer kann also jederzeit durch andere Aktionen manipuliert werden. Das ganze Programm: BlitzBasic: [AUSKLAPPEN] Graphics 800,600 |
||
Übersicht BlitzBasic FAQ und Tutorials
Powered by phpBB © 2001 - 2006, phpBB Group