Brennender-Fässer-Algorithmus : Verbesserungsvorschläge

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

TerrorMachine

Betreff: Brennender-Fässer-Algorithmus : Verbesserungsvorschläge

BeitragMi, März 18, 2009 23:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab hier mal ein paar Funktionen geschrieben um einfach ein Fass zu erstellen, anzuzünden und explodieren zu lassen. Alles mit Schatten und Physik.

Leider verursacht der Rauch und das Feuer einen Fehler im Schattensystem (Devil System).
Vllt weiß jemand, warum das so ist und ob man an der Explosion noch was verbessern könnte.

Hier zwei Downloadlinks (selber Inhalt):
// http://www.megaupload.com/?d=E5VYBCN0 <= nur im Notfall
http://onkelz.fasthoster.de/Fass.zip Link kopieren und nicht draufklicken!

Hier auch noch der Quellcode der beiden Dateien:
Beispiel.bb:
Code: [AUSKLAPPEN]

Graphics3D 1024,768,32,1
SetBuffer BackBuffer()
AppTitle "Fässer Beispiel"
Include "Funktionen.bb"
cam=CreateCamera()
MoveEntity cam,0,20,-25
RotateEntity cam,40,0,0
light=CreateLight()
PositionEntity light,20,20,20
timer=CreateTimer(30)
InitParticles(cam)
InitShadows(cam)
SetShadowLight(light)
InitPhysics()
SetPhysicCamera(cam)
map=CreateCube()
ScaleEntity map,100,1,100
PointEntity light,map
maptex=LoadTexture("Media\Sand.jpg")
EntityTexture(map,maptex)
ScaleTexture maptex,.1,.1
SetStaticPhysicMesh(map)
SetShadowMesh(map,False)
fass=CreateFass("Media\Fass.bmp",1,1,32,0,20,0)
While Not KeyHit(1)
   Cls
   If MouseX()=0 Or MouseX()=1021 Or MouseY()=0 Or MouseY()=765 Then MoveMouse 512,384
   RotateEntity cam,EntityPitch(cam)+MouseYSpeed(),EntityYaw(cam)-MouseXSpeed(),0
   If KeyDown(17) Then MoveEntity cam,0,0,1
   If KeyDown(31) Then MoveEntity cam,0,0,-1
   If KeyDown(30) Then MoveEntity cam,-1,0,0
   If KeyDown(32) Then MoveEntity cam,1,0,0
   If MouseHit(1) Then FassEntzuenden(fass) ;<= Fass mit dem linken Mousebutton anzünden
   UpdateFass(1,1)
   UpdateWorld
   RenderWorld
   WaitTimer(timer)
   Flip
Wend
FreeParticles()
ClearWorld
End


Funktionen.bb
Code: [AUSKLAPPEN]

Include "Engines\DevilShadowSystem.bb"
Include "Engines\ShadowVolumes.bb"
Include "Engines\UserInterface.bb"
Include "Engines\DevilPhysicEngine.bb"
Include "Engines\UserInterface2.bb"
Include "Engines\DevilParticleSystem.bb"
;--
Type fass
   Field nr
   Field id
   Field physid
   Field health
   Field feuerstarttime
   Field expstarttime
   Field feueremitter
   Field smokeemitter
   Field expemitter
End Type
;--
Global fass_anzahl
;--
Global fass_feuer = CreateTemplate()
SetTemplateInterval(fass_feuer,3)
SetTemplateEmitterLifeTime(fass_feuer,-1)
SetTemplateParticleLifeTime(fass_feuer,4,4)
SetTemplateTexture(fass_feuer,"Media\Fire.jpg",3,3)
SetTemplateOffset(fass_feuer,-0.3,0.3,-0.3,0.3,-0.3,0.3)
SetTemplateVelocity(fass_feuer,-0.04,0.04,0.1,0.27,-0.04,0.04)
SetTemplateAlphaVel(fass_feuer,False)
SetTemplateSize(fass_feuer,1.5,1.5)
SetTemplateColors(fass_feuer,$FFFFFF,$FFBB00)
;--
Global fass_explosion = CreateTemplate()
SetTemplateEmitterBlend(fass_explosion, 3)
SetTemplateInterval(fass_explosion, 1)
SetTemplateParticlesPerInterval(fass_explosion, 3)
SetTemplateEmitterLifeTime(fass_explosion, 1)
SetTemplateParticleLifeTime(fass_explosion, 50, 60)
SetTemplateTexture(fass_explosion, "Media\Smoke.png", 3, 3)
SetTemplateOffset(fass_explosion, -.7, .7, -.7, .7, .3, 1.7)
SetTemplateVelocity(fass_explosion, -.03, .03, -.03, .03, -.03, .03)
SetTemplateSize(fass_explosion, 5.2, 5.2)
SetTemplateAlphaVel(fass_explosion, True)
SetTemplateColors(fass_explosion, $FFFF00, $FFAA44)
;--
Global fass_smoke = CreateTemplate()
SetTemplateEmitterBlend(fass_smoke, 1)
SetTemplateInterval(fass_smoke, 5)
SetTemplateEmitterLifeTime(fass_smoke, 50)
SetTemplateParticleLifeTime(fass_smoke, 20, 35)
SetTemplateTexture(fass_smoke, "Media\Smoke.png", 2, 1)
SetTemplateOffset(fass_smoke, -.3, .3, -.3, .3, -.3, .3)
SetTemplateVelocity(fass_smoke, -.04, .04, .1, .2, -.04, .04)
SetTemplateAlphaVel(fass_smoke, True)
SetTemplateSize(fass_smoke, 1.5, 1.5, .5, 1.5)
SetTemplateSizeVel(fass_smoke, .01, 1.01)
;--
Function CreateFass(texturepath$,shadows=0,physik=0,segments=32,posx=0,posy=0,posz=0)
   f.fass = New fass
   fass_anzahl = fass_anzahl + 1
   f\nr = fass_anzahl
   f\id = CreateCylinder(segments)
   EntityTexture f\id,LoadTexture(texturepath$)
   ScaleEntity f\id,1,1.5,1
   PositionEntity f\id,posx,posy,posz
   f\health = 100
   If shadows=1 Then SetShadowMesh(f\id)
   If physik=1 Then
      f\physid = SetPhysicMesh(f\id)
      SetPhysicMeshPosition(f\physid,posx,posy,posz)
   EndIf
   EntityPickMode f\id,5
   Return f\nr
End Function
;--
Function UpdateFass(shadows=0,physik=0)
   For f.fass = Each fass
      If f\health = -1 Then
         PositionEntity f\feueremitter,EntityX(f\id),EntityY(f\id)-1.3,EntityZ(f\id)
         PositionEntity f\smokeemitter,EntityX(f\id),EntityY(f\id)-1.3,EntityZ(f\id)
      EndIf
      If f\health = -2 Then
         PositionEntity f\expemitter,EntityX(f\id),EntityY(f\id)-1.3,EntityZ(f\id)
      EndIf
      If f\health = 0 Then FassEntzuenden(f\nr)
      If f\health = -1 And (MilliSecs() - f\feuerstarttime) > 2000 Then FassExplosion(f\nr)
      If f\health = -2 And (MilliSecs() - f\expstarttime) > 1500 Then DeleteFass(f\nr)
   Next
   UpdateParticles()
   Render(1)
   UpdatePhysics(.1)
End Function
;--
Function FassEntzuenden(fassnr)
   For f.fass = Each fass
      If f\nr = fassnr Then found=1:Exit
   Next
   If found<>1 Then Return 0
   f\feueremitter = CreatePivot(f\id)
   PositionEntity f\feueremitter,EntityX(f\id),EntityY(f\id)-1.3,EntityZ(f\id)
   SetEmitter f\feueremitter,fass_feuer
   f\smokeemitter = CreatePivot(f\id)
   PositionEntity f\smokeemitter,EntityX(f\feueremitter),EntityY(f\feueremitter)-1.3,EntityZ(f\feueremitter)
   SetEmitter f\smokeemitter,fass_smoke
   f\feuerstarttime = MilliSecs()
   PlaySound(LoadSound("Media\Feuer.mp3"))
   f\health = -1
   found = 0
   Return 1
End Function
;--
Function FassExplosion(fassnr)
   For f.fass = Each fass
      If f\nr = fassnr Then found=1:Exit
   Next
   If found<>1 Then Return 0
   FreeEmitter(f\feueremitter)
   FreeEmitter(f\smokeemitter)
   f\expemitter = CreatePivot(f\id)
   PositionEntity f\expemitter,EntityX(f\id),EntityY(f\id)-1.9,EntityZ(f\id)
   SetEmitter f\expemitter,fass_explosion
   f\expstarttime = MilliSecs()
   DeletePhysicMesh(f\physid)
   DeleteShadowMesh(f\id)
   PlaySound(LoadSound("Media\Explosion.wav"))
   HideEntity f\id
   f\health = -2
   found = 0
   Return 1
End Function
;--
Function DeleteFass(fassnr)
   For f.fass = Each fass
      If f\nr = fassnr Then found=1:Exit
   Next
   If found<>1 Then Return 0
   FreeEmitter(f\expemitter)
   FreeEntity(f\id)
   Delete f
   found = 0
   Return 1
End Function


MfG
TerrorMachine
  • Zuletzt bearbeitet von TerrorMachine am Do, März 19, 2009 9:08, insgesamt 2-mal bearbeitet

TimBo

BeitragMi, März 18, 2009 23:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

nach jahrelangem Warten in der Warteschleife habe ich endlich dein Code, der verabschiedet sich allerdings immer mit einem

Function DX7_SetSystemProperties not found.

was ist da los ?

Greez
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.
 

TerrorMachine

BeitragDo, März 19, 2009 8:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab gerade gesehen, dass der Upload das Userlibs-Verzeichnis im Download zerschossen hat. Da ist nur die Physik drin und die ist kaputt...

Hab hier nur die Userlibs nochmal hochgeladen:
http://onkelz.fasthoster.de/Userlibs.zip

Jetz sollte es (endlich) gehen

Edit: Hab auch das Archiv erneuert. Leider nur das auf meinem Webspace. Das sollte jetzt funktionieren. Megaupload nur nehmen, wenn das andere down ist.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group