kleines 2D Feuer

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

D2006

Administrator

Betreff: kleines 2D Feuer

BeitragMi, März 23, 2005 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey ho,

benutzt WritePixelFast, Partikel und eine Blur ähnliche Routine.

BlitzBasic: [AUSKLAPPEN]
Graphics 320,240,32,2
SetBuffer BackBuffer()

Dim map(320,240,3) ;ein Array, das die 3 Farbwerte für jeden einzelnen Pixel speichert

Type particle ;die Partikel
Field x#,y#,w# ;Position und Bewegungsrichtung
Field sp#,sz% ;Geschwindigkeit und Größe (sind Quadrate mit sz%*2 Pixel Kantenlänge)
Field timer% ;Schleifendurchläufe bis sie verschwinden
End Type

While Not KeyHit(1)
Cls

a=0 ;zum Zählen der Type-Einträge
For j.particle = Each particle ;jedes Partikel durchgehen
j\x#=j\x# + j\sp#*Cos(j\w#) ;neue X-Position in Richtung w#
j\y#=j\y# - j\sp#*Sin(j\w#) ;neue Y-Position in Richtung w#
j\w# = j\w# + Rand(-5,5) ;Winkel zufällig verändern (Abwechslung Wink )
per#=j\timer%/190.0 ;Alpha berechnen- je kleine timer, desto mehr Alpha
If per#<0 Then per#=1 ;0 <= per# <= 1
If per#>1 Then per#=1
For xx%=j\x-j\sz To j\x+j\sz ;das quadrat von sz% Pixel um x#/y# durchgehen
For yy%=j\y-j\sz To j\y+j\sz
If xx>0 And xx<321 And yy>0 And yy<241 Then ;wenn Variablen gültig
map(xx,yy,1)=map(xx,yy,1)+(45*per#)/1.0 ;Rot-Wert dazuaddieren
If map(xx,yy,1) > 255 Then map(xx,yy,1)=255 ;darf nicht größer 255 sein
map(xx,yy,2)=map(xx,yy,2)+(18*per#)/1.0 ;^^für Grün
If map(xx,yy,2) > 255 Then map(xx,yy,2)=255
map(xx,yy,3)=map(xx,yy,3)+(9*per#) /1.0 ;^^für Blau
If map(xx,yy,3) > 255 Then map(xx,yy,3)=255
EndIf
Next
Next
If j\timer% Then j\timer%=j\timer%-1 ;timer% ein kleiner machen
If j\timer% <= 10 Then Delete j.particle ;Type Eintrag verschwinden lassen, wenn timer%<10
;^^ bei zB timer=5 sieht man das Partikel aufgrund des hohen alpha sowieso kaum

a=a+1 ; Typeeinträge zählen
Next

If MilliSecs()>p_timer+10 ;aller 10 Millisekunden
For t=1 To 20 ;20 neue Partikel
j.particle= New particle
j\sz%= Rand(2,6) ;Größe von 4 bis 12 Pixel Kantenlänge
j\sp#= Rnd(2,4) ;Geschwindigkeit
j\w% = Rand(70,120) ;Winkel
j\x#= Rand(20,300) ;X-Position
j\y#= 230 ;Y-Position
j\timer%=Rand(20,80) ;lebensdauer des Partikel
p_timer=MilliSecs() ;Timer zurücksetzen (von wegen nur aller 10 ms)
Next
EndIf


w#=(w#+5) Mod 360 ;hoppla, ein Artefakt eines älteren codes

Text 0,12,draw() ;Pixel zeichnen lassen und dann gleich Anzahl der gemalten Pixel anzeigen

Text 0,50,MilliSecs()-timer+\" ms\" ;Zeit des Schlaufendurchgangs anzeigen
timer = MilliSecs() ;Timer für obiges
Text 0,0,a ;Anzahl der Type-Einträge anzeigen
Flip ;flippen
Wend
End

Function draw() ;diese Funktion malt dan anhand des Arrays die Pixel
;dadurch werden keine Pixel doppelt gemalt und man muss nicht ReadPixelFast benutzen
LockBuffer() ;Buffer locken für WritePixelFast

a=0 ;fürs Pixel zählen
For y=1 To 240 ;jeden Pixel des Arrays/des Buffers durchgehen
For x=1 To 320
rgb = map(x,y,1)*$10000 + map(x,y,2)*$100 + map(x,y,3) ;RGB Wert anhand der Array Einträge berechnen
If rgb > 0 Then WritePixelFast x,y,rgb:a=a+1 ;malen und zählen (aber nur malen, wenns was zu malen gibt)
map(x,y,1)=map(x,y,1)*.98 ;zwecks Blur effekt. Die Pixel werden nicht gelöscht, nur abgeschwächt
map(x,y,2)=map(x,y,2)*.97 ;dadurch brauchen wir nicht so viel Partikel aber es sieht
map(x,y,3)=map(x,y,3)*.97 ;trotzdem gut aus

Next
Next
UnlockBuffer() ;unlocken
Return a ;Anzahl der Pixel zurückgeben
End Function


die 3 Zahlen von oben nach unten:
- Anzahl der Type Einträge
- gezeichnete Pixel
- natürlich Dauer eines Schleifendurchgangs

Kritiken, Vorschläge?

EDIT:
Auf Wunsch hab ich den Code kommentiert.

MfG
D2006
  • Zuletzt bearbeitet von D2006 am Do, März 24, 2005 17:29, insgesamt einmal bearbeitet

Artemis

BeitragMi, März 23, 2005 19:29
Antworten mit Zitat
Benutzer-Profile anzeigen
geil!
 

ke^kx

BeitragMi, März 23, 2005 20:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Sieht ganz gut aus, allerdings fehlt das charcteristische Flackern von Feuer.

Jiriki
http://i3u8.blogspot.com
Asus Striker II
Intel Core2Quad Q9300 @ 2,5 GHz (aber nur zwei Kerne aktiv aufgrund der Instabilität -.-)
Geforce 9800 GTX
2GB RAM

Lord_Vader

BeitragDo, März 24, 2005 11:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Sieht gut aus. Waerest du so nett den code auszukommentieren? Ich meine nur das es besser verstaendlich fuer alle waere.

D2006

Administrator

BeitragDo, März 24, 2005 17:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

gesagt getan.

Siehe oben.

MfG
D2006

YellowRider

Ehemaliger Admin

BeitragDo, März 24, 2005 17:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Sieht echt hammergeil aus.

cya YR Wink

DA

BeitragDo, März 24, 2005 17:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin,

Klasse!
Aber in meinem Spiel würde ich dass nicht einbauen. Smile
*FPS ganz schräg anguck*

Thx
DarkAngel
Deutscher Blitz Basic Chat

Suco-X

Betreff: .........

BeitragDo, März 24, 2005 17:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Sehr schön anzuschauen. Kommentierter Code ist nochmal doppelt so nützlich. Freue mich schon auf dein nächstes Meisterwerk.
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group