Timing von Schüssen und anderen Ereignissen
Übersicht

BackbufferBetreff: Timing von Schüssen und anderen Ereignissen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo, wie time ich am besten Ereignisse in meinem Programm? Bis jetzt hatte ich für Schüsse einfach einen Int-Zähler, aber das scheint mir nicht das Gelbe vom Ei zu sein.
Sollte ich da mit den Frames per Second arbeiten? |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Am sinnvollsten ist immer noch Millisecs().
Zeit speichern, Dauer in Millisekunden addieren und abfragen ob Millisecs() schon größer ist. |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Backbuffer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ok, das heißt aber, dass ich jede Aktion in meinem Programm in eine solche Zeitabfrageschleife packen muss, oder? Gibt's da vielleicht auch noch eine andere (einfache ![]() |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn jede Aktion eine andere Dauer hat, bleibt dir das kaum erspart; Bei einem vielfachen einer Zeiteinheit könntest du noch einen Zähler mitlaufen lassen.
Oder wenn es deine Spielmechanik erlaubt, ein Eventtype der die Zeit und Art der Aktion verarbeitet. |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nein soweit ich weiß nicht. Mach das so :
Code: [AUSKLAPPEN] ms = Millisecs() ;Vor der Schleife setzten
If KeyDown(schussTaste) then If ms + SchussZeitInMillisekunden <= Millisecs() then CreateNewSchuss():ms = Millisecs() ;Wichtig : Immer wieder auf Millisecs() setzten ! EndIf |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
Backbuffer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Crack93 hat Folgendes geschrieben: Nein soweit ich weiß nicht. Mach das so :
Code: [AUSKLAPPEN] ms = Millisecs() ;Vor der Schleife setzten
If KeyDown(schussTaste) then If ms + SchussZeitInMillisekunden <= Millisecs() then CreateNewSchuss():ms = Millisecs() ;Wichtig : Immer wieder auf Millisecs() setzten ! EndIf Ich glaube so hat es Xeres auch gemeint. Hab's jetzt auch so umgesetzt. Allerdings habe ich das Problem, dass die Variable "SchussZeitInMillisekunden" bei mir ein type ala shot\shotstyle\firerate ist (wobei shot ein type ist und shotstyle ein Untertype), was zu dem Problem führt, dass ich es in der if-Zeile prüfen möchte, bevor überhaupt das Objekt erschaffen wird. Ich könnte natürlich die Variable einfach in einem Dim verwalten, aber man hat mir geraten dies in Types zu machen. |
||
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
ungefähr so :
Code: [AUSKLAPPEN] Graphics 800,600,16,2
SetBuffer BackBuffer() Type schuss Field x,y Field schussstyle.schussstyle End Type Type schussstyle Field ms,mst End Type For i = 1 To 100 schuss.schuss = New schuss schuss\x = Rand(100,700) schuss\y = Rand(100,600) schuss\schussstyle = New schussstyle schuss\schussstyle\mst = Rand(10,200) ;Millisekunden schuss\schussstyle\ms = MilliSecs() Next Repeat For schuss.schuss = Each schuss If schuss\schussstyle\ms+schuss\schussstyle\mst <= MilliSecs() schuss\x=schuss\x+1:schuss\schussstyle\ms=MilliSecs() Plot schuss\x,schuss\y Next Flip Cls Until KeyHit(1) End kannst du noch ein bissel ausschmücken.... mfg Crack93 |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
Backbuffer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Soweit ist das mir schon klar. Das Problem ist ein Zirkelschluss in meinem Progamm. Wenn die Schusstaste gedrückt wird und der Timer abgelaufen ist, dann erstelle einen neuen Schuss. Allerdings ist der Timer vom Schuss abhänig. Hier der Code:
Code: [AUSKLAPPEN] If KeyDown(57) Then
If ship\energy >= 1 Then If timer + shot\shotstyle\firerate < MilliSecs() Then shot.t_Shot = New t_Shot shot\deltax = ship\xspeed shot\deltay = ship\yspeed shot\direction = ship\heading shot\xpos = ship\xpos-shot\deltax+Cos(shot\direction)*8 shot\ypos = ship\ypos-shot\deltay+Sin(shot\direction)*8 shot\owner = 1 shot\shotstyle= New d_Shot shot\shotstyle\speed = 10 shot\shotstyle\firerate = 200 shot\shotstyle\range = 250 shot\shotstyle\damage = 1 timer = MilliSecs() ship = First t_Ship ship\energy = ship\energy-1 If ship\energy < 0 Then ship\energy = 0 End If End If End If |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Warum schreibst du nicht alle Infos zum Schuss in einen Shot-Type, in ship\ die ausgewählte Waffe, je nach Waffe kannst du die Feuerrate anpassen. Ohne shotstyle\ liefe es jedenfalls weniger kompliziert.
Nachtrag: Oder shotstyle\ als untertype von ship\, wenn du auf potentiell unendliche Schussarten beharren möchtest, musst nur den aktiven markieren und vor dem Feuern raussuchen. |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
0penguin0 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
seit wann hat ein schuss eine schussrate? | ||
i never finish anyth |
Backbuffer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Xeres hat Folgendes geschrieben: Warum schreibst du nicht alle Infos zum Schuss in einen Shot-Type, in ship\ die ausgewählte Waffe, je nach Waffe kannst du die Feuerrate anpassen. Ohne shotstyle\ liefe es jedenfalls weniger kompliziert.
Also eigentlich hatte ich ja vor alle Infos zum Schuss in ein Shot-Type zu packen. Shotstyle ist dabei der Untertyp, wo alle allgemeinen Variablen gespeichert werden. Ist in deinem Beispiel die Feuerrat jetzt in dem Shot-Type gespeichert oder in ship\weapon? |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kleiner Beispielcode wie ich das Regeln würde; Mit der Leertaste zwischen 2 Schussstyles wechseln:
Code: [AUSKLAPPEN] Type Tship
Field akt_style Field shot_timer End Type Type Tschussstyle Field ID Field rate Field speed End Type Type Tshot Field x, y, speed End Type Local ship.Tship = New Tship ship\akt_style = 0 ship\shot_timer=MilliSecs() Local sstyle.Tschussstyle = New Tschussstyle sstyle\ID = 0 sstyle\rate = 500 sstyle\speed = 2 sstyle.Tschussstyle = New Tschussstyle sstyle\ID = 1 sstyle\rate = 1500 sstyle\speed = 2 Graphics 800, 600, 0, 2 SetBuffer BackBuffer() Repeat Cls If KeyHit(57) Then ship\akt_style = ship\akt_style Xor 1 For sstyle.Tschussstyle = Each Tschussstyle If ship\akt_style = sstyle\ID Then If ship\shot_timer < MilliSecs() Then Local shot.Tshot = New Tshot shot\x = 0 shot\y = 300 shot\speed = sstyle\speed ship\shot_timer = MilliSecs()+sstyle\rate EndIf EndIf Next For shot.Tshot = Each Tshot shot\x=shot\x+shot\speed Oval(shot\x-5, shot\y-5, 10, 10, 1) Next Text 10, 10, "Aktuelle SchusstyleID: "+ship\akt_style Text 10, 25, "Zeit bis nächster Schuss: "+(ship\shot_timer-MilliSecs()) Flip Until KeyHit(1) End Du speicherst in akt_style welche Schussart verwendet werden soll, und überträgst alles wichtige in den shot-Type... so jedenfalls mein Vorschlag. |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Backbuffer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke Xeres. Hab's jetzt so umgesetzt. Allerdings habe ich noch das kleine Problem, dass wenn der Spieler auf eine andere Waffe schaltet (der Spieler hat zwei), der Gegner, der nur eine Waffe hat, nicht mehr schießen kann. Offenbar teilen sich Spieler und Gegner, die gleiche Schuss_ID. Das versteh ich aber nicht, da über die For..Each-Schleife, doch jede Schuss_ID durchgegangen wird, also auch die, die der Spieler gerade nicht verwendet. | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group