da mich das ganze Thema doch ein wenig interessiert hatte, hab ich mich auch mal drangesetzt und vor allem etwas an der Geschwindigkeitsschraube gedreht sowie eine art kleine GUI hinzugefügt.

Nun kann man zur Laufzeit die Parameter der Viskosität (+/-) oder die Dichte des zu injizierenden Plasmas (CsrUp/CsrDn) verändern.
Auch kann nun jederzeit die Art der Darstellung von Dichtenanzeige zu Geschwindigkeitsanzeige (D) ändern.
Nach wie vor kann man duch LMB Plasma hinzufügen (oder besser gesagt: Die Dichte des Plasmas ändern) und durch RMB einen Wirbel erzeugen.
Durch zusätzliches Drücken der Shift-Taste können diese Werte jederzeit umgekehrt werden, so dass man sehr leicht interessante Effekte erzeugen kann, wo z.B. schweres auf leichtes Plasma trifft (besonders gut nachvollziehbar bei einem hohen Viskositätslevel).
In Punkto Geschwindigkeit bin ich mit den Defaultwerten bei meinem 3.8GHz Notebook nun so knapp bei 35 Fps, was schon recht flüssig rüberkommt und auch mal nur so zum Rumspielen animiert.
Da der Code ja reines PB ist, wäre es klasse wenn jemand das ganze auch mal unter Linux testen könnte.
[kleiner Nachtrag] - Ich hab noch eine kleine Pause-Funktion (Space) eingebaut.
Wärend der Pause kann man jedoch weiterhin die verschiedenen Werte sowie die Displayart ändern (um z.B. besser den Zusammenhang von Dichte zu Flussgeschwindigkeit zu studieren).
Wird wärend der Pause durch Drücken einer Maustasten weiteres Plasma bzw. Wirbel hinzugefügt, so wird die Pause zur Injizierung des Plasmas bzw. des Wirbels kurzfristig aufgehoben.
[2. Nachtrag] - den Post mit einer nochmals aktualisierten und verbesserte Version gibt's HIER.
Code: Alles auswählen
; Program: Fluid Dynamics
; Author: (the great) remi_meier (1st big changes by 'gpphjs', final GUI improvements and speed-up by 'PureLust')
; Date: 25. February 2007
; OS: Windows (should work on other OS as well)
; Demo: No
; German forum: http://www.purebasic.fr/german/viewtopic.php?t=9894&start=20
EnableExplicit
DisableDebugger
#N = 100 ; Anzahl der Gitterpunkte, die berechnet werden
#DSTEP = 5 ; Pixel per Gitterpunkt in der Darstellung
#SIZE = (#N + 2) * (#N + 2)
#MouseSpeed = 5 ; Geschwindigkeit der Mausbewegung (je kleiner, desto schneller)
#Stream = 10 ; Stärke der Strömung unten rechts
Define YPos=278, LH=16, LS=4 ; Variablen für Gadget Anordnung
Global pause
Global plot.l = 0 ; 0 - zeichnet Dichtefeld, sonst Geschwindigkeitsfeld
Global dense.f=0.18, grav.f=9.81 ;dense - Diche des Anfangsfeldes und am Rand, grav - Gravitationskonstante
Global visc.f = 0.0001, dt.f = 0.01, diff.f = 0.00018 ; visc - (turbulente) Vikosität
Global xdense.f = 1/dense ; dt - Zeitschritt
Global Viscosity = 5 ; (Originalwert = 19) ; diff - (turbulente) Diffusionskonstante
Global DensityChange.f = 1.5
Global im.l, jm.l ; aktuelle Mouse-Position
Global StreamActive = #True
Structure FArray
f.f[0]
EndStructure
Macro IX(i, j)
(i) + (n + 2) * (j)
EndMacro
Declare set_bnd(n.l, b.l, *x.FArray)
Declare project(n.l, *u.FArray, *v.FArray, *p.FArray, *div.FArray)
Procedure add_source_gravity(n.l, *x.FArray, *s.FArray, *d.FArray, dt.f)
Define.l i, j
For i = 0 To n+1
For j = 0 To n+1
*x\f[IX(i, j)] + dt* (*s\f[IX(i, j)] - grav * (dense-*d\f[IX(i, j)])*xdense)
Next
Next
EndProcedure
Procedure add_source(n.l, *x.FArray, *s.FArray, dt.f)
Define.l i, Size = (n + 2) * (n + 2)
For i = 0 To Size - 1
*x\f[i] + dt * *s\f[i]
Next
EndProcedure
Procedure diffuse(n.l, b.l, *x.FArray, *x0.FArray, diff.f, dt.f)
Define.l i, j, k
Define.f a,xa
a = dt * diff * n * n
xa = 1 / (1.0 + 4.0 * a)
For k = 0 To Viscosity
For i = 1 To n
For j = 1 To n
*x\f[IX(i, j)] = (*x0\f[IX(i, j)] + a * (*x\f[IX(i-1, j)] + *x\f[IX(i+1, j)] + *x\f[IX(i, j-1)] + *x\f[IX(i, j+1)])) * xa
; *x\f[IX(i, j)] = (*x0\f[IX(i, j)] + a * (*x\f[IX(i-1, j)] + *x\f[IX(i+1, j)] + *x\f[IX(i, j-1)] + *x\f[IX(i, j+1)])) / (1.0 + 4.0 * a)
; *x\f[IX(i, j)] = *x0\f[IX(i, j)] + a * (*x0\f[IX(i-1, j)] + *x0\f[IX(i+1, j)] + *x0\f[IX(i, j-1)] + *x0\f[IX(i, j+1)] - 4 * *x0\f[IX(i, j)])
Next
Next
set_bnd(n, b, *x)
Next
EndProcedure
Procedure advect (n.l, b.l, *d.FArray, *d0.FArray, *u.FArray, *v.FArray, dt.f)
Define.l i, j, i0, j0, i1, j1
Define.f x, y, s0, t0, s1, t1, dt0
dt0 = dt * n
For i = 1 To n
For j = 1 To n
x = i - dt0 * *u\f[IX(i, j)]
y = j - dt0 * *v\f[IX(i, j)]
If (x < 0.5)
x = 0.5
ElseIf (x > n + 0.5)
x = n + 0.5
EndIf
i0 = Int(x)
i1 = i0 + 1
If (y < 0.5)
y = 0.5
ElseIf (y > n + 0.5)
y = n + 0.5
EndIf
j0 = Int(y)
j1 = j0 + 1
s1 = x - i0 : s0 = 1 - s1 : t1 = y - j0 : t0 = 1 - t1
*d\f[IX(i, j)] = s0 * (t0 * *d0\f[IX(i0, j0)] + t1 * *d0\f[IX(i0, j1)]) + s1 * (t0 * *d0\f[IX(i1, j0)] + t1 * *d0\f[IX(i1, j1)])
Next
Next
set_bnd(n, b, *d)
EndProcedure
Procedure dens_step(n.l, *x.FArray, *x0.FArray, *u.FArray, *v.FArray, diff.f, dt.f)
add_source(n, *x, *x0, dt)
diffuse(n, 0, *x0, *x, diff, dt )
advect(n, 0, *x, *x0, *u, *v, dt )
EndProcedure
Procedure vel_step(n.l, *u.FArray, *v.FArray, *u0.FArray, *v0.FArray, *d.FArray, visc.f, dt.f)
add_source(n, *u, *u0, dt) : add_source_gravity(n, *v, *v0, *d, dt); add_source(n, *v, *v0, dt)
diffuse(n, 1, *u0, *u, visc, dt)
diffuse(n, 2, *v0, *v, visc, dt)
project(n, *u0, *v0, *u, *v)
advect(n, 1, *u, *u0, *u0, *v0, dt) : advect(n, 2, *v, *v0, *u0, *v0, dt)
project(n, *u, *v, *u0, *v0)
EndProcedure
Procedure project(n.l, *u.FArray, *v.FArray, *p.FArray, *div.FArray)
Define.l i, j, k
Define.f h = 1.0 / n
Define.f xh = 1/h
Define.f hh = -0.5 * h
For i = 1 To n
For j = 1 To n
*div\f[IX(i, j)] = hh * (*u\f[IX(i+1, j)] - *u\f[IX(i-1, j)] + *v\f[IX(i, j+1)] - *v\f[IX(i, j-1)])
*p\f[IX(i, j)] = 0
Next
Next
set_bnd(n, 3, *div) : set_bnd(n, 3, *p)
For k = 0 To Viscosity
For i = 1 To n
For j = 1 To n
*p\f[IX(i, j)] = (*div\f[IX(i, j)] + *p\f[IX(i-1, j)] + *p\f[IX(i+1, j)] + *p\f[IX(i, j-1)] + *p\f[IX(i, j+1)]) * 0.25
Next
Next
set_bnd(n, 3, *p)
Next
For i = 1 To n
For j = 1 To n
*u\f[IX(i, j)] - (0.5 * (*p\f[IX(i+1, j)] - *p\f[IX(i-1, j)]) * xh)
*v\f[IX(i, j)] - (0.5 * (*p\f[IX(i, j+1)] - *p\f[IX(i, j-1)]) * xh)
Next
Next
set_bnd(n, 1, *u) : set_bnd(n, 2, *v)
EndProcedure
Procedure set_bnd(n.l, b.l, *x.FArray)
Define.l i
Select b
Case 0 ; Dichte Rand
For i = 0 To n+1
*x\f[IX(0, i)] = dense
*x\f[IX(n+1, i)] = dense
*x\f[IX(i, 0)] = dense
*x\f[IX(i, n+1)] = dense
Next
Case 1 ; Ost- bzw. Westrand, fester Rand u=0
For i = 0 To n+1
*x\f[IX(0, i)] = 0.0
*x\f[IX(n+1, i)] = 0.0
Next
Case 2 ; Nord- bzw. Suedrand, fester Rand v=0
For i = 0 To n+1
*x\f[IX(i, 0)] = 0.0
*x\f[IX(i, n+1)] = 0.0
Next
Case 3 ; Raender fuer die Naeherungsverfahren
For i = 0 To n+1
*x\f[IX(0, i)] = 0
*x\f[IX(n+1, i)] = 0
*x\f[IX(i, 0)] = 0
*x\f[IX(i, n+1)] = 0
Next
EndSelect
EndProcedure
;- End Simulation
Procedure.l color_gr( f1.d,f2.d)
Protected r.l, g.l, b.l,v.f
v=$500*Sqr(f1*f1+f2*f2)
g=$FF
b=$80
r = $FF -v
If r < 0 : g + r : r=0
If g < 0 : r - g : g=0
If g < $80 : b + g : EndIf
If g >= $80 : b +$FF-g : EndIf
If r < $80 : b + r : EndIf
If r >= $80
If r < $17F
b =$17F-r : r = $80
Else
r-$FF : b=0
If r>=$1FF:r=$FF:g=$FF:b=$FF :EndIf
If r>$FF :g=r-$FF:b=r-$FF:r=$FF:EndIf
EndIf
EndIf
EndIf
EndIf
ProcedureReturn RGB(r, g, b)
EndProcedure
Procedure draw_(n.l, *u.FArray, *v.FArray, im.l, jm.l)
Define.l i, j , xi, xj, xn=(n-1)*#DSTEP
Define.f um, vm
Define.s info
; Draw Density- / Velosity-Field
StartSpecialFX()
xi = 0
For i = 0 To xn Step #DSTEP
xi + 1
xj = 0
For j = 0 To xn Step #DSTEP
xj + 1
DisplaySolidSprite(0,i,j,color_gr(*u\f[IX(xi, xj)],*v\f[IX(xi, xj)]))
Next
Next
; DisplaySolidSprite(0,(im-1)*5,(jm-1)*5,$555555) ; alternativer Cursor
StopSpecialFX()
;display cross-hair at Mouse position
StartDrawing(ScreenOutput())
Line(im*#DSTEP-#DSTEP/2-1,jm*#DSTEP-2*#DSTEP-1,1,3.5*#DSTEP,RGB(255,255,255))
Line(im*#DSTEP-2*#DSTEP-1,jm*#DSTEP-#DSTEP/2-1,3.5*#DSTEP,1,RGB(255,255,255))
StopDrawing()
FlipBuffers()
If plot = 0
SetGadgetText(1,"Akt.Density : "+StrF(*u\f[IX(im, jm)],3)+" kg/m³")
Else
um=*u\f[IX(im, jm)]
vm=*v\f[IX(im, jm)]
SetGadgetText(2,"u = "+StrF(um,3)+" m/s")
SetGadgetText(3,"v = "+StrF(vm,3)+" m/s")
SetGadgetText(4,"Sqrt(u²+v²) = "+StrF(Sqr(um*um+vm*vm),3)+" m/s")
EndIf
SetGadgetText(5,"RGB Color Value = $"+Hex(color_gr(*u\f[IX(im, jm)],*v\f[IX(im, jm)])))
EndProcedure
Procedure set_dens (n.l, *d.FArray)
Define.l i, Size = (n + 2) * (n + 2)
For i = 0 To Size - 1
*d\f[i]= dense
Next
EndProcedure
Procedure set_datas(n.l, *dens0.FArray, *u0.FArray, *v0.FArray, im.l, jm.l)
Define.l z, Size = (n + 2) * (n + 2)
fillmemory_(*dens0, (n + 2) * (n + 2) * SizeOf(Float), 0)
If MouseButton(1)
SetGadgetColor(10,#PB_Gadget_FrontColor,$ff)
If KeyboardPushed(#PB_Key_LeftShift) Or KeyboardPushed(#PB_Key_RightShift)
*dens0\f[IX(im+z, jm)] = - DensityChange / dt ;Dichteaenderung pro Zeitschritt
Else
*dens0\f[IX(im+z, jm)] = DensityChange / dt ;Dichteaenderung pro Zeitschritt
EndIf
Else
SetGadgetColor(10,#PB_Gadget_FrontColor,$00)
EndIf
If MouseButton(2)
SetGadgetColor(11,#PB_Gadget_FrontColor,$ff)
If KeyboardPushed(#PB_Key_LeftShift) Or KeyboardPushed(#PB_Key_RightShift)
*u0\f[IX(im+z, jm)] = -10/dt ;Geschwindigkeitsaenderung pro Zeitschritt
*v0\f[IX(im+z, jm)] = -8 /dt ;Geschwindigkeitsaenderung pro Zeitschritt
Else
*u0\f[IX(im+z, jm)] = 10/dt ;Geschwindigkeitsaenderung pro Zeitschritt
*v0\f[IX(im+z, jm)] = 8 /dt ;Geschwindigkeitsaenderung pro Zeitschritt
EndIf
Else
SetGadgetColor(11,#PB_Gadget_FrontColor,$00)
EndIf
If KeyboardPushed(#PB_Key_LeftShift) Or KeyboardPushed(#PB_Key_RightShift)
SetGadgetColor(12,#PB_Gadget_FrontColor,$ff0000)
Else
SetGadgetColor(12,#PB_Gadget_FrontColor,$00)
EndIf
If StreamActive
*u0\f[IX(90, 90)] = - (#Stream /dt) ; hier ist ein Quirl eingebaut, rausnehmen
*v0\f[IX(90, 90)] = - (#Stream /dt)
EndIf
EndProcedure
Procedure main()
Protected *u.FArray = AllocateMemory(#SIZE * SizeOf(Float))
Protected *v.FArray = AllocateMemory(#SIZE * SizeOf(Float))
Protected *u_prev.FArray = AllocateMemory(#SIZE * SizeOf(Float))
Protected *v_prev.FArray = AllocateMemory(#SIZE * SizeOf(Float))
Protected *dens.FArray = AllocateMemory(#SIZE * SizeOf(Float))
Protected *dens_prev.FArray = AllocateMemory(#SIZE * SizeOf(Float))
Protected Drawstart.l, FrameCounter.l, KeyPressed.l
Static imf.f, jmf.f, Quit.l, oldgrav.f
set_dens(#N, *dens) ; Dichtefeld fuer den Anfang belegen
Repeat
If FrameCounter = 10 : Drawstart = ElapsedMilliseconds() : FrameCounter = 0 : EndIf
FrameCounter + 1
ExamineMouse()
imf = imf + MouseDeltaX() / #MouseSpeed
jmf = jmf + MouseDeltaY() / #MouseSpeed
If imf > #N : imf = #N : EndIf
If imf < 1 : imf = 1 : EndIf ; 0 ist Randpunkt, darf nicht gesetzt werden
If jmf > #N : jmf = #N : EndIf
If jmf < 1 : jmf = 1 : EndIf
im = imf
jm = jmf
If Not pause Or MouseButton(1) | MouseButton(2)
ExamineKeyboard()
set_datas(#N, *dens_prev, *u_prev, *v_prev, im, jm)
If Not pause
vel_step(#N, *u, *v, *u_prev, *v_prev, *dens, visc, dt)
dens_step(#N, *dens, *dens_prev, *u, *v, diff, dt)
Else
vel_step(#N, *u, *v, *u_prev, *v_prev, *dens, visc/10, dt/10)
dens_step(#N, *dens, *dens_prev, *u, *v, diff*10, dt/10)
EndIf
EndIf
If plot = 0
draw_(#N, *dens,*dens, im, jm)
Else
draw_(#N, *u,*v, im, jm)
EndIf
If FrameCounter = 10 : SetWindowTitle(0,"Fluid Dynamics ("+StrF(10000/(ElapsedMilliseconds()-Drawstart),1)+"fps)") : EndIf
ExamineKeyboard()
If KeyPressed < ElapsedMilliseconds()
If KeyboardPushed(#PB_Key_Comma)
oldgrav = grav
If KeyboardPushed(#PB_Key_LeftControl) Or KeyboardPushed(#PB_Key_RightControl)
grav + 0.01
ElseIf KeyboardPushed(#PB_Key_LeftShift) Or KeyboardPushed(#PB_Key_RightShift)
grav + 0.1
Else
grav + 1
EndIf
If grav > 20 : grav = oldgrav : EndIf
SetGadgetText(9,"(G)ravity : "+StrF(grav,2)+" m/sec²")
KeyPressed = ElapsedMilliseconds()+150
ElseIf KeyboardPushed(#PB_Key_Period)
oldgrav = grav
If KeyboardPushed(#PB_Key_LeftControl) Or KeyboardPushed(#PB_Key_RightControl)
grav - 0.01
ElseIf KeyboardPushed(#PB_Key_LeftShift) Or KeyboardPushed(#PB_Key_RightShift)
grav - 0.1
Else
grav - 1
EndIf
If grav < -20 : grav = oldgrav : EndIf
SetGadgetText(9,"(G)ravity : "+StrF(grav,2)+" m/sec²")
KeyPressed = ElapsedMilliseconds()+150
ElseIf KeyboardPushed(#PB_Key_Add)
If Viscosity < 30 : Viscosity +1 : EndIf
SetGadgetText(6,"Viscositylevel : "+Str(Viscosity))
KeyPressed = ElapsedMilliseconds()+150
ElseIf KeyboardPushed(#PB_Key_Subtract)
If Viscosity > 1 : Viscosity -1 : EndIf
SetGadgetText(6,"Viscositylevel : "+Str(Viscosity))
KeyPressed = ElapsedMilliseconds()+150
ElseIf KeyboardPushed(#PB_Key_Down)
If DensityChange < 4.9 : DensityChange + 0.1 : EndIf
SetGadgetText(7,"Change Density to : "+StrF(DensityChange,1)+" kg/m³")
KeyPressed = ElapsedMilliseconds()+60
ElseIf KeyboardPushed(#PB_Key_Up)
If DensityChange > - 4.9 : DensityChange - 0.1 : EndIf
SetGadgetText(7,"Change Density to : "+StrF(DensityChange,1)+" kg/m³")
KeyPressed = ElapsedMilliseconds()+60
ElseIf KeyboardPushed(#PB_Key_D)
plot = 1-plot
DisableGadget(1,plot)
DisableGadget(2,1-plot)
DisableGadget(3,1-plot)
DisableGadget(4,1-plot)
If plot = 0
SetGadgetText(8,"Act. (D)isplay => Density Field")
Else
SetGadgetText(8,"Act. (D)isplay => Flow Velocity")
EndIf
KeyPressed = ElapsedMilliseconds()+150
ElseIf KeyboardPushed(#PB_Key_S)
StreamActive = 1-StreamActive
SetGadgetColor(17, #PB_Gadget_FrontColor, StreamActive * $ff00)
KeyPressed = ElapsedMilliseconds()+150
ElseIf KeyboardPushed(#PB_Key_C)
FillMemory(*u, #SIZE * SizeOf(Float))
FillMemory(*v, #SIZE * SizeOf(Float))
FillMemory(*u_prev, #SIZE * SizeOf(Float))
FillMemory(*v_prev, #SIZE * SizeOf(Float))
FillMemory(*dens, #SIZE * SizeOf(Float))
FillMemory(*dens_prev, #SIZE * SizeOf(Float))
set_dens(#N, *dens)
KeyPressed = ElapsedMilliseconds()+150
ElseIf KeyboardPushed(#PB_Key_G)
If grav = 9.81
grav = 0
Else
grav = 9.81
EndIf
SetGadgetText(9,"Gravity : "+StrF(grav,2)+" m/sec²")
KeyPressed = ElapsedMilliseconds()+150
ElseIf KeyboardPushed(#PB_Key_Space)
pause = 1-pause
KeyPressed = ElapsedMilliseconds()+150
ElseIf KeyboardPushed(#PB_Key_Escape)
Quit = 1
EndIf
ElseIf Not KeyboardPushed(#PB_Key_All)
KeyPressed = 0
EndIf
While WindowEvent() : Wend
Until Quit
EndProcedure
UseTIFFImageDecoder()
InitSprite()
InitMouse()
InitKeyboard()
OpenWindow(0, 100, 100, #N * #DSTEP+200, #N * #DSTEP, "Fluid Dynamics")
Frame3DGadget(0,#N * #DSTEP+10,10,180,240,"Actual Values")
TextGadget(1,#N * #DSTEP+20,30,160,18,"Dichte : 0.000 kg/m³")
TextGadget(2,#N * #DSTEP+20,54,160,18,"u = 0.000 m/s")
TextGadget(3,#N * #DSTEP+20,78,160,18,"v = 0.000 m/s")
TextGadget(4,#N * #DSTEP+20,102,160,18,"Sqrt(u²+v²) = 0.000 m/s")
TextGadget(5,#N * #DSTEP+20,126,160,18,"")
TextGadget(9,#N * #DSTEP+20,156,160,18,"(G)ravity : "+StrF(grav,2)+" m/sec²")
TextGadget(6,#N * #DSTEP+20,180,160,18,"Viscositylevel : "+Str(Viscosity))
TextGadget(7,#N * #DSTEP+20,204,160,18,"Change Density to : "+StrF(DensityChange,1)+" kg/m³")
TextGadget(8,#N * #DSTEP+20,228,160,18,"Act. (D)isplay => Density Field")
DisableGadget(2,1)
DisableGadget(3,1)
DisableGadget(4,1)
YPos = 273
Frame3DGadget(19,#N * #DSTEP+10,255,180,238,"Control Keys")
TextGadget(10,#N * #DSTEP+20,YPos+ 0*LH+0*LS,150,18,"Left-MB = Modify Density")
TextGadget(11,#N * #DSTEP+20,YPos+ 1*LH+0*LS,150,18,"Right-MB = Add Twirl")
TextGadget(12,#N * #DSTEP+20,YPos+ 2*LH+0*LS,155,18,"+ <Shift> = Invert above Values")
TextGadget(20,#N * #DSTEP+20,YPos+ 3*LH+1*LS,150,18,"<.> = increase Gravity")
TextGadget(21,#N * #DSTEP+20,YPos+ 4*LH+1*LS,150,18,"<,> = decrease Gravity")
TextGadget(13,#N * #DSTEP+20,YPos+ 5*LH+2*LS,150,18,"<+> = increase Viscosity")
TextGadget(14,#N * #DSTEP+20,YPos+ 6*LH+2*LS,150,18,"<-> = decrease Viscosity")
TextGadget(15,#N * #DSTEP+20,YPos+ 7*LH+3*LS,150,18,"<Csr Up> = decrease Density")
TextGadget(16,#N * #DSTEP+20,YPos+ 8*LH+3*LS,150,18,"<Csr Dn> = increase Density")
TextGadget(17,#N * #DSTEP+20,YPos+ 9*LH+4*LS,155,18,"<S> = bottom right Stream on/off")
TextGadget(22,#N * #DSTEP+20,YPos+10*LH+5*LS,150,18,"<D> = Change Display type")
TextGadget(18,#N * #DSTEP+20,YPos+11*LH+6*LS,150,18,"<ESC> = Exit Program")
SetGadgetColor(17, #PB_Gadget_FrontColor, StreamActive * $ff00)
OpenWindowedScreen(WindowID(0), 0, 0, #N * #DSTEP+000, #N * #DSTEP, 0, 0, 0, #PB_Screen_NoSynchronization)
If Not CatchSprite(0,?Pixel_Sprite) : End : EndIf
main()
FreeSprite(0)
CloseScreen()
CloseWindow(0)
End
;{
DataSection
Pixel_Sprite:
Data.l 73289026,0,70647808,2621440,327680,327680,65536,8,2621440,0
Data.l 0,0,0,0,0,-2147483520,-2147483648,8388736,8388608,-2139094912
Data.l -1061158912,-591396672,-890240832,536871078,536870976,536871008,536871040,536871072,536871104,1073742048
Data.l 1073741824,1073741856,1073741888,1073741920,1073741952,1073741984,1073742016,1610612960,1610612736,1610612768
Data.l 1610612800,1610612832,1610612864,1610612896,1610612928,-2147483424,-2147483648,-2147483616,-2147483584,-2147483552
Data.l -2147483520,-2147483488,-2147483456,-1610612512,-1610612736,-1610612704,-1610612672,-1610612640,-1610612608,-1610612576
Data.l -1610612544,-1073741600,-1073741824,-1073741792,-1073741760,-1073741728,-1073741696,-1073741664,-1073741632,-536870688
Data.l -536870912,-536870880,-536870848,-536870816,-536870784,-536870752,-536870720,4194528,4194304,4194336
Data.l 4194368,4194400,4194432,4194464,4194496,541065440,541065216,541065248,541065280,541065312
Data.l 541065344,541065376,541065408,1077936352,1077936128,1077936160,1077936192,1077936224,1077936256,1077936288
Data.l 1077936320,1614807264,1614807040,1614807072,1614807104,1614807136,1614807168,1614807200,1614807232,-2143289120
Data.l -2143289344,-2143289312,-2143289280,-2143289248,-2143289216,-2143289184,-2143289152,-1606418208,-1606418432,-1606418400
Data.l -1606418368,-1606418336,-1606418304,-1606418272,-1606418240,-1069547296,-1069547520,-1069547488,-1069547456,-1069547424
Data.l -1069547392,-1069547360,-1069547328,-532676384,-532676608,-532676576,-532676544,-532676512,-532676480,-532676448
Data.l -532676416,8388832,8388608,8388640,8388672,8388704,8388736,8388768,8388800,545259744
Data.l 545259520,545259552,545259584,545259616,545259648,545259680,545259712,1082130656,1082130432,1082130464
Data.l 1082130496,1082130528,1082130560,1082130592,1082130624,1619001568,1619001344,1619001376,1619001408,1619001440
Data.l 1619001472,1619001504,1619001536,-2139094816,-2139095040,-2139095008,-2139094976,-2139094944,-2139094912,-2139094880
Data.l -2139094848,-1602223904,-1602224128,-1602224096,-1602224064,-1602224032,-1602224000,-1602223968,-1602223936,-1065352992
Data.l -1065353216,-1065353184,-1065353152,-1065353120,-1065353088,-1065353056,-1065353024,-528482080,-528482304,-528482272
Data.l -528482240,-528482208,-528482176,-528482144,-528482112,12583136,12582912,12582944,12582976,12583008
Data.l 12583040,12583072,12583104,549454048,549453824,549453856,549453888,549453920,549453952,549453984
Data.l 549454016,1086324960,1086324736,1086324768,1086324800,1086324832,1086324864,1086324896,1086324928,1623195872
Data.l 1623195648,1623195680,1623195712,1623195744,1623195776,1623195808,1623195840,-2134900512,-2134900736,-2134900704
Data.l -2134900672,-2134900640,-2134900608,-2134900576,-2134900544,-1598029600,-1598029824,-1598029792,-1598029760,-1598029728
Data.l -1598029696,-1598029664,-1598029632,-1061158688,-1061158912,-1061158880,-1061158848,-1061158816,-1061158784,-68157280
Data.l -1599864577,-2139094880,128,-16776961,-16777216,16711935,16711680,-65281,-65536,-65281
Data.l 16777215,-65536,16777215,-65536,16777215,-65536,16777215,-65536,16777215
Data.b 0,0
EndDataSection
;}
Einige kleine Änderungen:
- Code auf PB 4.51 angepasst
- Geschwindigkeit der Mausbewegung reduziert (durch "#MouseSpeed = 5" im Source nun einstellbar)
- Gravitation nun änderbar (durch "," und "." = Gravitation +/- 1.00, mit Shift = +/- 0.10, mit Strg = +/- 0.01)
- Gravitation kann nun durch drücken von "G" auf 0 m/sec² bzw. auf 9.81 m/sec² (Erd-Gravitation) gesetzt werden.
- Strömung (unten rechts) nun abschaltbar durch drücken von Taste-"S"
- Löschen aller Werte (also ein reset aller Felder auf Ursprungszustand) durch drücken von "C".
- sowie EXE im Post verlinkt (am ScreenShot).