Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 19.08.2012, 17:44 Titel: Welche Möglichkeiten gibt's nen Countdown Timer zu proggen? |
|
|
In Qbasic gab es ja die Möglichkeit mit On Timer einen Countdown Timer zu realisieren. Man spielt ein Spiel und im Hintergrund läuft die ganze Zeit ein Countdown gegen Null. Ist die Zeit vorbei hat man verloren. So wie bei dem Spiel Dash It von Eternal_Pain.
Warscheinlich muss man sich eine Funktion in Freebasic programmieren oder? Die sind ja selbstaufrufend?
Ich habe noch nie einen richtigen echten Countdown Timer geschrieben, deswegen frage ich ja. Im Forum finde ich auch nichts brauchbares.
Ich brauche den Timer so wie in dem Spiel Dash it.
Der Timer soll im Hintergrund laufen, während andere Dinge im Vordergrund erledigt bzw. Tasten gedrückt werden.
On Timer bzw. On Key bzw. On... Befehle funktionieren in Freebasic leider ja nicht mehr!
Hat jemand eine Idee wie man so einen programmiert?
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 19.08.2012, 18:01 Titel: Re: Welche Möglichkeiten gibt's nen Countdown Timer zu progg |
|
|
ALWIM hat Folgendes geschrieben: | Hat jemand eine Idee wie man so einen programmiert? |
Möglichkeit 1: Du lässt eine Timer-Sub als separaten Thread parallel zu deinem Hauptprogramm laufen. In FreeBASIC kannst du quasi mehrere SUBs gleichzeitig ablaufen lassen (--> Multi-Tasking). Das heißt, in einer SUB könnte dein Spiel laufen, in einer anderen gleichzeitig dein Timer, der bei Zeitablauf irgendeine Variable GameOver=1 setzt oder so.
Wichtig: Das funktioniert natürlich nur unter Windows und Linux. Unter DOS ist es auch mit FreeBASIC nicht möglich, mehrere Threads zu starten.
Möglichkeit 2: Du aktualisierst den Timer auch über deine große Ereignisschleife, in der du auch auf Benutzereingaben und Mausbewegungen reagierst. Dazu hat dreael, wenn ich das richtig in Erinnerung habe, auch ein altes Tutorial in seiner Sammlung (zwar für QB programmiert, aber das Prinzip ist natürlich auch in FreeBASIC anwendbar).
Die 2. Möglichkeit, also der Timer in der Ereignisschleife, ist m. E. hier die bessere. Wenn du nämlich Threads verwendest, entsteht eine Reihe neuer Probleme, die du nur mit entsprechendem Fachwissen lösen kannst (abgesicherter Zugriff auf gemeinsam genutzte Ressourcen via Mutex etc.). Ein Thread für so eine Countdown-Uhr wäre auch etwas "mit Kanonen auf Spatzen geschossen".
Fazit: Google mal nach "Ereignisschleife" und versuch etwas in der Richtung umzusetzen. Du brauchst weder ON TIMER noch Threads. _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 19.08.2012, 18:45 Titel: |
|
|
Zitat: | Möglichkeit 2: Du aktualisierst den Timer auch über deine große Ereignisschleife, in der du auch auf Benutzereingaben und Mausbewegungen reagierst. |
Was ist, wenn ich die Schleife irgendwann mal verlasse? Das muss ich bei meinem Projekt zwangsläufig tun.
Dann würde das ganze nicht mehr funktionieren oder?
Mal schauen wie ich das letztendlich realisiere!
Nach der Ereignisschleife werde ich mal mit Google suchen.
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 19.08.2012, 19:19 Titel: |
|
|
Mach eine große Schleife, in der dein ganzes Programm stattfindet - diese wird nur verlassen, wenn du auch keinen Countdown mehr brauchst. Innen drin können sich dann gern noch weitere Schleifen befinden. Du musst nur in jeder Schleife, die möglicherweise längere Zeit durchlaufen wird, die Countdown-Prüfung einbauen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 19.08.2012, 20:00 Titel: |
|
|
nemored hat Folgendes geschrieben: | Mach eine große Schleife, in der dein ganzes Programm stattfindet - diese wird nur verlassen, wenn du auch keinen Countdown mehr brauchst. Innen drin können sich dann gern noch weitere Schleifen befinden. Du musst nur in jeder Schleife, die möglicherweise längere Zeit durchlaufen wird, die Countdown-Prüfung einbauen. |
Wie sieht es mit Unterprogrammen aus? Diese sind zwecks Grafik leider vorhanden.
Mit der Ereignisschleife kann das dann möglicherweiße nicht mehr sekundengenau sein! Dazu müsste ich das ganze dann justieren damit das dann genau immer nach 1 Sekunde runterzählt.
Wie hat das dann Eternal_Pain gelöst? Den muss ich mal fragen!
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 19.08.2012, 20:20 Titel: |
|
|
Du kannst deinen Countdown ebenfalls in ein Unterprogramm stecken und dieses an jeder Stelle, die mehr als ein paar Millisekunden lang Zeit in Anspruch nimmt, aufrufen. Die Countdown-SUB prüft dann, ob schon genügend Zeit vergangen ist. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 21.08.2012, 13:49 Titel: |
|
|
Da hier grad einmal DashIt angesprochen wurde muss ich mich ja melden
BTW kann man das Spiel auf meiner Seite auch mit Sourcecode herunterladen: http://eternalpain.tgp-gaming.de
(Ich weiss, macht nach all der Zeit immernoch nichts her die Seite, wird irgendwann schon )
der Code der für den Timer zuständig ist ist dieser ausschnitt:
Code: |
Type Game_Timer
Declare Constructor()
Declare Function Time(byval T as Double) as Integer
Private:
Last_Time as Double
Now_Time as Double
End Type
Constructor Game_Timer()
Last_Time = Timer
End Constructor
Function Game_Timer.Time(byval T as Double) as Integer
Now_Time = Timer
If ( Now_Time >= (Last_Time+T) ) Then
If ((Now_Time-Last_Time) > (T+1)) or (T = 0) Then
Last_Time = Timer
Else
Last_Time = Now_Time - (Now_Time-(Last_Time+T))
End If
Return 1
End If
Return 0
End Function
|
Hier kurz was zum testen:
Code: |
'Game_Timer Test:
Dim Spieltimer as Game_Timer
Dim Spielzeit as Integer = 10'sek
Do
locate 1,1:?Spielzeit;" "
'Wenn 1sek (T=1) vergangen dann spielzeit um 1 verringern
If Spieltimer.Time(1) Then Spielzeit -= 1
sleep 1
loop until multikey(&h01) or (Spielzeit = 0)
?"Zeit abgelaufen"
sleep
|
_________________
 |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 21.08.2012, 18:01 Titel: |
|
|
Auf meiner Seite biete ich ein Link zum FBP ein DDL von meiner Seite und halt als extra 'bonbon' das ganze mit Source (sonst hätte ich ja gar keine highlights auf meiner Seite )
Ist bis jetzt immernoch die alte Version, die ich aber dennoch mal überarbeiten muss, da die Thread-implementierung für das Fenster ein paar 'macken' verursacht wie zB das beim Start keine Grafiken angezeigt werden sowie neulich hab ich 50 oder 60 runden gespielt da blieb das Spiel dann mittendrin einfach 'stehen'
muss mal irgendwann gucken wo da der Wurm drin ist...
Würd wenn ichs hinbekomme das ganze dann mal als Online-Spiel neu schreiben (da ich mich selbst mit über 90000 punkten einfach nicht mehr schlage ) _________________
 |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 21.08.2012, 18:52 Titel: |
|
|
Code: |
dim endzeit as double = timer() + 10
do
if endzeit < timer() then
print "ende erreicht"
end
end if
Print Fix(endzeit - timer()) 'falls mans aufgeben will
sleep 1000, 1 'kann auch 1, 1 sein .. 1000 nur wegen dem print, sonst füllt er das terminal voll
loop
|
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 21.08.2012, 21:05 Titel: Re: Welche Möglichkeiten gibt's nen Countdown Timer zu progg |
|
|
Sebastian hat Folgendes geschrieben: | Möglichkeit 2: Du aktualisierst den Timer auch über deine große Ereignisschleife, in der du auch auf Benutzereingaben und Mausbewegungen reagierst. Dazu hat dreael, wenn ich das richtig in Erinnerung habe, auch ein altes Tutorial in seiner Sammlung (zwar für QB programmiert, aber das Prinzip ist natürlich auch in FreeBASIC anwendbar). |
Ohne viel Kommentar:
http://www.dreael.ch/Deutsch/BASIC-Knowhow-Ecke/EreignisSchleife.html
Grundsätze gelten in FB genauso! Neu: so etwas wie select() in C in UNIX/Linux, um Prozess im Multitasking-Sheduler schlafen legen, bis irgendwo etwas eingeht. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 22.08.2012, 02:34 Titel: |
|
|
@Eternal_pain: Wenn man schon einen Quellcode anbietet, dann sollte er wenigstens vollständig sein.
Timeout.bas fehlt!!!
Konnte das Programm wegen der fehlenden Datei nicht Compilieren!
Gut, dass es den Quellcode doch gibt! Da wollte ich schon immer mal einen Blick drauf reinwerfen. Die Internetseite kannte ich nicht, und auf dem Freebasic-Portal war kein Code mit dabei.
Danke für die zahlreichen Ideen!
Wie ich das letztendlich mit dem Countdown löse, weiß ich noch nicht. Welche Funktion er später einmal haben wird, weiß ich schon. Habe da schon eine Idee! Ich hoffe, das dass geht, dass per Zufallszahl eine Countdownzeit ausgewählt wird.
Ein kleines Rätsel gebe ich euch schon mal mit: Was passiert, wenn der Countdown abgelaufen ist?
Für denjenigen der mir als erster die richtige Lösung nennt, gibt es, wenn ich das laufende Project mal beende und dann veröffentliche, einen unbezahlbaren Tipp!
Bin mit dem laufendem Projekt erst zur Hälfte fertig!
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
|