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

BackbufferBetreff: Grafik (Explosion) über mehrere Frames (gelöst) |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die einzig sinnvolle Methode so etwas umzusetzen besteht in der Verwendung von Type![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke für die Hilfe. Mit den Types klappt es gut. | ||
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
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! |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
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) ![]() 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! |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group