Zeitverzögerung

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

First-Climber

Betreff: Zeitverzögerung

BeitragSa, Sep 05, 2009 11:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich wollte mit meinem kleinen Anfänger Projekt eigentlich auf jegliche fremde Hilfe verzichten, jedoch weiß ich im Moment einfach nicht weiter.

Die Forumsuche oder fremde Quellcodes brachten mich leider auch nicht wirklich weiter bei diesem Problem.

Es ist eigentlich ganz simpel:

Code: [AUSKLAPPEN]
Graphics 1000,500,32,2
SetBuffer BackBuffer()

;.........................................................Globale Variabeln
Global ship, explosion, life, armor
Global lifepoint
Global lifepoint_max
Global armorpoint
Global counter
Global foe_count
Global shot_count

;.........................................................Bilder laden

   life=LoadImage ("d:\space shooter\gfx\heart.jpg")
   armor=LoadImage ("d:\space shooter\gfx\armor.jpg")
   ship=LoadImage ("d:\space shooter\gfx\ship.jpg")
   ship_foe01=LoadImage ("d:\space shooter\gfx\ship_small.jpg")
   shot=LoadImage ("d:\space shooter\gfx\shot.jpg")
   explosion=LoadAnimImage ("d:\space shooter\gfx\Explosion.bmp",64,64,0,32)

;........................................................Lokale Variabeln
Local player_x
Local player_y
Local Player_Lastschuss=0

;........................................................Variabeln deklarieren

lifepoint=100
armorpoint=100
player_x=50
player_y=100

;........................................................TYPES

Type shot
   Field x
   Field y
   Field dead
   Field number ; Anzahl Schüsse momentan im Spiel
End Type

Type foe
   Field x
   Field y
   Field dead
   Field crash
   Field speed
End Type

Type star
   Field x
   Field y
   Field scale#
   Field speed
   Field number
   Field del
End Type


;...............................................................Mainloop..................................................................................................

Repeat
   Cls
   
   ;Figur
   If lifepoint>=1 Then
      DrawImage ship, player_x,player_y ;.....................................................Normales Schiff
      Else ;..................................................................................Ansonsten Explosion
         If MilliSecs() > tmr + 30 Then
               tmr = MilliSecs()
               frm = (frm + 1) Mod 32
            xy=xy+1;........................................................................zählen gegen unendliche Animation
            End If
      If xy<32 Then DrawImage explosion, player_x, player_y, frm ;............................Explosion einleiten
   EndIf
   
   star_field ();..............................................................................Sternenfeld erstellen
   hud ();.....................................................................................Hud anzeigen lassen
   
   ;Steuerung
   If lifepoint>=1 Then
      If KeyDown(208) Then player_y=player_y+10 ;.............................................Nach Oben
          If KeyDown(200) Then player_y=player_y-10 ;.............................................Nach unten

      If KeyDown (205) Then player_x=player_x+5 ;.............................................Nach rechts
      If KeyDown (203) Then player_x=player_x-5 ;.............................................Nach links
   EndIf
   
   ;Feldbegrenzung
   If player_y<0 Then player_y=0
   If player_y>480 Then player_y=480
   
   
   ;Gegner
   If foe_count <2 Then create_foe ();........................................................Gegner Begrenzung
   
   For f.foe = Each foe ;.....................................................................Alle Gegner durchgehen
      If f\dead=0 Then
         f\x=f\x-f\speed;.........................................................................Bewegung des Gegners
         DrawImage ship_foe01, f\x, f\y;....................................................Gegner einzeichnen
      EndIf
      

         crash_ship=ImagesCollide (ship, player_x, player_y, 0, ship_foe01, f\x, f\y, 0);...Player Kollision Foe überprüfen
         If crash_ship = 1 Then ;...........................................................Falls Kollision, Foe zerstören   
         f\dead=1
         lifepoint=0
         EndIf
         

         If shot_count >=1 Then;............................................................Falls es überhaupt Schüsse gibt dann...
            For s.shot = Each shot;........................................................Alle Schüsse durchgehen
               crash_shot=ImagesCollide (ship_foe01, f\x, f\y, 0, shot, s\x, s\y, 0);.....Feindliche Schiffe und Schüsse auf Kollision prüfen
               If crash_shot=1 And a_x=0 Then;............................................Falls es einen Crash gab
                  f\dead=1;..............................................................Wird der Gegner zerstört
                  s\dead=1;..............................................................Wird der Schuss zerstört
               EndIf
            Next
         EndIf
         

         
         If f\x<0 Then f\dead=1;............................................................Bei MapEnde Zerstörung einleiten
         If f\dead=1 Then;..................................................................Falls Zerstörung notwendig
            
            Delete f.foe;..................................................................Zerstören
             foe_count=foe_count-1;.........................................................Foe_Count um eins verringern
         EndIf
   Next
   
   ;Schuss
   If lifepoint>=1 Then
      If KeyDown (28) And Player_Lastschuss<MilliSecs() -300 Then;...........................Feuerrate (fehlt noch Variable)
         create_shot (player_x+20, player_y+22)
         Player_Lastschuss=MilliSecs()
      EndIf
   EndIf    

      For s.shot = Each shot
            s\x=s\x+20;....................................................................Schussgeschwindigkeit (fehlt noch Variable)
            DrawImage shot, s\x, s\y;......................................................Schuss zeichnen
            
            If s\x>900 Then s\dead=1;......................................................Falls der Schuss die 900er Marke verlässt, wird er zerstört (am Ende auf 1000 setzen)
            If s\dead=1 Then
               Delete s.shot;.............................................................Zerstörung des Schusses
               shot_count=shot_count-1;...................................................Schuss"zähler" um eins verringern
            EndIf
         Next
   Flip
Forever

;..............................................................................................Funktionen

Function create_shot (x,y)

    shot_count=shot_count+1
   
   s.shot=New shot
   s\x=x+20
   s\y=y+5
   s\dead=0

;........................................................................................................Function Create Foe
   
End Function

Function create_foe ()
   If lifepoint>=1 Then
      foe_count=foe_count+1

      f.foe=New foe
      f\x=1050
      f\y=Rand (20,500)
      f\dead=0
      f\crash=0
      f\speed=Rand (4,8)
      
   EndIf
   
End Function


;.........................................................................................................Function Star Field

Function star_field ()

   ;Variabeln deklarieren
   
   
         For x = 0 To number
            t.star=New star
            t.star\x=1000
            t.star\y=Rand (20,480)
            t.star\scale#=Rand (0.5,1.5)
            t.star\speed=Rand (1,3)
         Next
   
         For t.star = Each star
            t\x=t\x-t\speed ;Position an Speed anpassen
      
            Oval t\x, t\y, t\scale, t\scale ;Sterne erstellen
            
         
            If t\x<0 Then t.star\del=1
            If t\del=1 Then
               Delete t.star ;Sterne löschen
               
            EndIf
         Next
   
   
End Function

;.........................................................................................................Function HUD

Function hud ()
   
   ;Lebenspunkte
   
   DrawImage life, 30,460
   Color 255,0,0: Text 50,480, lifepoint ;Lebenspunkte anzeigen
   Color 255,255,255 ;weiße Farbe wieder anpassen
   
   ;Panzerung
   DrawImage armor, 90, 457
   Color 240,240,240: Text 115, 480, armorpoint; Panzerung anzeigen
   Color 255,255,255 ;weiße Farbe wieder anpassen
   
End Function



Das ist der Code meines ersten Projektes.

Wenn man selber mit feindlichen Schiffen kolidiert, explodiert man vorschriftsgemäß.

Jedoch kann ich diesen Mechanismus auf Teufel komm raus nicht bei den Gegnern einbauen, wenn diese von einem Schuss getroffen werden.

Vielleicht kann mir da jemand einen Tipp geben.

Ich komme einfach nicht auf die Lösung.

Eigentlich ist es ganz einfach. Wenn er getroffen wird, soll ein Timer angehen, der die Explosion erstellt.

Möglicherweise kann mir ja jemand auch allgemeine Tipps zum Thema Zeitverzögerung geben.

Den Code

Code: [AUSKLAPPEN]
Graphics 400,300,0,2
SetBuffer BackBuffer()

ms=MilliSecs() ;ms speichert den Zeitpunkt mit Millisecs

While Not KeyHit(1)

      If MilliSecs() > ms+10000  Then
   ;irgendwas
     ms=MilliSecs ()

   EndIf
Wend



hier verstehe ich, jedoch kann ich folgendes nicht zustande bringen:

Nehmen wir an, 3 Gegner fliegen hintereinander
Der erste soll nach x Sekunden ein wenig nach unten fliegen,
Später sollen ihm langsam die anderen folgen.

So eine Art Wellenbewegung.

Ich habe es nur geschafft, dass sich alle gleichzeitig bewegen, jedoch halt ohne diese Zeitverzögerung.

Anderes Beispiel:

Ich drüche eine beliebige Taste, der Spieler nähert sich einem Punkt oder was weiß ich. Diese Aktion startet einen Timer.
Nach x Sekunden passiert dann etwas.
Solche Dinge.

Es wäre wirklich nett, wenn mir da jemand ein paar allgemeine Tipps geben könnte.

Hier sind noch die Bilder für das oben genannte Spiel

http://www.materialordner.de/5...VZmeU.html

First-Climber

Xeres

Moderator

BeitragSa, Sep 05, 2009 12:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Für Explosionen würde ich einen weiteren Type erstellen, der immer neu generiert wird, wenn ein Schiff zerstört wird.
Wenn du öfters/für jeden Type Timer brauchst - schreib dir einen Timer-Type! Du brauchst nur eine Check Funktion, die dir zurückgibt, ob der Timer ausgelaufen ist oder nicht.
Hintereinander fliegende Schiffe sind mit Types ohne Hilfe nicht so einfach zu identifizieren. Vielleicht hilft eine Zahl, die Richtung/Flugmodus anzeigt - oder du gibst als Field das folgende Schiff an.

Edit:
Allgemeiner Tipp: Flip(0) + Waittimer() (siehe Hurra, 100 % Auslastung)
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)

SpionAtom

BeitragSa, Sep 05, 2009 13:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Jap, Types sollten es bringen.
Noch zwei Anmerkungen: Benutze relative Pfade, lass also das d:\.. weg. So kann man den Ordner hinkopieren wo man will.

Mach das Spiel mit Esc abbrechbar. Zb mit
Code: [AUSKLAPPEN]
Repeat
..
Until keydown(1)


Ansonsten machs mal fertig Very Happy
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080
 

First-Climber

BeitragSa, Sep 05, 2009 13:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Tipps, ich werde mal schauen, wie ich das mit den Types lösen kann.


Edit: Bei Flip 0 jedoch ruckeln die feindlichen Schiffe ganz leicht...

Edit2: Das Problem mit den Timern ist gelöst, nur das leichte Ruckeln noch nicht.

faeX

BeitragSa, Sep 05, 2009 21:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Dein Ruckeln erklärt sich leicht (folgt mal ein kurzer Ex-kurs zum Thema Doublebuffering):

Mit dem SetBuffer BackBuffer() nach dem Graphics 1000, 500, 32, 2 (die Auflösung ist übrigens schwachsinng. Nimm 1024, 768, 32, 2!) setzt du den aktuellen Buffer auf den Backbuffer.

Es gibt viele Buffer, 2 davon sind:
Der BackBuffer: Ein Speicher im Hintergrund, der nicht angezeigt wird
Der FrontBuffer: Der Bildschirminhalt

Wozu BackBuffer? Die Grafikkarte tauscht in regelmäßigen Abständen (der sogenannten Taktfrequenz, bsp: 60Hz, 76Hz = 60 o. 76 mal die Sekunde) den hardwareinternen BackBuffer mit dem FrontBuffer aus, damit das was gezeichnet werden soll nicht direkt auf dem Bildschirm erscheint. Das würde von dem Auge dann als Flackern wargenommen werden.

Mit SetBuffer BackBuffer() schaltest du allerdings auf den softwareinternen BackBuffer. Du zeichnest erstmal in den BackBuffer, und tauscht dann FrontBuffer mit BackBuffer aus (dafür gibt's Flip) und schiebst damit den Inhalt des softwareinternen BackBuffers in de softwareinternen FrontBuffer und damit in den hardwareinternen BackBuffer. Jetzt kann es aber sein, dass der Bildschirm schon dabei ist den hardwareinternen FrontBuffer auf den Bildschirm zu bringen, während Flip die softwareinternen Front- und Backbuffer austauscht. Das heißt die obere Hälfte wäre dein letzter Frame, die untere Hälfte der aktuelle. Dadurch entsteht das Ruckeln!

Um das zu vermeiden gibt es VSync (Befehl: VWait oder Flip 1). VSync steht für Vertical Synchronisation. Dieser Befehl sagt deinem Programm es soll warten, bis die Grafikkarte die Buffer wieder tauscht und die Streifen nicht entstehen.

Das und mehr steht übrigens auch in dem Tutorial Hurra, 100% Auslastung. Lies es dir durch! Ist nicht so schwer und hilft! Wink
 

First-Climber

BeitragSa, Sep 05, 2009 21:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mit den Buffern habe ich so grob auch schon gelesen, jedoch bedanke ich mich für den kleinen Tipp mit dem Befehl.

Jetzt ist das Ruckeln verschwunden und so ziemlich alle bisherigen Fragen beantwortet.

Vielen Dank ! Very Happy

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group