Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Welche Möglichkeiten gibt's nen Countdown Timer zu proggen?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1048
Wohnort: Niederbayern

BeitragVerfasst am: 19.08.2012, 17:44    Titel: Welche Möglichkeiten gibt's nen Countdown Timer zu proggen? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 19.08.2012, 18:01    Titel: Re: Welche Möglichkeiten gibt's nen Countdown Timer zu progg Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1048
Wohnort: Niederbayern

BeitragVerfasst am: 19.08.2012, 18:45    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4703
Wohnort: ~/

BeitragVerfasst am: 19.08.2012, 19:19    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1048
Wohnort: Niederbayern

BeitragVerfasst am: 19.08.2012, 20:00    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4703
Wohnort: ~/

BeitragVerfasst am: 19.08.2012, 20:20    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 21.08.2012, 13:49    Titel: Antworten mit Zitat

Da hier grad einmal DashIt angesprochen wurde muss ich mich ja melden grinsen

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 happy)

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 21.08.2012, 14:34    Titel: Antworten mit Zitat

Eternal_pain hat Folgendes geschrieben:
BTW kann man das Spiel auf meiner Seite auch mit Sourcecode herunterladen

Schon seit längerer Zeit kann man Download-Dateien auf FBP auch aktualisieren, d. h. wenn du den DashIt-Download neu zusammengestellt hast, könntest du auf FBP natürlich auch jederzeit gerne die Datei erneuern. zwinkern
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 21.08.2012, 18:01    Titel: Antworten mit Zitat

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 grinsen)

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 grinsen)
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 21.08.2012, 18:52    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 21.08.2012, 21:05    Titel: Re: Welche Möglichkeiten gibt's nen Countdown Timer zu progg Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1048
Wohnort: Niederbayern

BeitragVerfasst am: 22.08.2012, 02:34    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz