Hilfreich wäre ein total ausführliches schritt für schritt tut, das jeder versteht, da es doch eine grundlegende voraussetzung ist, dass die spiele die wir hier zu schreiben versuchen auf jeder kiste gleich schnell laufen.
könnte da jemand was tun?
TUTORIAL:
LIMITFPS 60
Effekt: Auf allen Kisten gleich schnell, da ja limitiert!
ähm aber das sind doch nur die frames die limitiert werden.
wenn ich objekt xy von a nach b mittels irgendeiner berechnung wandern lasse, ist das doch rechnerleistungsabhängig, oder?
könnte also mit 60fps mal schneller oder auch langsamer wandern.
oder versteh ich das jetzt falsch?
wenn ich mich irre, wäre das ja supertoll, weil ich mir dann um irgendwelche rechnerunterschiede keine gedanken mehr machen müsste.
ob nun 500Mhz oder 5000Mhz, ob onboard grafik, oder eine neue 9800(oder so)
Einfach statt nach jedem durchlauf erhöhen, mit timer machen:
Nicht:
x=x+1
Sondern
IF timer+50<GETTIMERALL()
x=x+1
timer=GETTIMERALL()
ENDIF
Gruß
Tenorm
NEIN, nicht schon wieder. Diese Frage ist ab sofort verboten. ;)
Cheers
Hehehe.
Du musst Die Figur halt immer um den Zeit-Wert verschieben, den Du seit dem letzen Showscreen hast:
WHILE TRUE
lasttime=time
time = GETTIMERALL()
dtime=time-lasttime
x = x + dtime * 0.001
PRINT "C", x, 0
SHOWSCREEN
WEND
Is das nicht das gleiche wie ich geschrieben hab :S
doch... stimmt.
Nur.. meins macht auch zwischenpixel, also wenn die Schrittweite >1 pixel ist, dann wirds bei mir weicher. Deins ist leichter zu verstehen und einzubauen.
Wäre es nich einfacher einen Befehl dafür in GLB rein zu packen?
Dann bleiben zumindest die Fragen im Forum aus!
WP:
Mach doch mal Funktionen, und stell die in das Codeschnipselforum :P
Dann kannst auch jeder benutzen, und wenns anklang findet, kann man ja über einen Implementierung reden :)
Hmmm, ich dachte ich hätte schon mal was in dieser richtung gepostet, kanns aber nicht mehr finden.
Ok, das kästchen braucht immer um die 6-7 sec um den Screen zu überqueren,egal wie schnell das Programm ist , die zeit angabe ist hier nicht so genau wegen den rundungsfehlern die es einfach gibt ;)
// --------------------------------- //
// Project: time_move
// Start: Sunday, March 04, 2007
// IDE Version: 4.114
LIMITFPS -1 /// hier mal werte ändern,z.b. 60 oder -1 = Vsync Off
WHILE TRUE
move = GETTIMER()
time = GETTIMERALL()
//-------------
IF (time - temp) > 1000
INC a1,1 // Secundenzähler
temp = time
ENDIF
//-------------
//-----------Das ist der interesante Teil
x = x +time_move(0.1,1) //<<<< Frameunabhängig bewegen, mal mit dem wert 0.05 rumspielen ;)
DRAWRECT x,100,10,10,RGB(0xff, 0xff, 0x00)
IF x > 640
x = 0 // X zurücksetzen
a2 = a1 // Für die zeitmessung
a1 = 0
ENDIF
//---------------------------------------
// Das ist nur für die ausgabe
PRINT getfps()+" Frames",10,100
PRINT move+" millisec." ,10,120
PRINT a2+" Secunden vergangen",10,140
SHOWSCREEN
WEND
FUNCTION getfps:
STATIC fps_time,fps_counter,fps,fps_temp
fps_time = GETTIMERALL()
fps_counter = fps_counter + 1
IF (fps_time-fps_temp)>1000
fps_temp = fps_time
fps = fps_counter
fps_counter = 0
ENDIF
RETURN fps
ENDFUNCTION
// Function für Frameunabhängige bewegung
// l_multi = multiplikator
// l_on = 1 = on ansonsten immer off
FUNCTION time_move :l_multi,l_on
LOCAL l_on,l_out
LOCAL temp AS Tmovetime
IF l_on = 1
temp.time = GETTIMER()
l_out = temp.time*l_multi
ELSE
l_out = 0
ENDIF
RETURN l_out
ENDFUNCTION
TYPE Tmovetime
time
ENDTYPE
das hier müsste doch auch so ähnlich funktionieren, irgendwie tut es das zwar noch nicht, muss mal sehen, was ich übersehen habe.
SUB UpdateMovement:
delta = time()
EntityRotate(juru, 0, jy*delta, 0)
EntityMove(juru, 0, 0, jz*delta)
EntityMove(juru,0,updown,0)
EntityRotate(stamm, 0, 0, 1*delta)
jy=0;jz=0
ENDSUB
FUNCTION time:
Local delta
IF timer+50 < GETTIMERALL()
delta = 1
ELSE
delta = 0
ENDIF
timer = GETTIMERALL()
RETURN delta
ENDFUNCTION
Versuchs mal so :
FUNCTION Timer:
STATIC time
LOCAL delta
IF time< GETTIMERALL()
delta = 1
time = GETTIMERALL()+50
ENDIF
RETURN delta
ENDFUNCTION
sollte das funktionieren?
also ich dachte ja schon, aber irgendwie hauts nicht hin.
ich ruf diese funktion auf, und wenn delta als 1 zurückgegeben wird, lass ich eine variable deltazaehler um eins erhöhen und anzeigen.
bleibt aber immer irgendwie bei null......
ahhhh
FUNCTION deltatimer:
STATIC time
LOCAL delta
IF time< GETTIMERALL()
delta = 1
time = GETTIMERALL()+50
ENDIF
IF delta =1 THEN del=del+1
PRINT del 60, 60
ENDFUNCTION
so würde es gehen, aber ich brauch ja den delta wert ausserhalb der funktion.
ahhh delta zu beginn auf global, oder zumindest das local rausnehmen
dann geht es, grins
GETTIMER und GETTIMERALL funktionieren wahrscheinlich NICHT, wenn du eine externe Renderengine verwendest.
Ansonsten würde ich das so machen (keine Garantie für syntaktische Richtigkeit, bin am iMac meiner Freundin ohne GLBasic):
FUNCTION GiveDelta#:dFactor#=1.0
RETURN (GETTTIMER()/1000.0)*dFactor#
ENDFUNCTION
Die Funktion sollte bei jedem Aufruf einen Delta Wert ausgeben. Mit diesem Wert multipliziert man jetzt alle Rotationen, Bewegungen, etc. welche dann auf jedem PC gleich ablaufen sollten. Der Wert lässt sich modifizieren (für schnellere Bewegungen etc.) indem man der Funktion einen optionalen Parameter dFactor# übergibt. Der standard Wert ist 1.0 und steht für 100% Geschwindigkeit.
ähm, also ich hab meine funktion für delta schon drin, und geht auch mit der externen lib.
hab mir einfach die delta = 1 zählen lassen, und zeigt schön an, wie schnell langsam die deltas zeitabhängig purzeln.
[war ja schranz0rs code, bzw. der von mir verbesserte, aber nur weil jemand schlecht geschlafen hat, enthalte ich das doch dem rest hier nicht vor]
Ich finde eure Codes nur so... aufwendig. Die Lösung ist doch eigentlich ein klassischer Einzeiler, und soweit ich das überblickt habe gibt die Funktion immer 1 aus, wenn Zeit seit dem letzten Aufruf vergangen ist. Davon erschließt sich mir der Sinn nicht ganz, das hat mit delta (= Unterschied) nicht viel zu tun. Kurz und gut: ich verstehe nicht ganz den Sinn dieser Delta Funktion, aber evtl. funktioniert meine Funktion ja nicht richtig und ich komm darauf zurück :x
GLUCKWUNSCH!
Quote
HEIKO SCHRIEB:[war ja schranz0rs code, bzw. der von mir verbesserte, aber nur weil jemand schlecht geschlafen hat, enthalte ich das doch dem rest hier nicht vor]
Hiermit erhälst du offiziell die
1. Verwarnung von mir!
Es hat garnichts damit zu tun, das ich schlecht geschlafen habe.
Es geht um Codeklau und um die frechheit es als DEINS abzustempeln!
gefragt war ein simpler Timer, den hatte ich geliefert hatte und der funktionierte auch... ( Du meintest ja, der geht nicht... )
Was du daraus machst (...dein wahnsinns Geniestreich) ist allen hier glaub ich egal!
Hör auf mit deinem Gespamme !
Hör auf andere Leute per PM zu belästigen !
Hör auf an GLBasic rumzumotzen !
Wenn du das geschnallt hast, kommt hier auch jeder mit dir aus. Ich bekomm von allen ecken nur beschwerden von dir!
Reiß dich jetzt mal zam!
dann nenn mir doch die "ecken"!?!
p.s. wen belästige ich per PN?
wenn du mir eine verwarnung aussprichst, dann natürlich auch quellen, muss mich ja verteidigen können.
p.s. und wo du grad dabei bist, auch noch, wo ich es als explizit als meinen code ausgegeben habe.
Hattest du schön bevor ich noch was dazu geschreiben habe rausgelöscht!
Hatte es heute Früh/Mittag gelesen aber erst um 13 Uhr geantwortet.
Ich bin dir keine Rechenschaft schuldig.
Ich werde hier auch keine Namen nennen.
Du weisst schon selber wen du alles PM's geschrieben hast.
Ende der Diskussion