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.
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
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.
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
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.
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.
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
:D Nö. Passt soweit alles. Viel besser, als ich sowas erklären kann. Super, da kann ich ja mal 2 Jahre in Urlaub fahren ;)
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! ;-)
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
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.
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?
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.
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
GreenBerret hatt Musik mit Schlagzeug ;)
Ich zupf ab und an (wenn die Kinder mit Zeit lassen) auf meiner Gitarre, aber eher dilletantisches Lagerfeuerniveau.
:lol: OK, mach ich. Die Einsendungen sind bisher recht spärlich - wenn ich das mal so sagen darf...
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.
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
Gute Idee (neues Thema). Und: So ein schlachtschiff kanns Du ja ganz einfach bei der Nasa fotografieren. Area61 oder so.. :D