Grafik (Explosion) über mehrere Frames (gelöst)

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Backbuffer

Betreff: Grafik (Explosion) über mehrere Frames (gelöst)

BeitragSa, Jul 26, 2008 19:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich habe ein grundsätzliches Problem mit dem Programmaufbau. Ich mache gerade einen Space-Shooter mit 60 FPS. Bis jetzt bestanden die Explosionen nur aus einem Bild und waren auch nur einen Frame zu sehen.

Nun wollte ich zum ersten mal eine Explosion über mehrere Frames zeichnen. Ich habe eine Explosionsanimation über 16 Frames. Wie mache ich das am besten, das jetzt, das Programm über mehrere Schleifendurchläufe die Explosion zeigt?
  • Zuletzt bearbeitet von Backbuffer am Sa, Jul 26, 2008 20:32, insgesamt einmal bearbeitet

aMul

Sieger des Minimalist Compo 01/13

BeitragSa, Jul 26, 2008 19:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Die einzig sinnvolle Methode so etwas umzusetzen besteht in der Verwendung von Types.
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

ZaP

BeitragSa, Jul 26, 2008 19:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Du machst dir am besten ein Type für FX'e oder nur Explosionen, der Type Speichert das Handle vom Sprite (oder dem Bild), und den aktuellen Frame, sowie die Anzahl von Frames, die vergehen müssen, bis der nächste Frame gezeigt wird:

Code: [AUSKLAPPEN]

Type FX_Explosion
  Field mesh, frame, delay, framedelay
End Type


Dann schreibst du dir eine Updatefunktion, die von jeder Explosion das Feld delay hochaddiert. Wenn das delay Feld dem framedelay Feld entspricht, wird delay wieder auf 0 gesetzt, zu frame wird eins addiert und das Spiel geht von vorne los:

Code: [AUSKLAPPEN]

Function UpdateFX()
 
  for exp.FX_Explosion = each FX_Explosion
    exp\delay = exp\delay + 1
    if exp\delay = exp\framedelay then exp\delay = 0 : exp\frame = exp\frame + 1
  next

End Function


Dann musst du das ganze nur noch zeichnen.
Starfare: Worklog, Website (download)
 

ChristianK

BeitragSa, Jul 26, 2008 19:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Grundsätzlich wäre es besser, wenn du Grafiken unabhängig von der Frame-Anzahl anzeigst oder bewegst. Wenn dein Spiel auf einem PC nicht mit den gewünschten 60 FPS läuft, sondern vielleicht nur mit 30, dann läuft das komplette Spiel langsamer. Siehe dazu auch Frameunabhängig programmieren.

Deine Explosionsgrafik wäre bei 16 Frames für nur ca 1/4 Sekunde sichtbar. Wenn du statt den Frames die Zeit als Anhaltspunkt nimmst, kann du die Animation z.B. für 2 Sekunden anzeigen lassen. Dann sieht man einen Animationsschritt in mehreren Frames, was aber bei der schnellen Bewegung bestimmt kaum auffällt.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

Backbuffer

BeitragSa, Jul 26, 2008 20:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Hilfe. Mit den Types klappt es gut.

ToeB

BeitragSo, Jul 27, 2008 10:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja oder um nicht Tausent Types zu dirfinieren, machs mit Arrays !


Code: [AUSKLAPPEN]
SeedRnd MilliSecs()

Graphics 800,600,16,2

Global IMG = CreateImage(32,32,128)
COLR = 255
COLG = 255
COLB = 100
For i = 0 To 127
   SetBuffer ImageBuffer(IMG,i)
   Color COLR,COLG,COLB
   COLR = COLR-2
   COLG = COLG-2
   If COLR <= 100 And COLG <= 100 COLB = COLB - 2
   r = Rand(2,32)
   Oval Rand(32)-r/2,Rand(32)-r/2,r,r
Next


SetBuffer BackBuffer()

Global AK_EXP = 0
Global EXANZ = 350

Dim EX(EXANZ,5)
;EX X,0 = Aktiv
;EX X,1 = Frame
;EX X,2 = X
;EX X,3 = Y
;EX X,4 = FrameMS
;EX X,5 = FrameDelay

Color 255,255,255


Repeat
   If KeyDown(57) Then CreateEXP(Rand(800),Rand(600),Rand(50,100))
   UpdateEXP()
   Text 1,1,"Explo : "+AK_EXP
   Flip
   Cls
Until KeyHit(1)
End

Function CreateEXP(x,y,dela)
   If AK_EXP <= EXANZ
      EX(AK_EXP,0) = 1
      EX(AK_EXP,1) = 0
      EX(AK_EXP,2) = x
      EX(AK_EXP,3) = y
      EX(AK_EXP,4) = MilliSecs()
      EX(AK_EXP,5) = dela
   EndIf
End Function

Function UpdateEXP()
   For i = 0 To EXANZ
      If EX(i,0) = 1 Then
         DrawImage IMG,EX(i,2),EX(i,3),EX(i,1)
         Text EX(i,2),EX(i,3),EX(i,0)
         If EX(i,4) <= MilliSecs()-100 EX(i,1) = EX(i,1) + 1 : EX(i,4) = MilliSecs()
         If EX(i,1) => 64 Then
            For j = 0 To 5
               TEMP = EX(i,j)
               EX(i,j) = EX(200,j)
               EX(200,j) = TEMP
            Next
            EX(i,0) = 0
         EndIf
      EndIf
   Next
   AK_EXP = 0
   For i = 0 To EXANZ
      If EX(i,0) = 1 AK_EXP = AK_EXP + 1
   Next
End Function


Hab ich mal schnell zusammengecodet... Musst nur für IMG und so deine Werte einsetzten... Oder z.b. kannst du die EXANZ höher oder niedriger setzten... Ist im ganzen viel schneller unf komfortabler als Types...

nmfg ToeB
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!

Xeres

Moderator

BeitragSo, Jul 27, 2008 22:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn man mit Types umzugehen versteht ist es weder nötig tausende Types zu definieren, noch muss man sich auf eine maximale Partikelzahl festlegen die sinnfrei Speicher belegt oder andere Partikel überschreibt.
Ich sehe da auch keine Komfortablität, geschweige denn Übersicht. Die hält man mit richtigen Variablennamen in den Fields eher als Kryptische Nummernverzeichnisse.
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

BeitragSo, Jul 27, 2008 22:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja... Du kannst es ja schlechter finden, ich find es Praktisch.

Du musst es ja auch nciht anwenden, du kannst dass machen wie du willst. Ich finde es so Praktisch, und werde es auch so verwenden (sobald ichs brauche)

Wink

mfg ToeB
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!

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group