timebased movement

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

.erazer

Betreff: timebased movement

BeitragSa, Aug 02, 2008 2:07
Antworten mit Zitat
Benutzer-Profile anzeigen
ich möchte gern eine function schreiben, welche das gleichschnelle bewegen von objekten steuert.

es soll sozusagen die zeit beim starten des spiels genommen werden, eine zwischenzeit gespeichert werden, wenn diese nicht einen bestimmten wert in millisec über dem alten wert liegt, darf keine bewegung durchgeführt werden.(resultat wäre dann bewegenerlaubt=0 oder =1 )
und diesen wert könnte man mit den verschiedenen bewegungsbefehlen kombinieren, indem man eben jedesmal die x,y,z bewegung mit dieser funktionsrückgabe multipliziert.

so wäre ein gleichschnelles bewegen auf allen pc´s sichergestellt.

nur bei der umsetzung happert es.

die idee steht, aber wie setzt man sowas um?

sirokuhl

BeitragSa, Aug 02, 2008 3:21
Antworten mit Zitat
Benutzer-Profile anzeigen
hi.
also das mit bewegungerlaubt = 1 oder 0 ist eher blödsinn.
besser ist, du misst jeden schleifendurchlauf die zeit, die für den durchlauf benötigt wurde und multiplizierst das mit den bewegungsgeschwindigkeiten der objekte.


Code: [AUSKLAPPEN]
;Anfang der Schleife
start = millisecs()
;... programm ...
x = x + 1 * zeit
;usw.
;Ende der Schleife
zeit = millisecs() - start


am besten dividierst du zeit noch so, dass du nicht die bewegungsgeschwindigkeiten aller objekte minimal klein machen musst. (also zb.: zeit# = (millisecs() - start) / 20)

Erklärung: Wenn die Schleife langsam durchlaufen wird (= langsamer PC) ist die variable zeit höher, also wenn sie schnell durchlaufen wird.
da du zeit mit den bewegungen multiplizierst, wird die bewegung dementsprechend schneller (also ein ausgleich zum langsamen durchlauf). usw.
 

.erazer

BeitragSa, Aug 02, 2008 11:38
Antworten mit Zitat
Benutzer-Profile anzeigen
mir ist es wichtig, dass ich aber so einen erlaubt = 1 oder = 0 bekomme, da ich funktionen bauen möchte, wo dies mit als parameter übergeben werden soll.

so kann ich dies immer wieder verwenden.
ich möchte dies mit der zeit, seit programmstart (nicht mit der zeit seit dem letzten durchlauf bzw. render)verwirklichen, hoffe mir kann jemand zu diesem zweck helfen.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Aug 02, 2008 18:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann übergibst du die Bauzeit eben mit Millisekunden an und rechnest nur noch in MilliSecs -Einheiten.

Deine 1 und 0 -Geschichte funktioniert zum Beispiel auch nicht, wenn der Rechner deine vorgegebe Rechengeschwindigkeit nicht schafft
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

.erazer

BeitragSo, Aug 03, 2008 11:39
Antworten mit Zitat
Benutzer-Profile anzeigen
nein nein, ich mein das auf jeden fall zeitabhängig, der timer startet sozusagen mit spielbeginn.
mit der richtigen zeitrechnung, die ja auf jedem pc gleich schnell ist.
und erst wenn, z.b. seit dem letzten timeraufruf mindestens x millisec vergangen sind, wird 1 zurückgegeben, ansonsten eben 0.
somit kanns nicht auf irgendeinem pc schneller als gewünscht laufen.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Aug 03, 2008 14:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Das entspricht aber optisch dem einer Timersteuerung mit CreateTimer, mit dem Unterschied, dass mit deiner Methode unnötig mehr berechnet wird, obwohl es dann trotzdem ruckeln kann. Also auch dann, wenn der Rechner es auch ohne ruckeln schaffen könnte.

Die andere Möglichkeit ist eben die mit MilliSecs, wo eben jede Bewegung anhand des Framespeed berechnet wird. Dabei ist es egal wie schnell der Rechner die Frames berechnen kann, alle Bewegungen laufen gleich schnell auf dem Bildschirm. Nachteil bei dieser Sache ist aber, dass der Rechner 100% Prozessorleistung benötigt.

Aus diesem Grund wird oft eine Mischung aus CreateTimer und MilliSecs gemacht. Der Timer begrenzt sehr schnelle Rechner, damit diese nicht 1000 FPS berechnen (die der Bildschirm eh nicht anzeigt) auf ca. 75 FPS. Der Rest wird dann mit MilliSecs skaliert, damit auch sehr langsame Rechner die zB das ganze nicht mit 75 FPS schaffen, die Bewegungsabläufe trotzdem gleich schnell ablaufen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

FireballFlame

BeitragSo, Aug 03, 2008 18:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab bisher immer mit Delay gearbeitet, um die Framerate zu begrenzen ...
Wieso sollte man denn extra noch WaitTimer benutzen?
Ist das schneller, weil man die Wartezeit nicht extra ausrechnen muss?
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Aug 03, 2008 20:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicht ''...extra noch'' sondern ''...nur noch''. Natürlich kann man auch ausrechnen und mit Delay machen. Aber wenn man diesen Wert nicht braucht, warum dann extra ausrechnen wenn WaitTimer genau das gleiche macht?

Ein alleiniges Delay mit festen Werten wiederrum ist quatsch. Weil man garkeine Kontrolle mehr über den Ablauf hat.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

FireballFlame

BeitragMo, Aug 04, 2008 1:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, ich meinte das "extra" bezogen auf die Millisecs()-Tempofaktor-Berechnung.
Die muss ja sowieso stattfinden.
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group