Timing von Schüssen und anderen Ereignissen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Backbuffer

Betreff: Timing von Schüssen und anderen Ereignissen

BeitragFr, Feb 08, 2008 19:07
Antworten mit Zitat
Benutzer-Profile anzeigen
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?

Xeres

Moderator

BeitragFr, Feb 08, 2008 19:14
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Backbuffer

BeitragFr, Feb 08, 2008 19:19
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink ) Methode, bei der man nicht jedes mal ne eigene If-Schleife braucht?

Xeres

Moderator

BeitragFr, Feb 08, 2008 19:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

ToeB

BeitragFr, Feb 08, 2008 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Feb 08, 2008 19:49
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Feb 08, 2008 20:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Feb 08, 2008 21:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Xeres

Moderator

BeitragFr, Feb 08, 2008 22:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

0penguin0

BeitragFr, Feb 08, 2008 22:39
Antworten mit Zitat
Benutzer-Profile anzeigen
seit wann hat ein schuss eine schussrate?
i never finish anyth
 

Backbuffer

BeitragSa, Feb 09, 2008 23:29
Antworten mit Zitat
Benutzer-Profile anzeigen
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?

Xeres

Moderator

BeitragSo, Feb 10, 2008 0:23
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Backbuffer

BeitragMo, Feb 11, 2008 1:55
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group