GLBasic forum

Other languages => GLBasic - de => Topic started by: WPShadow on 2006-Feb-01

Title: Echtzeittimer...
Post by: WPShadow on 2006-Feb-01
Hi!

Zwischenfrage:

Wie mache ich einen Echtzeittimer, der sowohl die Framerate des Bildschirms berücksichtigt, als auch die tatsächliche Zeit, die im Hintergrund mitläuft, damit ich z.B. eine flüssige Kamerafahrt im Kampfgeschehen machen kann, während 2 Raumschiffe Raketen auf einander feuern und von da an auch in einen Zeitlupenmodus übergehen kann? Am Besten ohne Framebegrenzung! :-)

Der Timer wäre ein wirklich wichtiges Teilstück des Programmes und irgendwie schaffe ich es nicht das selbst hinzubekommen.

Den Zeitlupenmodus habe ich übrigens inetwa so gelöst, daß ich die Bewegung einfach bis auf annähernd 0 (Bewegung * Zeitlupenfaktor [1 = Normalzeit, alles drunter ist verlangsamt]) annähere, wobei die Kamera einfach um das Objekt bzw. die Objekte herum rotiert.

Bitte Hilfe!

GLG

W.
Title: Echtzeittimer...
Post by: BumbleBee on 2006-Feb-05
Hab's jetzt erst gelesen.

Wie meinst du das mit dem Timer im Hintergrund. Das Spiel soll mit konstanter
Framerate z.B. 30 FPS laufen die Objekte und Kamera sollen sich mit
unterschiedlicher Geschwindigkeit bewegen. Das wäre ja einfach.

Das Spiel mußt du ja irgendwie auf einen Wert abbremsen damit es
nicht zu schnell läuft. Konstante Geschwindigkeit auf allen PCs.
Mit LIMITFPS 30 kannst du dein Spiel ja schon auf 30 FPS runterbremsen.
Damit läuft dein Spiel ja nie schneller als mit 30 Frames.
Dann brauchst du ja nur noch den Speed der Objekte ändern. Erst schnell dann
langsam (Zeitlupe).

Damit dein PC bei den Frames nicht in die Knie geht mußt du auch einiges beachten.
Nicht zu viele Objekte anzeigen, vielleicht nur die Vorderseiten (X_CULLMODE 1)
der Objekte zeichnen, Sichtweite runter ... Das macht alles schon viel aus.
Hat nicht jeder einen schnellen PC mit neuester Grafikkarte zuhause.
Dann bleiben auch die 30 Frames konstant. Möchte es nämlich auch gern spielen.:)

Oder willst du einen eigenen Timer bauen?

Klär mich nochmal auf dann mach ich dir ein Beispiel.
Aber in 2D. Geht schneller.:)
Soll dabei noch ein Timer für die Spielzeit mitlaufen?

Cheers
Title: Echtzeittimer...
Post by: WPShadow on 2006-Feb-05
Gut, hier die Erklärung:

LIMITFPS 30 wäre ja einfach. Das ist nicht das Problem:

Ich möchte die FPS nach oben hin offen lassen. Dadurch würden, je nach Graphikkarte, verschieden schnelle PCs, verschieden schnelle Bildraten aufweisen. (bei mir z.B. 60 - 100 fps)

Damit die Bewegungen, Rotationen, Effekte aber aufeinander abgestimmt sind, muß ich einen TIMER einbauen, der im z.B. Millisekundenbereich arbeitet und somit alle Objekte immer gleich schnell bewegt. Damit meine ich, daß der Mittelteil bei einem Raumschiff, sagen wir mal 30 Sekunden braucht, um sich um sich selbst zu drehen, egal ob bei 30 oder 300 fps.

Im Prinzip meine ich einen FPS - unabhängigen Timer, der nicht nach der Bildwiderholungsrate geht, sondern nach "Echtzeit", wobei man aber immer den LOOP einplanen muß, wann und wie oft der LOOP wiederholt wird.

Und genau da liegt mein Problem. Beides ist leicht zu programmieren:
Ein Timer, der Frameabhängig ist,
und ein Timer, der Millisekundenabhängig ist.

Aber einen Timer hinzubekommen der Beides berücksichtigt (in der Zeit X mit X FPS) und dabei die z.B. Rotation immer in 30 Sekunden hinbekommt, das kriege ich irgendwie nicht hin.

Ich möchte ja nicht solche Fehler einbauen, wie bei "Herr der Ringe - Die Schlacht um Mittelerde" --> Je nach Zoomstufe bewegt sich alles bis zu 60% schneller oder langsamer. Und ich möchte nicht, daß bei einer kleinen Kamerafahrt, alle Objekte verschieden schnelle Bewegungen erzeugen. Das fällt nämlich als allererstes auf. Traurig, aber wahr...

Wenn der Timer erst steht, funktioniert das mit der Zeitlupe nämlich auch. Konstante Bewegungen werden einfach mit (* 0,9; * 0,8; * 0,7; bis 0,000...) verlangsamt und dann wieder verschnellert. Der Timer bleibt einfach immer gleich und gibt die selben Werte aus...

So inetwa dachte ich es mir. Wie gesagt, ich schaffe es einfach nicht alleine, deshalb habe ich das Problem online gestellt...

GLG

W.
Title: Echtzeittimer...
Post by: BumbleBee on 2006-Feb-05
Ich stell LIMITFPS normalerweise auf -1 (Full Power), mach mir den Timer selbst
und multipliziere die Geschwindigkeit mit dem Timer.

Geschwindigkeit in Pixeln PRO SEKUNDE

z.B.
X1 = X1 + Speed1 * Timer

Z2= Z2 + Speed2 * Timer

Hier wird festgelegt um wieviel Pixel Pro Sekunde
und nicht mehr um wieviel Pixel pro Schleifendurchgang sich das Objekt bewegen soll.

So machs ich immer. Der Timer läuft immer gleich schnell
Kann man aber auch ändern
Da läuft das Spiel absolut flüssig und auf jeden PC gleich schnell
Und mit der Geschwindigkeit kann ich ja variieren.
Der Millisekunden-Timer kommt sogar ohne IF Abfrage aus

Soll ich dir ein 2D Beispiel machen wo sich  ein FILLRECT-Raumschiff :) von links
nach rechts über den Bildschirm bewegt.
Bei der Hälfte wird es langsamer (Zeitlupe) Die Frames bleiben aber gleich.

Oben zeigt es die Frames und die Sekunden an die das Raumschiff schon unterwegs ist.

LIMITFPS auf -1 (Maximal) gestellt und trotzdem läuft es überall gleich schnell



Cheers
Title: Echtzeittimer...
Post by: WPShadow on 2006-Feb-06
Das mit LIMITFPS -1 habe ich gleich eingestellt.

Könntest du mir trotzdem ein kleines "Tutorial" schreiben?

Bitte Bitte! Wäre eine große Hilfe...

GLG

W.
Title: Echtzeittimer...
Post by: BumbleBee on 2006-Feb-06
Also ich erkläre das dann mal

Das Rechteck bewegt sich beim folgenden Beispiel von links nach rechts mit
100 PIXELN PRO SEKUNDE. Das heißt bei einer Auflösung von 640*480 braucht das
Rechteck für die Strecke  von 640 Pixeln Strecke/Geschwindigkeit:

640 / 100 = 6.4 Sekunden

Bei 800 * 600 Auflöung eben:

800 / 100 = 8 Sekunden

LIMITFPS -1 (Maximale Framerate)


Und hier der Timer
-------------------
               //GAME_TIMER
    GT=(GETTIMERALL()-Old_Timer)/1000  //Durch Tausend für die Sekunden
    Old_Timer=GETTIMERALL()
 

    Ship_X = Ship_X + Speed * GT

Die Geschwindigkeit des PCs ist egal weil 1 Sekunde ist 1 halt Sekunde.  
Ja das war's schon

Du kannst auch durch 500 Teilen. Dann sind's halt halbe Sekunden. Dementsprechend
sind die Vierecke auch doppelt so schnell. Ich lass den auf 1000. Das rechnet sich besser.
Bei den Geschwindigkeiten für die Schiffe, Kamera, Meteoriten... kannst du ja dann alles
ausprobieren.


Und hier das Beispiel:

Die zwei FillRect-Raumschiffe bewegen sich mit 100 Pixeln pro Sekunde.
Das obere wird ab der Hälfte langsamer während das untere weiterfliegt.
Am oberen Screen siehst du die Frames darunter die Sekunden.
Die Frames werden je nach Monitorfrequenz und Grafikkarte unterschiedlich sein.
Im Fenstermodus sind die Werte meist anders als im Fullscreen.
Die Frames können je nach PC zwischen 60 und weit über
500 schwanken. So wie das wolltest. Nach oben hin offen.

Die Vierecke bewegen sich trotzdem durch den Timer überall gleich schnell
Ich hoffe sowas hast du gesucht.


Code (glbasic) Select
LIMITFPS -1      //Maximal
    Old_Timer=GETTIMERALL()
    Ship1_Speed_X = 100         // Schiffgeschwindigkeit1 = 100 Pixel PRO SEKUNDE
    Ship1_Color=RGB(255,0,0)    // Schiff1 = Rot
    Ship1_X=-30                 // StarPosition Schiff 1 genau am Rand
    Ship2_Speed_X = 100         // Schiffgeschwindigkeit2 = 100 Pixel PRO SEKUNDE
    Ship2_Color=RGB(0,0,255)    // Schiff2 = Blau
    Ship2_X=-30                 // StarPosition Schiff 2 ganau am Rand

    GETSCREENSIZE Width,Height  // Bildschirmgröße abfragen

                 //Spielschleife
WHILE TRUE
                  //GAMETIMER
   //+++++++++++++++++++++++++++++++++++
    GT=(GETTIMERALL()-Old_Timer)/1000
    Old_Timer=GETTIMERALL()
   //+++++++++++++++++++++++++++++++++++
            //Raumschiff  bewegen
    Ship1_X = Ship1_X + Ship1_Speed_X * GT
  //Nach der Bildschirmhälfte plötzlich langsamer
    IF Ship1_X > Width/2 THEN Ship1_Speed_X = 50
    FILLRECT Ship1_X,100,Ship1_X+30,130,Ship1_Color

           //Raumschiff  bewegen
    Ship2_X = Ship2_X + Ship2_Speed_X * GT
    FILLRECT Ship2_X,200,Ship2_X+30,230,Ship2_Color


     //Hier ist noch ein Timer der die Frames und die Sekunde mißt
//****************************************************
     Frames=Frames+1
     IF TimeStart + 1000        FPS=Frames
       Frames=0
   //Solange Blaues Schiff nicht Rechts angekommen ist Zeit messen
      IF Ship2_X < Width
       Time=Time+1
      ENDIF
       TimeStart=GETTIMERALL()
    ENDIF
    PRINT "FPS " + FPS,20,20
    PRINT "Time " + Time,20,50

//****************************************************

  SHOWSCREEN
WEND
Man wenn das jetzt nicht stimmt was ich hier geschrieben hab, dann wird
mich Gernot bestimmt auslachen, und ich kann keine Nacht mehr schlafen.
Und zum Beichten muß ich dann ja auch noch gehen. :D


Cheers
Title: Echtzeittimer...
Post by: Kitty Hello on 2006-Feb-06
:D Nö. Passt soweit alles. Viel besser, als ich sowas erklären kann. Super, da kann ich ja mal 2 Jahre in Urlaub fahren ;)
Title: Echtzeittimer...
Post by: WPShadow on 2006-Feb-06
Also, nicht nur, daß es super erklärt war und daß es super funktioniert, es sieht auch noch höllisch aus und funktioniert!!!

Danke für die große Hilfe. Bin gerade dabei die Zeitlupe auszuprobieren.

Ich vermute aber jetzt schon, daß es funktionieren wird.

Bin dir was schuldig. :-)

GLG

W.

PS.: Bald gibt's Screenshots! ;-)
Title: Echtzeittimer...
Post by: BumbleBee on 2006-Feb-06
Gott sei Dank hat's geklappt. :)

Ich hätte sonst keine weitere Lösung parat gehabt.
Und wie gesagt. Das ist für mich der beste Timer.
Mit dem  kriegst du natürlich auch die Zeitlupe hin.

Das Spiel das du da eintwickelst, machst du das alles allein?
Grafik,Programmierung...

Cheers
Title: Echtzeittimer...
Post by: WPShadow on 2006-Feb-07
Hi!

Im Prinzip mache ich "LOST REVENANT" (nach langem Suchen kam doch ein Name zustande) ziemlich alleine.

Deshalb möchte ich am Anfang auch nur die Basis machen und mich erst danach an die wirklich heiklen Dinge, wie Voll-3D-Kamerafahrten während eines Kampfes inkl. Zeitlupe usw. wagen.

Die 3D - Modelle sind ja kein Problem, aber die Texturen, oje oje.

Die Musik habe ich schon so gut wie fertig (bin Hobbymusiker). :-)

Aber im Prinzip ja. Aber ich suche immer nach Hilfe...

GLG

W.
Title: Echtzeittimer...
Post by: Kitty Hello on 2006-Feb-07
MUSIKER!!! JUHUUUU! Ich bin nämlich ein echter Nichtmusiker. Ich bring nichtmal mit dem Magix MusicMaker wirklich was zusammen - und das heisst was...

Was ist's Problem mit den Texturen?
Title: Echtzeittimer...
Post by: WPShadow on 2006-Feb-07
Also, ich benutze ACID 5.0 von Sony. Und Soundforge. Und Reason 3 von Propellerhead.

Das mischt du mit einem Keyboard und einer E - Gitarre und vielen, vielen, viiiieeeeeelen Samples (ca. 80000) und jeder Menge Effekten und schon hast du ein Lied.

Guten Freunden gibt man doch ein Liedchen. Oder zwei. Oder drei...

Falls du was brauchst, sag es einfach! Ich helfe gerne!!!

GLG

W.
Title: Echtzeittimer...
Post by: BumbleBee on 2006-Feb-07
Musik ist auch mein Hobby. Aber nicht Keyboard oder Gitarre sondern
Schlagzeug. Fast  nur HardRock und Metal. Damit bin ich aufgewachsen.
Wollt sowieso mal fragen was die anderen hier ausser GLBasic noch für Hobbies
haben. Aber das frag ich bei Themenverfehlung

Naja, mit Schlagzeug allein kann man wohl keine gute Musik für ein Spiel machen.
Da muss ich dann mit solchen Musikmaker Programmen rumprobieren. Es kommt aber nichts
gescheites dabei raus. Muss wohl an den Lautsprechern liegen.:lol:

Aber jetzt weiß ich ja an wen ich mich wenden kann.;)

Cheers
Title: Echtzeittimer...
Post by: Kitty Hello on 2006-Feb-08
GreenBerret hatt Musik mit Schlagzeug ;)
Ich zupf ab und an (wenn die Kinder mit Zeit lassen) auf meiner Gitarre, aber eher dilletantisches Lagerfeuerniveau.
Title: Echtzeittimer...
Post by: Kitty Hello on 2006-Feb-08
:lol: OK, mach ich. Die Einsendungen sind bisher recht spärlich - wenn ich das mal so sagen darf...
Title: Echtzeittimer...
Post by: WPShadow on 2006-Feb-09
Hi!

Mein Problem mit den Texturen ist relativ einfach:

Ich schaffe es nicht meine Texturen realistisch aussehen zu lassen.

Ich würde gerne riesige Schlachtschiffe und kleine Jäger machen, nur sehen die Texturen eher aus, als hätte sie ein 10jähriges Kind gezeichnet.

Was tun?

GLG

W.
Title: Echtzeittimer...
Post by: BumbleBee on 2006-Feb-09
Hi WPShadow

Die realistischsten Texturen kriegst du wenn  du
eine DigiCam nimmst und fotografierst die Oberfläche
eine Gegenstandes,

z.B. Holzbrett, Stoff, Blech mit Rost, Stück Rauhfasertapete....
(es sind da ja keine Grenzen gesetzt)
   
überträgst die Bilder dann von der Camera auf den PC
startest dein Bildbearbeitungsprogramm und bearbeitest
die Bilder dann noch nach.

Außerdem sind es deine eigenen Texturen und keine geklauten.

PS
Sollte man dafür ein neues Thema anfangen? Läuft sonst weiter unter
Echtzeittimer. :)

Cheers
Title: Echtzeittimer...
Post by: Kitty Hello on 2006-Feb-10
Gute Idee (neues Thema). Und: So ein schlachtschiff kanns Du ja ganz einfach bei der Nasa fotografieren. Area61 oder so.. :D