Zeiteinfluss in functionen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

PhillipK

Betreff: Zeiteinfluss in functionen

BeitragFr, Feb 06, 2009 12:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Blitzforum ^-^

Hab mich nun auch mal angemeldet xP

Also, mein problem ist: ich brauch einen Denkanstoß.

Ich schreibe mit Annixa grade ein bissl spasseshalber ein 3D projekt..
Nun gibts diverse sachen wie ein Jump zb, die ich am liebsten mit Zeit schreiben würde..

ATM nutze ich Frames, was annixa aber nicht so mag (für evlt schwächere rechner wo es frameskip geben könnte) - aber darauf gehe ich nicht weiter ein^^

Also... mal ein einfaches beispiel.

Spieler drückt leertaste, player entity soll springen. Um das nach möglichkeit Sauber und flüssig zu gestalten brauche ich zeiteinfluss.. Alle 1sekunde zb y = y+1 oderso.
Aber meine ansätze klappen irgendwie nicht oO

Vor dem beginn der Mainloop wird ein Zeitstamp initialisiert.
Start_Time = Millisecs()
im mainloop selber wird Current_Time = Millisecs() bestimmt.
Die idee ist simpel => Die differenz zwischen Current_time und Start_time ist also die spielzeit. In millisekunden^^

Wenn ich nun eine Funktion schreiben will die 20sekunden lang etwas ausführen soll, wie am besten? o0

Mein ansatz wäre, (grob geschrieben, nicht 1zu1 perfekt geschrieben^^)

Test_aktiv = 0 ist eine Global die vorm mainloop auf 0 gesetzt wird ^^

Code: [AUSKLAPPEN]

Function Test(firstcall=0)

   If firstcall=1 Then
      Sekunden = 20
      Test_aktiv = 1
   Endif

   Time_unterschied = Time_current - Start_time

   *rausfinden ob seit dem letzten durchgang eine sekunde vergangen ist? :(*

   If Eine sekunde vergangen  Then
      Sekunden = Sekunden-1

      *das machen, was auch immer die funktion tun soll^^*
   Endif

   If Sekunden<0 Then Test_aktiv = 0

End Function


und im mainloop noch eine "If Test_aktiv = 1 Then Test()" reinhaun..
Soweit die grobe idee ^^

Nun zu euch, ist mein ansatz wenigstens richtig? :>
Was könnte ich zu weniger zeilen zusammenschreiben, was könnte ich stattdessen nehmen, und wie zur hölle führ ich eine funktion einmal pro frame aus, aber sie soll nur jede sekunde etwas tun? Razz

Ansonsten wollt ich noch sagen:
Schön das es ein Deutschsprachiges Forum zu Blitz3D gibt Smile Ich denke, ihr werdet gut mit mir auskommen, auch wenn meine fragen meist sehr dämlich sein können^^

Ich bin kein direkter noob im proggen.. nur in Blitz3d binsch doof Smile Bin allerdings schon an vielem verzweifelt, also bin ich wohl doch irwi nur ein noob Razz

Ich hoffe auf antworten^-^

Smily

BeitragFr, Feb 06, 2009 12:56
Antworten mit Zitat
Benutzer-Profile anzeigen
du hast die lösung doch schon selbst geschrieben.

Du musst einfach 1 sekunde "stoppen"

Wenn es losgeht, setzt du eine variable auf den zeitwert.
Dann kannst du prüfen, wieviel zeit schon vergangen ist.


Code: [AUSKLAPPEN]

lasttick = millisecs()
Repeat
  if millisecs() - lasttick > 1000
     Print "Eine Sekunde ist vergangen"
     lasttick = millisecs() ;alternativ auch lasttick=lasttick+1000, wenn du wirklich genau einen sekündlichen tick garantieren willst. Ansonsten wirst du immer 1-2 millisekunden drüber sein.
  end if
until keyhit(1)
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org
 

PhillipK

BeitragFr, Feb 06, 2009 13:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die schnelle antwort Smile

Ich tue es mir selbst manchmal schwer und denke zu komplex...

Repeat ist in diesem fall die Mainloop?

Also zusammgenfasst brauche ich nur eine Abstandsvariable, die allderdings nicht "1000" enthält, sondern immer Current_Time+1000 ?.. und die Funktion überprüft ob Current_time > Abstandsvariable ist und führt diese aktion dann aus..

Aaaah das gibt sinn Smile Dankeschön, gleich mal einbasteln^^

Kleine frage am rande, gibt es einen operator für "größer-gleich" bzw "kleiner-gleich"?
ich kannte das immer nur als a>=b bzw a<=b ^^ Was bei B3d allerdings nicht klappte xD und ständig mit a=b OR a<b zu arbeiten nervt mich =)

Xeres

Moderator

BeitragFr, Feb 06, 2009 13:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Kleiner gleich oder größer gleich kann man sowohl "=>" als auch ">=" (bzw. "=<" und "<=") schreiben, dass macht keinen Unterschied.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

PhillipK

BeitragFr, Feb 06, 2009 13:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Xeres hat Folgendes geschrieben:
Kleiner gleich oder größer gleich kann man sowohl "=>" als auch ">=" (bzw. "=<" und "<=") schreiben, dass macht keinen Unterschied.


Als ich das das letzte mal versucht habe gings nicht o.o

Okay...

Mein Zeitkrams funktioniert btw Smile

Ich werds gleich irwann mal zusammenraffen und als rohling zur verfügung stellen, falls jmd das selbe vorhat ^^

Tankbuster

BeitragFr, Feb 06, 2009 15:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich verwende dafür immer die "Schleifenzeit", also die länge einer Schleife in Millisekunden:
(in Meinem Beispiel teile ich die Millisekunden noch durch 10 Wink )

Zitat:
msc#=0.0
SchleifenZeit#=0.0
While 1=1
msc#=MilliSecs()

[BLA BLA...]


SchleifenZeit#=(MilliSecs()-msc#)/10
Wend


Eine Variable wie die Geschwindigkeit eines Objektes, oder auch einfache Timer kann man damit gut herstellen. Hier 2 beispiele:

Zitat:

;Frameunabhängige Bewegung:
MoveEntity Cube,0.1*SchleifenZeit#,0,0


Zitat:
;Frameunabhängiger Timer
Timer#=Timer#+0.1*SchleifenZeit#
If Timer>1000 Then mach_was()


Ich hoffe, dass ich helfen konnte Wink

Tank

EDIT: Warum erwähnst du eigentlich überall, dass du etwas zusammen mit AnniXa machst? Razz Laughing Wink
 

PhillipK

BeitragSo, Feb 08, 2009 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Ehm.. ka xD Kommt doof wenn man von Projekt redet und nix drauf hat :p

Das passiert einfahc so beim schreiben ^-^

Naja.. zu dem zusammengerafften krams, ich hab wohl doch noch irgendwo einen Bug eingefressen den ich erstmal ausmerzen muss..
Ich glaub ich übernehme mit grade etwas mit meiner Zeit+Vorhaben >.<

Aber danke an alle, für die antworten Smile Ich guck sobald ich zeit hab nach dem Funktionen krams, damit ich anderen die ähnliches vorhaben mit meiner Recherche helfen kann *grins*

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group