PureBasic + Irrlicht von 0 auf 100 (c) by TFT

Hier kannst du häufig gestellte Fragen/Antworten und Tutorials lesen und schreiben.
Benutzeravatar
tft
Beiträge: 650
Registriert: 08.09.2004 20:18
Computerausstattung: GFX 3060 Ti , i7 12700F , 32 GB Ram , 900 GB SSD , TV
Wohnort: Dachsen
Kontaktdaten:

Beitrag von tft »

Code: Alles auswählen

;
; -------------------------------------------------------------------------------
;
;   PureBasic - Irrlicht
;
;   Von 0 auf 100 (c) 2008 - TFT
;
;   Part 010
;
; -------------------------------------------------------------------------------
;
; In allen Parts sind die Komentare des vorherigen Parts gelöscht. Und der Code 
; soweit gerafft. Das die Übersichtlichkeit nicht all zu arg leidet. Die Neuen
; Code segmente sind mit ;--- gekenzeichnet. Das Procedure Fenster zeigt die
; entsprechenden Sprungmarken.
;
; So ... als erstes wird erst mal ein wenig aufgereumt. Und eine Liste der bereits
; angewanten Irrlicht Befehle erstellt, Fals ihr was sucht könnt ihr dort nach dem Part
; suchen wo dieser Befehl das erste mal verwendung fand.
;
; Und nun können wir uns dem nächsten Punkt widmen. Wir werden den Quader durch einen
; Steinblock ersetzen und zufällig erzeugte Steine auf uns zufliegen lassen. Diese 
; können wir dann anschiessen....... Worauf hin sich der Stein nach einer gewissen anzahl
; Treffer verabschiedet. Dazu bekommt die NodeStrukture den Eintrag Live.l . Dieser
; eintrag wird beim erzeugen des Steines auf eine Wert X gesetzt und pro Treffer
; runtergezählt. Bei <=0 wird der Stein gelöscht. Die Colisions Rutine wurde dahingegen
; etwas angepast. Der befehl Breake ist zwingend nötig. Da sobald der Schuss gelöscht wird.
; nicht weiter gesucht werden muss. Ansonsten würde gelegentlich ein Error Auftreten
; das ein Eintrag nicht existiert. Probiert es ruhig aus.
;
; Nachdem das recht schnell ging, müssen wir nun noch etwas bewegung in unser Schussfeld
; bringen. Denn es zeigte sich das dies recht eingeschrängt ist. Hir sei noch angemerkt.
; Das natürlich die Grössenverhältnisse hir eine gewaltige Rolle spielen. Experimentiert 
; ein wenig rum.  Ändert die RANDOM werte für das verteilen der Steine und versucht diese
; dann noch zu treffen.
;
; Wärend der erarbeitung des Codes, wollte ich die Camera mit der Mouse neu Positionieren.
; um das Sicht und Bewegungs Feld zu erweitern. Und schon kommt das nächste Hinderniss.
; Bei B3D ist die Camera ein object wie jedes andere auch. Hir stosse ich aber auf folgendes
; Problem. Da die Camera einen automatischen CenterPoint hat. Ich aber geradeaus schauen will
; musste ich natürlich mit Hilfe von IrrSetCameraTarget() diese ständig nachführen. Ihr
; könnt euch das ergebniss mal anschauen. Fieleicht mache ich ja auch einen Denkfehler.
; Aber eigentlich sollte das so funktionieren. <--- CameraTarget ? Auskommentieren und wundern.
;
; Dann müssen wir halt einen anderen Weg gehen. Wenn sich die Camera nicht vernünftig bewegen
; läst ... ( In diesem beispiel ! ) dann muss halt alles andere sich bewegen. Dazu benötigt 
; es mehr Aufwand, Es bedarf eines verschiebbahren Raumes. Dazu müssen wir eine leere Node
; verwenden und alle Objecte daran ranhängen. Nun wirken sich alle bewegunden Local innerhalb
; der Node 3D Coordinaten aus. Und durch verschieben der leeren Node sollte alles in bewegung
; geraten. In B3D wird eine solche leere Node Pivot genannt und mit CreatePivot() erzeugt.
; Dann müssen wir natürlich auch den Startpunkt für die Schüsse anpassen. Ich lege mal einfach
; fest das dieser leicht unterhalb der Camera sein soll.
;
; Wir flitzen bereitz durchs All und schiessen Meteoriten ab. Und das nur in 10 Parts. Es gibt
; noch einiges zu erledigen. Aber Ballert schon mal ne Runde rum.......


XIncludeFile "Irr3DRequester.pb"
Irr3DRequester(#IRR3DREQ_SKIP)

; ----------------------------------------------------------------------------------------

Structure NodeListe
    *node.irr_node
    visible.l
    ColRadius.f
    live.l
    *Move_animator.irr_animator
    *Turn_animator.irr_animator
EndStructure

; ----------------------------------------------------------------------------------------

neustart:

; ----------------------------------------------------------------------------------------

ScrX.l=irr3DRequesterSetting\videomode\dimension\width
ScrY.l=irr3DRequesterSetting\videomode\dimension\height
LeftMouseBotonDown.l=0
RigtMouseBotonDown.l=0

; ----------------------------------------------------------------------------------------

*camera.irr_camera = IrrAddCamera( 0,0,0, 0,0,1 )

IrrSetCameraClipDistance(*Camera,10000)
IrrSetCameraNearValue(*Camera,0.1)

; ----------------------------------------------------------------------------------------

*BitmapFont = IrrGetFont ( "bitmapfont.bmp" )

; ----------------------------------------------------------------------------------------
 
NewList stone_liste.NodeListe()

;--- erzeugen des Steine mesh
*Stone_Mesh.irr_mesh = IrrGetMesh("stone1.ms3d")
*StoneTexture.irr_texture = IrrGetTexture("stone1.jpg")  
    
; ----------------------------------------------------------------------------------------
 
Restore ObjectData
Read a.l
Read b.l
Read Pfad.s

Dim verts.IRR_VERT(a)
Dim indices.w(b*3)
 
Restore ObjectPoint
For i=0 To a-1
  Read mx.f
  Read my.f
  Read mz.f
  Read tx.f
  Read ty.f
  vc.l = $00FFFFFF
  verts(i)\X = mx 
  verts(i)\Y = my  
  verts(i)\Z = mz 
  verts(i)\texture_x = tx  
  verts(i)\texture_y = ty 
  verts(i)\vcolor = vc
Next
  
Restore PointToTriangle
For i=0 To (b*3)-1
  Read p.l
  indices(i)  = p
Next 
     
*schuss_mesh.irr_mesh = IrrCreateMesh( "TestMesh", a, @verts(0), b*3, @indices(0))
*SchussTexture.irr_texture = IrrGetTexture( Pfad.s )

NewList schuss_liste.NodeListe()

; ----------------------------------------------------------------------------------------
 
Restore ObjectData2
Read a.l
Read b.l
Read Pfad.s

Dim verts.IRR_VERT(a)
Dim indices.w(b*3)
 
Restore ObjectPoint2
For i=0 To a-1
  Read mx.f
  Read my.f
  Read mz.f
  Read tx.f
  Read ty.f
  vc.l = $00FFFFFF
  verts(i)\X = mx 
  verts(i)\Y = my  
  verts(i)\Z = mz 
  verts(i)\texture_x = tx  
  verts(i)\texture_y = ty 
  verts(i)\vcolor = vc
Next
  
Restore PointToTriangle2
For i=0 To (b*3)-1
  Read p.l
  indices(i)  = p
Next 
     
*explosion_mesh.irr_mesh = IrrCreateMesh( "TestMesh", a, @verts(0), b*3, @indices(0))
*explosionTexture.irr_texture = IrrGetTexture( Pfad.s )

NewList explosion_liste.NodeListe()

; ----------------------------------------------------------------------------------------
   
;--- Neue 3D Welt Node

*welt_node.irr_node = IrrAddEmptySceneNode()

Repeat

; ----------------------------------------------------------------------------------------
      
      el.l=ElapsedMilliseconds()
      If fpst.l<el.l
        fpst.l=el.l+1000
        fpsl.l=fps.l
        fps.l=0
        alpha.f=(1000/fpsl)
      EndIf
      fps.l=fps.l+1

; ----------------------------------------------------------------------------------------
           
      If IrrRunning()=0
         en=1
      EndIf

; ----------------------------------------------------------------------------------------
             
      While IrrKeyEventAvailable()
          
          *KeyEvent.irr_key_event = IrrReadKeyEvent()
  
          Select *KeyEvent\key
          Case #IRR_KEY_ESCAPE
            en=1
          Case #IRR_KEY_F12
            ResetList(schuss_liste())
            ForEach schuss_liste()
              IrrRemoveAnimator(schuss_liste()\node,schuss_liste()\move_animator)
              IrrRemoveAnimator(schuss_liste()\node,schuss_liste()\turn_animator)
              IrrRemoveNode(schuss_liste()\node)
              DeleteElement(schuss_liste())
            Next
            ResetList(explosion_liste())
            ForEach explosion_liste()
              IrrRemoveNode(explosion_liste()\node)
              DeleteElement(explosion_liste())
            Next
            ;--- Stone Listen löschens bei F12
            ResetList(stone_liste())
            ForEach stone_liste()
              IrrRemoveAnimator(stone_liste()\node,stone_liste()\move_animator)
              IrrRemoveNode(stone_liste()\node)
              DeleteElement(stone_liste())
            Next
            IrrStop()
            Irr3DRequester(#IRR3DREQ_REQUESTER)
            Goto neustart
          EndSelect
          
      Wend

; ----------------------------------------------------------------------------------------
      
      LeftMouseBotonHit.l=0
      RigtMouseBotonHit.l=0
      WheelHit.l=0
      
      While IrrMouseEventAvailable()
          
          *MouseEvent.irr_mouse_event = IrrReadMouseEvent()
          
          Select *MouseEvent\action 
          Case #IRR_EMIE_MOUSE_MOVED
            MouseSpeedX.l=MouseX.l-*MouseEvent\X
            MouseSpeedY.l=MouseY.l-*MouseEvent\Y
            MouseX.l= *MouseEvent\X
            MouseY.l= *MouseEvent\Y
          Case #IRR_EMIE_MOUSE_WHEEL
            WheelHit.l=*MouseEvent\wheel
          Case #IRR_EMIE_LMOUSE_PRESSED_DOWN
            LeftMouseBotonDown.l=1
            LeftMouseBotonHit.l=1
          Case #IRR_EMIE_LMOUSE_LEFT_UP
            LeftMouseBotonDown.l=0
          Case #IRR_EMIE_RMOUSE_PRESSED_DOWN
            RigtMouseBotonDown.l=1
            RigtMouseBotonHit.l=1
          Case #IRR_EMIE_RMOUSE_LEFT_UP
            RigtMouseBotonDown.l=0
          EndSelect
      
      Wend
; ----------------------------------------------------------------------------------------
      ;--- CameraTarget ?

      ; Dieser teil hat bei den versuchen erheblich macken gezeigt.
      ; Habt ihr eine lösung dafür?
      ;
      ;nx.f=((ScrX.l/2)-MouseX)/100.0
      ;ny.f=((ScrY.l/2)-MouseY)/100.0
      ;IrrSetNodePosition(*camera,nx.f,ny.f,0)
      ;IrrSetCameraTarget(*Camera,nx.f,ny.f,1)
      
      ;--- Welt bewegen !!!
      
      nx.f=((ScrX.l/2)-MouseX)/50.0
      ny.f=((ScrY.l/2)-MouseY)/-50.0
      IrrSetNodePosition(*welt_node,nx.f,ny.f,0)
      
; ----------------------------------------------------------------------------------------

      ;--- Zufällige steine erzeugen

      If StoneTimer.l<ElapsedMilliseconds()
        StoneTimer.l=ElapsedMilliseconds()+300
        AddElement(stone_liste())
        stone_liste()\node=IrrAddMeshToScene(*stone_mesh)
        stone_liste()\visible=0
        stone_liste()\ColRadius=1.0
        stone_liste()\live=10
        IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_LIGHTING, #IRR_Off )
        IrrSetNodeMaterialTexture( stone_liste()\node, *stonetexture, 0 )
        IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_BACK_FACE_CULLING, #IRR_On) 
        IrrSetNodeMaterialType( stone_liste()\node, #IRR_EMT_solid)
        
        ;--- Random für Steine
        x.f=(250-Random(500))/30
        y.f=(250-Random(500))/30
        
        ;--- die Steine müssen an die Welt Node gehängt werden
          IrrAddChildToParent(stone_liste()\node,*welt_node)
          
        IrrSetNodePosition(stone_liste()\node,x.f,y.f,80)
        stone_liste()\Move_animator=IrrAddFlyStraightAnimator(stone_liste()\node,x.f,y.f,40,x.f,y.f,-10,9000,0)
        IrrSetNodeScale(stone_liste()\node,0.01,0.01,0.01)
      EndIf
      
; ----------------------------------------------------------------------------------------
      
      If LeftMouseBotonDown.l=1
        If schuss_interval_timer.l<ElapsedMilliseconds()
          schuss_interval_timer.l=ElapsedMilliseconds()+100
          AddElement(schuss_liste())
          schuss_liste()\node=IrrAddMeshToScene(*schuss_mesh)
          schuss_liste()\visible=0
          schuss_liste()\ColRadius=0.05
          schuss_liste()\live=1
          IrrSetNodeMaterialFlag( schuss_liste()\node, #IRR_EMF_LIGHTING, #IRR_On )
          IrrSetNodeMaterialTexture( schuss_liste()\node, *CubeBlank, 0 )
          IrrSetNodeMaterialFlag( schuss_liste()\node, #IRR_EMF_BACK_FACE_CULLING, #IRR_Off) 
          IrrSetNodeMaterialType( schuss_liste()\node, #IRR_EMT_TRANSPARENT_ADD_COLOR)
          
          ;--- Geändert
          nx.f=((ScrX.l/2)-MouseX)/-50.0
          ny.f=(((ScrY.l/2)-MouseY)/50.0)-0.05
          nz.f=0.3
          ;--- die Schüsse müssen an die Welt Node gehängt werden
          IrrAddChildToParent(schuss_liste()\node,*welt_node)
          
          IrrSetNodePosition(schuss_liste()\node,nx.f,ny.f,0)
          schuss_liste()\Move_animator=IrrAddFlyStraightAnimator(schuss_liste()\node,nx.f,ny.f,nz.f,nx.f,ny.f,30,5000,0)
          schuss_liste()\Turn_animator=IrrAddRotationAnimator(schuss_liste()\node,0,0,10)
          IrrSetNodeScale(schuss_liste()\node,0.1,0.1,0.3)
        EndIf
      EndIf

; ----------------------------------------------------------------------------------------
       
      If WheelHit.l<>0
         IrrGetNodePosition(*Camera,@x.f,@y.f,@z.f) 
         IrrSetNodePosition(*Camera,x.f,y.f,z.f+(WheelHit.l/10.))
         IrrGetNodePosition(*Camera,@x.f,@y.f,@z.f)
         IrrSetCameraTarget(*Camera,x.f,y.f,z.f+1)
      EndIf

; ----------------------------------------------------------------------------------------
      
      IrrBeginScene(0, 0, 55 )  
      IrrDrawScene()
      IrrEndScene()
      
      Delay(1)
 
 ; ----------------------------------------------------------------------------------------
      
      ResetList(schuss_liste())
      ForEach schuss_liste()
        IrrGetNodePosition(schuss_liste()\node,@sx.f,@sy.f,@sz.f)
        If sz.f>20.0
          IrrRemoveAnimator(schuss_liste()\node,schuss_liste()\move_animator)
          IrrRemoveNode(schuss_liste()\node)
          DeleteElement(schuss_liste())
        Else
          If schuss_liste()\visible=0
            IrrSetNodeMaterialTexture( schuss_liste()\node, *SchussTexture, 0 )
            IrrSetNodeMaterialFlag( schuss_liste()\node, #IRR_EMF_LIGHTING, #IRR_Off )
            IrrSetNodeMaterialType( schuss_liste()\node, #IRR_EMT_TRANSPARENT_ADD_COLOR)
            schuss_liste()\visible=1
          Else
            ;--- Erweiterung der Colisions Abfrage
            ResetList(stone_liste())
            ForEach stone_liste()
              IrrGetNodePosition(stone_liste()\node,@cx.f,@cy.f,@cz.f)
 
              ex.f=Abs(cx.f-sx.f)
              ey.f=Abs(cy.f-sy.f)
              ez.f=Abs(cz.f-sz.f)
              c1.f=Sqr((ex.f*ex.f)+Sqr((ey.f*ey.f)+(ez.f*ez.f)))-stone_liste()\ColRadius-schuss_liste()\ColRadius
              If c1.f<=0
              
                IrrRemoveAnimator(schuss_liste()\node,schuss_liste()\move_animator)
                IrrRemoveNode(schuss_liste()\node)
                DeleteElement(schuss_liste())
   
                AddElement(explosion_liste())
                 
                explosion_liste()\visible=-1
                explosion_liste()\node=IrrAddMeshToScene(*explosion_mesh)
                IrrSetNodeScale(explosion_liste()\node,0.4,0.4,0.4)
                
                ;--- die Schüsse müssen an die Welt Node gehängt werden
                IrrAddChildToParent(explosion_liste()\node,*welt_node)
                
                IrrSetNodePosition(explosion_liste()\node,sx.f,sy.f,sz.f)
                IrrSetNodeMaterialFlag( explosion_liste()\node, #IRR_EMF_LIGHTING, #IRR_On )
                IrrSetNodeMaterialTexture( explosion_liste()\node, *CubeBlank, 0 )
                IrrSetNodeMaterialFlag( explosion_liste()\node, #IRR_EMF_BACK_FACE_CULLING, #IRR_On) 
                IrrSetNodeMaterialType( explosion_liste()\node, #IRR_EMT_TRANSPARENT_ADD_COLOR)

                stone_liste()\live=stone_liste()\live-1
                
                ;--- Break für For/Next                
                Break
              EndIf 
            Next
            ;---
          EndIf
        EndIf
        
      Next

      ResetList(stone_liste())
      ForEach stone_liste()
         IrrGetNodePosition(stone_liste()\node,@x.f,@y.f,@z.f)
         If z.f<-8 Or stone_liste()\live<=0
            IrrRemoveAnimator(stone_liste()\node,stone_liste()\move_animator)
            IrrRemoveNode(stone_liste()\node)
            DeleteElement(stone_liste())
         EndIf   
      Next 
      
; ----------------------------------------------------------------------------------------
     
      anim.f=0.001*alpha.f

      ResetList(explosion_liste())
      ForEach explosion_liste()
        If explosion_liste()\visible=0
          IrrSetNodeMaterialTexture( explosion_liste()\node, *explosionTexture, 0 )
          IrrSetNodeMaterialFlag( explosion_liste()\node, #IRR_EMF_LIGHTING, #IRR_Off )
          explosion_liste()\visible=1
        ElseIf explosion_liste()\visible=-1
          explosion_liste()\visible=0
        ElseIf explosion_liste()\visible=1
          IrrGetNodeScale(explosion_liste()\node,@x.f,@y.f,@z.f)
          If x.f<0.01
            IrrRemoveNode(explosion_liste()\node)
            DeleteElement(explosion_liste())
          Else
             IrrSetNodeScale(explosion_liste()\node,x.f-anim.f,y.f-anim.f,z.f-anim.f)
          EndIf
        EndIf
      Next

; ----------------------------------------------------------------------------------------
      
Until en=1

IrrStop()
 
End 

; ----------------------------------------------------------------------------------------

DataSection

  Objectdata:
  ;; Anzahl Punkte,Anzahl Dreiecke, Texture
  Data.l 16,8
  Data.s "fire.bmp"
    
  ObjectPoint:
  ;; x,y,z,tex_x,tex_y,v_col
  Data.f -1 ,  0 , -1 ,  0 ,  0 
  Data.f -1 ,  0 ,  1 ,  0 ,  1 
  Data.f  1 ,  0 ,  1 ,  1 ,  1 
  Data.f  1 ,  0 , -1 ,  1 ,  0 
    
  Data.f -0.7 ,  0.7 , -1 ,  0 ,  0 
  Data.f -0.7 ,  0.7 ,  1 ,  0 ,  1 
  Data.f  0.7 , -0.7 ,  1 ,  1 ,  1 
  Data.f  0.7 , -0.7 , -1 ,  1 ,  0 
    
  Data.f  0 , -1 , -1 ,  0 ,  0 
  Data.f  0 , -1 ,  1 ,  0 ,  1 
  Data.f  0 ,  1 ,  1 ,  1 ,  1 
  Data.f  0 ,  1 , -1 ,  1 ,  0 
   
  Data.f -0.7 , -0.7 , -1 ,  0 ,  0 
  Data.f -0.7 , -0.7 ,  1 ,  0 ,  1 
  Data.f  0.7 ,  0.7 ,  1 ,  1 ,  1 
  Data.f  0.7 ,  0.7 , -1 ,  1 ,  0 
    
  PointToTriangle:
  ;; p0,p1,p2 , rechts herum
  Data.l 0,1,2
  Data.l 2,3,0
  Data.l 4,5,6
  Data.l 6,7,4
  Data.l 8,9,10
  Data.l 10,11,8
  Data.l 12,13,14
  Data.l 14,15,12
  
  Objectdata2:
  ;; Anzahl Punkte,Anzahl Dreiecke, Texture
  Data.l 12,6
  Data.s "spark.bmp"
    
  ObjectPoint2:
  ;; x,y,z,tex_x,tex_y,v_col
  Data.f -1 ,  0 , -1 ,  0 ,  0 
  Data.f -1 ,  0 ,  1 ,  0 ,  1 
  Data.f  1 ,  0 ,  1 ,  1 ,  1 
  Data.f  1 ,  0 , -1 ,  1 ,  0 
  
  Data.f -1 , -1 ,  0 ,  0 ,  0 
  Data.f -1 ,  1 ,  0 ,  0 ,  1 
  Data.f  1 ,  1 ,  0 ,  1 ,  1 
  Data.f  1 , -1 ,  0 ,  1 ,  0 
  
  Data.f  0 , -1 , -1 ,  0 ,  0 
  Data.f  0 , -1 ,  1 ,  0 ,  1 
  Data.f  0 ,  1 ,  1 ,  1 ,  1 
  Data.f  0 ,  1 , -1 ,  1 ,  0 
  
    
  PointToTriangle2:
  ;; p0,p1,p2 , rechts herum
  Data.l 0,1,2
  Data.l 2,3,0
  Data.l 4,5,6
  Data.l 6,7,4
  Data.l 8,9,10
  Data.l 10,11,8
  
EndDataSection 


Zuletzt geändert von tft am 07.01.2008 12:31, insgesamt 1-mal geändert.
TFT seid 1989 , Turgut Frank Temucin , CH-Dachsen/DE-Berlin/TR-Antalya
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung

PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler :-)
Benutzeravatar
Thalius
Beiträge: 476
Registriert: 17.02.2005 16:17
Wohnort: Basel / Schweiz

Beitrag von Thalius »

:allright:

Muss mich mal am Weekend durch die DInge durchkämpfen (Kam noch zu garnix die Woche ausser Arbeit).
Aber sieht schon ordentlich aus!

Thalius
"...smoking hash-tables until until you run out of memory." :P
Benutzeravatar
tft
Beiträge: 650
Registriert: 08.09.2004 20:18
Computerausstattung: GFX 3060 Ti , i7 12700F , 32 GB Ram , 900 GB SSD , TV
Wohnort: Dachsen
Kontaktdaten:

Beitrag von tft »

Hallo ...

Ein hinweis für all diejenigen die sich über das Goto aufregen oder es einfach nur als fatalen Stil fehler betrachten. Ein Goto ist ein ganz normaler Sprung befehl. Der in ASM ständig verwendung findet. Er darf nicht !!!!! als Sprung aus einer schleifer verwendet werden. Da sonst alle Rücksprung daten durcheinander gewürfelt werden. Ich habe den Code durch Hinweis von Thalius nochmal geprüft. Und das Goto erzeugt zwar keinen Fehler. Aber ich habe meine eigene Regel gebrochen. Denn Repeat/Until ist ja ebenfals eine Schleife und ich springe aus der Schleife raus.
Ich werde das in den nächsten Parts ändern. Bitte ... wenn ihr mer solcher hinweise habt. Bitte posten :-)
TFT seid 1989 , Turgut Frank Temucin , CH-Dachsen/DE-Berlin/TR-Antalya
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung

PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler :-)
Benutzeravatar
tft
Beiträge: 650
Registriert: 08.09.2004 20:18
Computerausstattung: GFX 3060 Ti , i7 12700F , 32 GB Ram , 900 GB SSD , TV
Wohnort: Dachsen
Kontaktdaten:

Beitrag von tft »

Code: Alles auswählen

;
; -------------------------------------------------------------------------------
;
;   PureBasic - Irrlicht
;
;   Von 0 auf 100 (c) 2008 - TFT
;
;   Part 011
;
; -------------------------------------------------------------------------------
;
; In allen Parts sind die Komentare des vorherigen Parts gelöscht. Und der Code 
; soweit gerafft. Das die Übersichtlichkeit nicht all zu arg leidet. Die Neuen
; Code segmente sind mit ;--- gekenzeichnet. Das Procedure Fenster zeigt die
; entsprechenden Sprungmarken.
;
; Wärend wir so rummballern. Stellen alle sicher fest. Das die Explosionen sich nicht
; mit den Steinen bewegen. Das ist zwar nicht schlimm. Mich stört es aber. Daher werden
; wir uns weiter mit dem Child/Parent Prinzip auseinandersetzen. Denn was mit den Steinen
; geht. Sollte mit den Exlosionen ja auch machbar sein.
; Wir könnten ja einfach einen Animator starten. Aber wenn schon einer Leuft. Der des Steines.
; Müssen wir nicht extra einen Neuen starten, nur um die Explosion zu bewegen. Andereseits
; wird die Abarbeitung wider kompliziert. Da wir darauf achten müssen das wir die Steine
; ja auch löschen und die Explosionen dann plötzlich keinen Parent mer haben.
; OK ... wir werden uns erstmal mit der einfachen Variante befassen und die Position 
; von Hand anpassen. ...... Aber auch da kommen wir an grosse hinderniss. Erschwerend 
; kommt noch hinzu. Das die Funktion IrrGetChildAt() nicht funktioniert. Daher müssen
; wir uns ein eigenes System basteln. 
; Nach etlichen versuchen mit Listen und sonstigen Ideen. Muste ich dann doch auf eine
; unspektakulere Variante zurückgreifen.
; Wenn der Schuss aufprallt, Wird an dieser Stelle ein Explosions Animation gestartet.
; Als Parent dient uns dazu die Welt_Node. Damit die Explosionen sich mit den Steinen
; mitbewegen. Merken wir uns die Distanze von Zentrum des Steines zum Zentrum der Explosion.
; Und führen diese bei ;--- Explosion/Parent bewegung einfach nach.
;
; Schlussendlich sind die anpassungen in Part 11 nicht sehr gross. Aber ich habe fast 8
; Stunden rum experimentiert bis ich diesen doch recht einfachen Weg gefunden habe.

XIncludeFile "Irr3DRequester.pb"
Irr3DRequester(#IRR3DREQ_SKIP)

; ----------------------------------------------------------------------------------------

Structure NodeListe

    *node.irr_node
    visible.l
    ColRadius.f
    live.l
    *Move_animator.irr_animator
    *Turn_animator.irr_animator
    
    ;--- Struckture erweiterung
    *parent.l
    xd.f
    yd.f
    zd.f
       
EndStructure

; ----------------------------------------------------------------------------------------

neustart:

; ----------------------------------------------------------------------------------------

ScrX.l=irr3DRequesterSetting\videomode\dimension\width
ScrY.l=irr3DRequesterSetting\videomode\dimension\height
LeftMouseBotonDown.l=0
RigtMouseBotonDown.l=0

; ----------------------------------------------------------------------------------------

*camera.irr_camera = IrrAddCamera( 0,0,0, 0,0,1 )

IrrSetCameraClipDistance(*Camera,10000)
IrrSetCameraNearValue(*Camera,0.1)

; ----------------------------------------------------------------------------------------

*BitmapFont = IrrGetFont ( "bitmapfont.bmp" )

; ----------------------------------------------------------------------------------------
 
NewList stone_liste.NodeListe()

*Stone_Mesh.irr_mesh = IrrGetMesh("stone1.ms3d")
*StoneTexture.irr_texture = IrrGetTexture("stone1.jpg")  
    
; ----------------------------------------------------------------------------------------
 
Restore ObjectData
Read a.l
Read b.l
Read Pfad.s

Dim verts.IRR_VERT(a)
Dim indices.w(b*3)
 
Restore ObjectPoint
For i=0 To a-1
  Read mx.f
  Read my.f
  Read mz.f
  Read tx.f
  Read ty.f
  vc.l = $00FFFFFF
  verts(i)\X = mx 
  verts(i)\Y = my  
  verts(i)\Z = mz 
  verts(i)\texture_x = tx  
  verts(i)\texture_y = ty 
  verts(i)\vcolor = vc
Next
  
Restore PointToTriangle
For i=0 To (b*3)-1
  Read p.l
  indices(i)  = p
Next 
     
*schuss_mesh.irr_mesh = IrrCreateMesh( "TestMesh", a, @verts(0), b*3, @indices(0))
*SchussTexture.irr_texture = IrrGetTexture( Pfad.s )

NewList schuss_liste.NodeListe()

; ----------------------------------------------------------------------------------------
 
Restore ObjectData2
Read a.l
Read b.l
Read Pfad.s

Dim verts.IRR_VERT(a)
Dim indices.w(b*3)
 
Restore ObjectPoint2
For i=0 To a-1
  Read mx.f
  Read my.f
  Read mz.f
  Read tx.f
  Read ty.f
  vc.l = $00FFFFFF
  verts(i)\X = mx 
  verts(i)\Y = my  
  verts(i)\Z = mz 
  verts(i)\texture_x = tx  
  verts(i)\texture_y = ty 
  verts(i)\vcolor = vc
Next
  
Restore PointToTriangle2
For i=0 To (b*3)-1
  Read p.l
  indices(i)  = p
Next 
     
*explosion_mesh.irr_mesh = IrrCreateMesh( "TestMesh", a, @verts(0), b*3, @indices(0))
*explosionTexture.irr_texture = IrrGetTexture( Pfad.s )

NewList explosion_liste.NodeListe()

; ----------------------------------------------------------------------------------------

*welt_node.irr_node = IrrAddEmptySceneNode()

Repeat

; ----------------------------------------------------------------------------------------
      
      el.l=ElapsedMilliseconds()
      If fpst.l<el.l
        fpst.l=el.l+1000
        fpsl.l=fps.l
        fps.l=0
        alpha.f=(1000/fpsl)
      EndIf
      fps.l=fps.l+1

; ----------------------------------------------------------------------------------------
           
      If IrrRunning()=0
         en=1
      EndIf

; ----------------------------------------------------------------------------------------
             
      While IrrKeyEventAvailable()
          
          *KeyEvent.irr_key_event = IrrReadKeyEvent()
  
          Select *KeyEvent\key
          Case #IRR_KEY_ESCAPE
            en=1
          Case #IRR_KEY_F12
            en=2
          EndSelect
          
      Wend

; ----------------------------------------------------------------------------------------
      
      LeftMouseBotonHit.l=0
      RigtMouseBotonHit.l=0
      WheelHit.l=0
      
      While IrrMouseEventAvailable()
          
          *MouseEvent.irr_mouse_event = IrrReadMouseEvent()
          
          Select *MouseEvent\action 
          Case #IRR_EMIE_MOUSE_MOVED
            MouseSpeedX.l=MouseX.l-*MouseEvent\X
            MouseSpeedY.l=MouseY.l-*MouseEvent\Y
            MouseX.l= *MouseEvent\X
            MouseY.l= *MouseEvent\Y
          Case #IRR_EMIE_MOUSE_WHEEL
            WheelHit.l=*MouseEvent\wheel
          Case #IRR_EMIE_LMOUSE_PRESSED_DOWN
            LeftMouseBotonDown.l=1
            LeftMouseBotonHit.l=1
          Case #IRR_EMIE_LMOUSE_LEFT_UP
            LeftMouseBotonDown.l=0
          Case #IRR_EMIE_RMOUSE_PRESSED_DOWN
            RigtMouseBotonDown.l=1
            RigtMouseBotonHit.l=1
          Case #IRR_EMIE_RMOUSE_LEFT_UP
            RigtMouseBotonDown.l=0
          EndSelect
      
      Wend
; ----------------------------------------------------------------------------------------

      nx.f=((ScrX.l/2)-MouseX)/50.0
      ny.f=((ScrY.l/2)-MouseY)/-50.0
      IrrSetNodePosition(*welt_node,nx.f,ny.f,0)
      
; ----------------------------------------------------------------------------------------

      If StoneTimer.l<ElapsedMilliseconds()
        StoneTimer.l=ElapsedMilliseconds()+300
        AddElement(stone_liste())
        stone_liste()\node=IrrAddMeshToScene(*stone_mesh)
        stone_liste()\visible=0
        stone_liste()\ColRadius=1.0
        stone_liste()\live=10
        IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_LIGHTING, #IRR_Off )
        IrrSetNodeMaterialTexture( stone_liste()\node, *stonetexture, 0 )
        IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_BACK_FACE_CULLING, #IRR_On) 
        IrrSetNodeMaterialType( stone_liste()\node, #IRR_EMT_SOLID)
        
        x.f=(250-Random(500))/30
        y.f=(250-Random(500))/30
        
        IrrSetNodeID( stone_liste()\node,@stone_liste())
        IrrAddChildToParent(stone_liste()\node,*welt_node)
          
        IrrSetNodePosition(stone_liste()\node,x.f,y.f,80)
        stone_liste()\Move_animator=IrrAddFlyStraightAnimator(stone_liste()\node,x.f,y.f,40,x.f,y.f,-10,9000,0)
        IrrSetNodeScale(stone_liste()\node,0.01,0.01,0.01)
      EndIf
      
; ----------------------------------------------------------------------------------------
      
      If LeftMouseBotonDown.l=1
        If schuss_interval_timer.l<ElapsedMilliseconds()
          schuss_interval_timer.l=ElapsedMilliseconds()+100
          AddElement(schuss_liste())
          schuss_liste()\node=IrrAddMeshToScene(*schuss_mesh)
          schuss_liste()\visible=0
          schuss_liste()\ColRadius=0.05
          schuss_liste()\live=1
          IrrSetNodeMaterialFlag( schuss_liste()\node, #IRR_EMF_LIGHTING, #IRR_On )
          IrrSetNodeMaterialTexture( schuss_liste()\node, *CubeBlank, 0 )
          IrrSetNodeMaterialFlag( schuss_liste()\node, #IRR_EMF_BACK_FACE_CULLING, #IRR_Off) 
          IrrSetNodeMaterialType( schuss_liste()\node, #IRR_EMT_TRANSPARENT_ADD_COLOR)
          
          nx.f=((ScrX.l/2)-MouseX)/-50.0
          ny.f=(((ScrY.l/2)-MouseY)/50.0)-0.05
          nz.f=0.3
          
          IrrSetNodeID( schuss_liste()\node,@schuss_liste())
          IrrAddChildToParent(schuss_liste()\node,*welt_node)
          
          IrrSetNodePosition(schuss_liste()\node,nx.f,ny.f,0)
          schuss_liste()\Move_animator=IrrAddFlyStraightAnimator(schuss_liste()\node,nx.f,ny.f,nz.f,nx.f,ny.f,30,5000,0)
          schuss_liste()\Turn_animator=IrrAddRotationAnimator(schuss_liste()\node,0,0,10)
          IrrSetNodeScale(schuss_liste()\node,0.1,0.1,0.3)
        EndIf
      EndIf

; ----------------------------------------------------------------------------------------
       
      If WheelHit.l<>0
         IrrGetNodePosition(*Camera,@x.f,@y.f,@z.f) 
         IrrSetNodePosition(*Camera,x.f,y.f,z.f+(WheelHit.l/10.))
         IrrGetNodePosition(*Camera,@x.f,@y.f,@z.f)
         IrrSetCameraTarget(*Camera,x.f,y.f,z.f+1)
      EndIf

; ----------------------------------------------------------------------------------------
      
      IrrBeginScene(0, 0, 55 )  
      IrrDrawScene()
      IrrEndScene()
      
      Delay(1)
 
 ; ----------------------------------------------------------------------------------------
      
      ResetList(schuss_liste())
      ForEach schuss_liste()
        IrrGetNodePosition(schuss_liste()\node,@sx.f,@sy.f,@sz.f)
        If sz.f>20.0
          IrrRemoveAnimator(schuss_liste()\node,schuss_liste()\move_animator)
          IrrRemoveNode(schuss_liste()\node)
          DeleteElement(schuss_liste())
        Else
          If schuss_liste()\visible=0
            IrrSetNodeMaterialTexture( schuss_liste()\node, *SchussTexture, 0 )
            IrrSetNodeMaterialFlag( schuss_liste()\node, #IRR_EMF_LIGHTING, #IRR_Off )
            IrrSetNodeMaterialType( schuss_liste()\node, #IRR_EMT_TRANSPARENT_ADD_COLOR)
            schuss_liste()\visible=1
          Else
            
            ResetList(stone_liste())
            ForEach stone_liste()
              IrrGetNodePosition(stone_liste()\node,@cx.f,@cy.f,@cz.f)
 
              ex.f=Abs(cx.f-sx.f)
              ey.f=Abs(cy.f-sy.f)
              ez.f=Abs(cz.f-sz.f)
              c1.f=Sqr((ex.f*ex.f)+Sqr((ey.f*ey.f)+(ez.f*ez.f)))-stone_liste()\ColRadius-schuss_liste()\ColRadius
              If c1.f<=0
              
                IrrRemoveAnimator(schuss_liste()\node,schuss_liste()\move_animator)
                IrrRemoveNode(schuss_liste()\node)
                DeleteElement(schuss_liste())
   
                AddElement(explosion_liste())
                
                explosion_liste()\visible=-1
                               
                explosion_liste()\node=IrrAddMeshToScene(*explosion_mesh)
                
                IrrSetNodeScale(explosion_liste()\node,0.4,0.4,0.4)
               
                IrrSetNodeID( explosion_liste()\node,@explosion_liste())
                IrrAddChildToParent(explosion_liste()\node,*welt_node)
                
                ;--- Distanz merken
                explosion_liste()\parent = stone_liste()\node
                explosion_liste()\xd.f=(sx.f-cx.f)*1
                explosion_liste()\yd.f=(sy.f-cy.f)*1
                explosion_liste()\zd.f=(sz.f-cz.f)*1
                
                IrrSetNodePosition(explosion_liste()\node,sx.f,sy.f,sz.f)
                                                
                IrrSetNodeMaterialFlag( explosion_liste()\node, #IRR_EMF_LIGHTING, #IRR_On )
                IrrSetNodeMaterialTexture( explosion_liste()\node, *CubeBlank, 0 )
                IrrSetNodeMaterialFlag( explosion_liste()\node, #IRR_EMF_BACK_FACE_CULLING, #IRR_On) 
                IrrSetNodeMaterialType( explosion_liste()\node, #IRR_EMT_TRANSPARENT_ADD_COLOR)

                stone_liste()\live=stone_liste()\live-1
                
                Break
              EndIf 
            Next
           
          EndIf
        EndIf
        
      Next

      ResetList(stone_liste())
      ForEach stone_liste()
         IrrGetNodePosition(stone_liste()\node,@x.f,@y.f,@z.f)
         If z.f<-8 Or stone_liste()\live<=0
            IrrRemoveAnimator(stone_liste()\node,stone_liste()\move_animator)
            
            ;--- Perent von Explosion lösen
            ResetList(explosion_liste())
            ForEach explosion_liste()
              If explosion_liste()\parent=stone_liste()\node
                explosion_liste()\parent=0
              EndIf
            Next
            
            IrrRemoveNode(stone_liste()\node)
            DeleteElement(stone_liste())
         EndIf   
      Next 
      
; ----------------------------------------------------------------------------------------
     
      ;--- Animations Speed anpassen
      anim.f=0.001*alpha.f

      ResetList(explosion_liste())
      ForEach explosion_liste()
        If explosion_liste()\visible=0
          IrrSetNodeMaterialTexture( explosion_liste()\node, *explosionTexture, 0 )
          IrrSetNodeMaterialFlag( explosion_liste()\node, #IRR_EMF_LIGHTING, #IRR_Off )
          explosion_liste()\visible=1
        ElseIf explosion_liste()\visible=-1
          explosion_liste()\visible=0
        ElseIf explosion_liste()\visible=1
          IrrGetNodeScale(explosion_liste()\node,@x.f,@y.f,@z.f)
          If x.f<0.01
            IrrRemoveNode(explosion_liste()\node)
            DeleteElement(explosion_liste())
          Else
             IrrSetNodeScale(explosion_liste()\node,x.f-anim.f,y.f-anim.f,z.f-anim.f)
             ;--- Explosion/Parent bewegung
             If explosion_liste()\parent>0
                IrrGetNodePosition(explosion_liste()\parent,@sx.f,@sy.f,@sz.f)
                IrrSetNodePosition(explosion_liste()\node,sx.f+explosion_liste()\xd.f,sy.f+explosion_liste()\yd.f,sz.f+explosion_liste()\zd.f)
             EndIf
          EndIf
        EndIf
      Next

; ----------------------------------------------------------------------------------------
      
Until en>0

;--- Um das Goto innerhalb der Schleife zu entfernen
If en=2
  en=0
  ResetList(schuss_liste())
  ForEach schuss_liste()
    IrrRemoveAnimator(schuss_liste()\node,schuss_liste()\move_animator)
    IrrRemoveAnimator(schuss_liste()\node,schuss_liste()\turn_animator)
    IrrRemoveNode(schuss_liste()\node)
    DeleteElement(schuss_liste())
  Next
  ResetList(explosion_liste())
  ForEach explosion_liste()
    IrrRemoveNode(explosion_liste()\node)
    DeleteElement(explosion_liste())
  Next
    ResetList(stone_liste())
    ForEach stone_liste()
      If stone_liste()\move_animator
        IrrRemoveAnimator(stone_liste()\node,stone_liste()\move_animator)
      EndIf
      If stone_liste()\turn_animator
        IrrRemoveAnimator(stone_liste()\node,stone_liste()\turn_animator)
      EndIf
      IrrRemoveNode(stone_liste()\node)
      DeleteElement(stone_liste())
    Next
    IrrStop()
    Irr3DRequester(#IRR3DREQ_REQUESTER)
    Goto neustart
EndIf
IrrStop()
 
End 

; ----------------------------------------------------------------------------------------

DataSection

  Objectdata:
  ;; Anzahl Punkte,Anzahl Dreiecke, Texture
  Data.l 16,8
  Data.s "fire.bmp"
    
  ObjectPoint:
  ;; x,y,z,tex_x,tex_y,v_col
  Data.f -1 ,  0 , -1 ,  0 ,  0 
  Data.f -1 ,  0 ,  1 ,  0 ,  1 
  Data.f  1 ,  0 ,  1 ,  1 ,  1 
  Data.f  1 ,  0 , -1 ,  1 ,  0 
    
  Data.f -0.7 ,  0.7 , -1 ,  0 ,  0 
  Data.f -0.7 ,  0.7 ,  1 ,  0 ,  1 
  Data.f  0.7 , -0.7 ,  1 ,  1 ,  1 
  Data.f  0.7 , -0.7 , -1 ,  1 ,  0 
    
  Data.f  0 , -1 , -1 ,  0 ,  0 
  Data.f  0 , -1 ,  1 ,  0 ,  1 
  Data.f  0 ,  1 ,  1 ,  1 ,  1 
  Data.f  0 ,  1 , -1 ,  1 ,  0 
   
  Data.f -0.7 , -0.7 , -1 ,  0 ,  0 
  Data.f -0.7 , -0.7 ,  1 ,  0 ,  1 
  Data.f  0.7 ,  0.7 ,  1 ,  1 ,  1 
  Data.f  0.7 ,  0.7 , -1 ,  1 ,  0 
    
  PointToTriangle:
  ;; p0,p1,p2 , rechts herum
  Data.l 0,1,2
  Data.l 2,3,0
  Data.l 4,5,6
  Data.l 6,7,4
  Data.l 8,9,10
  Data.l 10,11,8
  Data.l 12,13,14
  Data.l 14,15,12
  
  Objectdata2:
  ;; Anzahl Punkte,Anzahl Dreiecke, Texture
  Data.l 12,6
  Data.s "spark.bmp"
    
  ObjectPoint2:
  ;; x,y,z,tex_x,tex_y,v_col
  Data.f -1 ,  0 , -1 ,  0 ,  0 
  Data.f -1 ,  0 ,  1 ,  0 ,  1 
  Data.f  1 ,  0 ,  1 ,  1 ,  1 
  Data.f  1 ,  0 , -1 ,  1 ,  0 
  
  Data.f -1 , -1 ,  0 ,  0 ,  0 
  Data.f -1 ,  1 ,  0 ,  0 ,  1 
  Data.f  1 ,  1 ,  0 ,  1 ,  1 
  Data.f  1 , -1 ,  0 ,  1 ,  0 
  
  Data.f  0 , -1 , -1 ,  0 ,  0 
  Data.f  0 , -1 ,  1 ,  0 ,  1 
  Data.f  0 ,  1 ,  1 ,  1 ,  1 
  Data.f  0 ,  1 , -1 ,  1 ,  0 
  
    
  PointToTriangle2:
  ;; p0,p1,p2 , rechts herum
  Data.l 0,1,2
  Data.l 2,3,0
  Data.l 4,5,6
  Data.l 6,7,4
  Data.l 8,9,10
  Data.l 10,11,8
  
EndDataSection 

TFT seid 1989 , Turgut Frank Temucin , CH-Dachsen/DE-Berlin/TR-Antalya
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung

PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler :-)
Benutzeravatar
tft
Beiträge: 650
Registriert: 08.09.2004 20:18
Computerausstattung: GFX 3060 Ti , i7 12700F , 32 GB Ram , 900 GB SSD , TV
Wohnort: Dachsen
Kontaktdaten:

Beitrag von tft »

Hallo ...

Das hat sich erledigt .......
Zuletzt geändert von tft am 08.01.2008 12:58, insgesamt 1-mal geändert.
TFT seid 1989 , Turgut Frank Temucin , CH-Dachsen/DE-Berlin/TR-Antalya
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung

PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler :-)
Benutzeravatar
tft
Beiträge: 650
Registriert: 08.09.2004 20:18
Computerausstattung: GFX 3060 Ti , i7 12700F , 32 GB Ram , 900 GB SSD , TV
Wohnort: Dachsen
Kontaktdaten:

Beitrag von tft »

Code: Alles auswählen

;
; -------------------------------------------------------------------------------
;
;   PureBasic - Irrlicht
;
;   Von 0 auf 100 (c) 2008 - TFT
;
;   Part 012
;
; -------------------------------------------------------------------------------
;
; In allen Parts sind die Komentare des vorherigen Parts gelöscht. Und der Code 
; soweit gerafft. Das die Übersichtlichkeit nicht all zu arg leidet. Die Neuen
; Code segmente sind mit ;--- gekenzeichnet. Das Procedure Fenster zeigt die
; entsprechenden Sprungmarken.
;
; Die Colisionsberechnung ist schon ein ziemlicher Pervormance Fresser. Aber darum kümmern
; wir uns später.
; Als nächsten werden wir uns einen einfachen Flieger bauen. Ich ´habe ihn mit DOGAL2
; gemacht. Ein tolles Tool. Damit kann man auf die schnelle fiele tolle Objecte Zaubern.
; 
; Dann kommt die test.bmp wider zum einsatz. Ein Ziehl Kreuts kommt uns gerade gelegen.
; Und dann wäre da noch das zersplittern der Steine. In 2 Stufen. Siet schon schau aus.
; Damit die Steine in ihre Masse nicht überhand nehmen, gibts einen Timer.
;
; Da mir das Ballern schon recht fiel Spass macht. Werde ich noch schnell einen Counter
; einarbeiten. Sowie das teil auf Zeit begrenzen. Und weil ich schon fast nicht mer
; aufhören kann ... es ist 3.23 ...... Kommen noch Bonus Time Bälle dazu.
;
; Ist schon recht gut gelungen. Aber fertig ist es noch lange nicht.

XIncludeFile "Irr3DRequester_mod.pb"
Irr3DRequester(#IRR3DREQ_SKIP)

; ----------------------------------------------------------------------------------------

Structure NodeListe

    *node.irr_node
    visible.l
    ColRadius.f
    live.l
    *Move_animator.irr_animator
    *Turn_animator.irr_animator
    *parent.l
    xd.f
    yd.f
    zd.f
    
    ;--- Masse
    mass.l
    time.l
       
EndStructure

; ----------------------------------------------------------------------------------------

neustart:

; ----------------------------------------------------------------------------------------

ScrX.l=irr3DRequesterSetting\videomode\dimension\width
ScrY.l=irr3DRequesterSetting\videomode\dimension\height
LeftMouseBotonDown.l=0
RigtMouseBotonDown.l=0


;--- RundenZeit
EndTimer.l=90000

; ----------------------------------------------------------------------------------------

*camera.irr_camera = IrrAddCamera( 0,0,0, 0,0,1 )

IrrSetCameraClipDistance(*Camera,10000)
IrrSetCameraNearValue(*Camera,0.1)

; ----------------------------------------------------------------------------------------

*BitmapFont = IrrGetFont ( "bitmapfont.bmp" )

; ----------------------------------------------------------------------------------------
 
NewList stone_liste.NodeListe()

*Stone_Mesh.irr_mesh = IrrGetMesh("stone1.ms3d")
*StoneTexture.irr_texture = IrrGetTexture("stone1.jpg")  
    
; ----------------------------------------------------------------------------------------
 
Restore ObjectData
Read a.l
Read b.l
Read Pfad.s

Dim verts.IRR_VERT(a)
Dim indices.w(b*3)
 
Restore ObjectPoint
For i=0 To a-1
  Read mx.f
  Read my.f
  Read mz.f
  Read tx.f
  Read ty.f
  vc.l = $00FFFFFF
  verts(i)\X = mx 
  verts(i)\Y = my  
  verts(i)\Z = mz 
  verts(i)\texture_x = tx  
  verts(i)\texture_y = ty 
  verts(i)\vcolor = vc
Next
  
Restore PointToTriangle
For i=0 To (b*3)-1
  Read p.l
  indices(i)  = p
Next 
     
*schuss_mesh.irr_mesh = IrrCreateMesh( "TestMesh", a, @verts(0), b*3, @indices(0))
*SchussTexture.irr_texture = IrrGetTexture( Pfad.s )

NewList schuss_liste.NodeListe()

; ----------------------------------------------------------------------------------------
 
Restore ObjectData2
Read a.l
Read b.l
Read Pfad.s

Dim verts.IRR_VERT(a)
Dim indices.w(b*3)
 
Restore ObjectPoint2
For i=0 To a-1
  Read mx.f
  Read my.f
  Read mz.f
  Read tx.f
  Read ty.f
  vc.l = $00FFFFFF
  verts(i)\X = mx 
  verts(i)\Y = my  
  verts(i)\Z = mz 
  verts(i)\texture_x = tx  
  verts(i)\texture_y = ty 
  verts(i)\vcolor = vc
Next
  
Restore PointToTriangle2
For i=0 To (b*3)-1
  Read p.l
  indices(i)  = p
Next 
     
*explosion_mesh.irr_mesh = IrrCreateMesh( "TestMesh", a, @verts(0), b*3, @indices(0))
*explosionTexture.irr_texture = IrrGetTexture( Pfad.s )

NewList explosion_liste.NodeListe()

; ----------------------------------------------------------------------------------------

*welt_node.irr_node = IrrAddEmptySceneNode()

; ----------------------------------------------------------------------------------------

;--- Ein flieger muss her
*flieger_mesh.irr_mesh=IrrGetMesh("ship.x") ; Object Scalierung bei DOGA 0.001
*flieger_node=IrrAddMeshToScene(*flieger_mesh)
IrrSetNodeScale(*flieger_node,0.1,0.1,0.1)
IrrSetNodeMaterialFlag( *flieger_node,#IRR_EMF_LIGHTING, #IRR_OFF )
IrrSetNodeMaterialFlag( *flieger_node, #IRR_EMF_BACK_FACE_CULLING, #IRR_OFF) 
IrrSetNodeRotation( *flieger_node,0,180,0)
IrrSetNodePosition( *flieger_node,0,-0.05,0.15)

;--- Ein Ziel kreutz wäre nicht schlecht
*cube.irr_node=IrrAddCubeSceneNode(0.02)
IrrSetNodeMaterialFlag( *cube,#IRR_EMF_LIGHTING, #IRR_OFF )
IrrSetNodeMaterialFlag( *cube, #IRR_EMF_BACK_FACE_CULLING, #IRR_On) 
IrrSetNodeMaterialType( *cube, #IRR_EMT_TRANSPARENT_ADD_COLOR)
IrrSetNodePosition( *cube,0,0,0.15)
*CubeTexture.irr_texture = IrrGetTexture( "test.bmp" )
*CubeBlank.irr_texture = IrrGetTexture( "blank.bmp" )
IrrSetNodeMaterialTexture( *cube, *CubeTexture, 0 )

; ----------------------------------------------------------------------------------------

;--- Init rundenTimer
Rtimer=ElapsedMilliseconds()+EndTimer.l

Repeat
; ----------------------------------------------------------------------------------------


; ----------------------------------------------------------------------------------------
      
      el.l=ElapsedMilliseconds()
      If fpst.l<el.l
        fpst.l=el.l+1000
        fpsl.l=fps.l
        fps.l=0
        alpha.f=(1000/fpsl)
      EndIf
      fps.l=fps.l+1

; ----------------------------------------------------------------------------------------
           
      If IrrRunning()=0
         en=1
      EndIf

; ----------------------------------------------------------------------------------------
             
      While IrrKeyEventAvailable()
          
          *KeyEvent.irr_key_event = IrrReadKeyEvent()
  
          Select *KeyEvent\key
          Case #IRR_KEY_ESCAPE
            en=1
          Case #IRR_KEY_F12
            en=2
          EndSelect
          
      Wend

; ----------------------------------------------------------------------------------------
      
      LeftMouseBotonHit.l=0
      RigtMouseBotonHit.l=0
      WheelHit.l=0
      
      While IrrMouseEventAvailable()
          
          *MouseEvent.irr_mouse_event = IrrReadMouseEvent()
          
          Select *MouseEvent\action 
          Case #IRR_EMIE_MOUSE_MOVED
            MouseSpeedX.l=MouseX.l-*MouseEvent\X
            MouseSpeedY.l=MouseY.l-*MouseEvent\Y
            MouseX.l= *MouseEvent\X
            MouseY.l= *MouseEvent\Y
          Case #IRR_EMIE_MOUSE_WHEEL
            WheelHit.l=*MouseEvent\wheel
          Case #IRR_EMIE_LMOUSE_PRESSED_DOWN
            LeftMouseBotonDown.l=1
            LeftMouseBotonHit.l=1
          Case #IRR_EMIE_LMOUSE_LEFT_UP
            LeftMouseBotonDown.l=0
          Case #IRR_EMIE_RMOUSE_PRESSED_DOWN
            RigtMouseBotonDown.l=1
            RigtMouseBotonHit.l=1
          Case #IRR_EMIE_RMOUSE_LEFT_UP
            RigtMouseBotonDown.l=0
          EndSelect
      
      Wend
; ----------------------------------------------------------------------------------------

      nx.f=((ScrX.l/2)-MouseX)/50.0
      ny.f=((ScrY.l/2)-MouseY)/-50.0
      IrrSetNodePosition(*welt_node,nx.f,ny.f,0)
      
; ----------------------------------------------------------------------------------------

      If StoneTimer.l<ElapsedMilliseconds()
        StoneTimer.l=ElapsedMilliseconds()+300
        AddElement(stone_liste())
        stone_liste()\node=IrrAddMeshToScene(*stone_mesh)
        stone_liste()\visible=0
        stone_liste()\ColRadius=1.0
        stone_liste()\live=10
        stone_liste()\mass=5
        stone_liste()\time=-1
        IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_LIGHTING, #IRR_Off )
        IrrSetNodeMaterialTexture( stone_liste()\node, *stonetexture, 0 )
        IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_BACK_FACE_CULLING, #IRR_On) 
        IrrSetNodeMaterialType( stone_liste()\node, #IRR_EMT_SOLID)
        
        x.f=(250-Random(500))/30
        y.f=(250-Random(500))/30
        
        IrrSetNodeID( stone_liste()\node,@stone_liste())
        IrrAddChildToParent(stone_liste()\node,*welt_node)
          
        IrrSetNodePosition(stone_liste()\node,x.f,y.f,80)
        stone_liste()\Move_animator=IrrAddFlyStraightAnimator(stone_liste()\node,x.f,y.f,40,x.f,y.f,-10,9000,0)
        IrrSetNodeScale(stone_liste()\node,0.01,0.01,0.01)
      EndIf
      
; ----------------------------------------------------------------------------------------
      
      If LeftMouseBotonDown.l=1
        If schuss_interval_timer.l<ElapsedMilliseconds()
          schuss_interval_timer.l=ElapsedMilliseconds()+100
          AddElement(schuss_liste())
          schuss_liste()\node=IrrAddMeshToScene(*schuss_mesh)
          schuss_liste()\visible=0
          schuss_liste()\ColRadius=0.05
          schuss_liste()\live=1
          schuss_liste()\mass=1
          schuss_liste()\time=-1
          IrrSetNodeMaterialFlag( schuss_liste()\node, #IRR_EMF_LIGHTING, #IRR_On )
          IrrSetNodeMaterialTexture( schuss_liste()\node, *CubeBlank, 0 )
          IrrSetNodeMaterialFlag( schuss_liste()\node, #IRR_EMF_BACK_FACE_CULLING, #IRR_Off) 
          IrrSetNodeMaterialType( schuss_liste()\node, #IRR_EMT_TRANSPARENT_ADD_COLOR)
          
          nx.f=((ScrX.l/2)-MouseX)/-50.0
          ny.f=(((ScrY.l/2)-MouseY)/50.0)-0.05
          nz.f=0.4
          
          IrrSetNodeID( schuss_liste()\node,@schuss_liste())
          IrrAddChildToParent(schuss_liste()\node,*welt_node)
          
          IrrSetNodePosition(schuss_liste()\node,nx.f,ny.f,0.2)
          schuss_liste()\Move_animator=IrrAddFlyStraightAnimator(schuss_liste()\node,nx.f,ny.f,nz.f,nx.f,ny.f,30,5000,0)
          schuss_liste()\Turn_animator=IrrAddRotationAnimator(schuss_liste()\node,0,0,10)
          IrrSetNodeScale(schuss_liste()\node,0.1,0.1,0.3)
        EndIf
      EndIf

; ----------------------------------------------------------------------------------------
      
      IrrBeginScene(0, 0, 55 )  
      IrrDrawScene()
      
      ;-- Counter
      Irr2DFontDraw ( *BitmapFont,"Punkte = "+Str(counter.l),4,4,0,0)
      Irr2DFontDraw ( *BitmapFont,"Timer = "+Str((rtimer-el)/1000),4,40,0,0)
      
      IrrEndScene()
      
      Delay(1)
 
 ; ----------------------------------------------------------------------------------------
      
      ResetList(schuss_liste())
      ForEach schuss_liste()
        IrrGetNodePosition(schuss_liste()\node,@sx.f,@sy.f,@sz.f)
        If sz.f>20.0
          IrrRemoveAnimator(schuss_liste()\node,schuss_liste()\move_animator)
          IrrRemoveNode(schuss_liste()\node)
          DeleteElement(schuss_liste())
        Else
          If schuss_liste()\visible=0
            IrrSetNodeMaterialTexture( schuss_liste()\node, *SchussTexture, 0 )
            IrrSetNodeMaterialFlag( schuss_liste()\node, #IRR_EMF_LIGHTING, #IRR_Off )
            IrrSetNodeMaterialType( schuss_liste()\node, #IRR_EMT_TRANSPARENT_ADD_COLOR)
            schuss_liste()\visible=1
          Else
            
            ResetList(stone_liste())
            ForEach stone_liste()
              IrrGetNodePosition(stone_liste()\node,@cx.f,@cy.f,@cz.f)
 
              ex.f=Abs(cx.f-sx.f)
              ey.f=Abs(cy.f-sy.f)
              ez.f=Abs(cz.f-sz.f)
              c1.f=Sqr((ex.f*ex.f)+Sqr((ey.f*ey.f)+(ez.f*ez.f)))-stone_liste()\ColRadius-schuss_liste()\ColRadius
              If c1.f<=0
              
                IrrRemoveAnimator(schuss_liste()\node,schuss_liste()\move_animator)
                IrrRemoveNode(schuss_liste()\node)
                DeleteElement(schuss_liste())
   
                AddElement(explosion_liste())
                explosion_liste()\visible=-1
                explosion_liste()\node=IrrAddMeshToScene(*explosion_mesh)
                IrrSetNodeScale(explosion_liste()\node,0.4,0.4,0.4)
               
                IrrSetNodeID( explosion_liste()\node,@explosion_liste())
                IrrAddChildToParent(explosion_liste()\node,*welt_node)

                explosion_liste()\parent = stone_liste()\node
                explosion_liste()\xd.f=(sx.f-cx.f)*1
                explosion_liste()\yd.f=(sy.f-cy.f)*1
                explosion_liste()\zd.f=(sz.f-cz.f)*1
                
                IrrSetNodePosition(explosion_liste()\node,sx.f,sy.f,sz.f)
                                                
                IrrSetNodeMaterialFlag( explosion_liste()\node, #IRR_EMF_LIGHTING, #IRR_On )
                IrrSetNodeMaterialTexture( explosion_liste()\node, *CubeBlank, 0 )
                IrrSetNodeMaterialFlag( explosion_liste()\node, #IRR_EMF_BACK_FACE_CULLING, #IRR_On) 
                IrrSetNodeMaterialType( explosion_liste()\node, #IRR_EMT_TRANSPARENT_ADD_COLOR)

                stone_liste()\live=stone_liste()\live-1
                
                Break
              EndIf 
            Next
           
          EndIf
        EndIf
        
      Next
      
      addexplosion.l=0
      addexplosionmass.l=0
      
      ResetList(stone_liste())
      ForEach stone_liste()
         IrrGetNodePosition(stone_liste()\node,@x.f,@y.f,@z.f)
         If z.f<-8 Or stone_liste()\live<=0 Or (stone_liste()\time>0 And stone_liste()\time<ElapsedMilliseconds())
            ;--- Animatoren Löschen wenn vorhanden
            If stone_liste()\move_animator
              IrrRemoveAnimator(stone_liste()\node,stone_liste()\move_animator)
            EndIf
            If stone_liste()\turn_animator
              IrrRemoveAnimator(stone_liste()\node,stone_liste()\turn_animator)
            EndIf
            ;--- Erweiterte Explosion einleiten
            If  stone_liste()\live<=0 And stone_liste()\mass>0
              addexplosion.l=1
              addexplosionmass.l=stone_liste()\mass
              IrrGetNodePosition(stone_liste()\node,@sx.f,@sy.f,@sz.f)
            EndIf
            
            ResetList(explosion_liste())
            ForEach explosion_liste()
              If explosion_liste()\parent=stone_liste()\node
                explosion_liste()\parent=0
              EndIf
            Next
            
            IrrRemoveNode(stone_liste()\node)
            DeleteElement(stone_liste())
            
         EndIf   
      Next 
      
      ;--- Steine Aufsplittern
      If addexplosion.l>0
            If addexplosionmass.l>2
              ;--- Punkte für Grosse brocken.
              counter.l=counter.l+10
              For i=0 To 8
                AddElement(stone_liste())
                stone_liste()\node=IrrAddMeshToScene(*stone_mesh)
                stone_liste()\visible=0
                stone_liste()\ColRadius=0.5
                stone_liste()\live=1
                stone_liste()\mass=2
                stone_liste()\time=10000+ElapsedMilliseconds()
                
                IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_LIGHTING, #IRR_Off )
                IrrSetNodeMaterialTexture( stone_liste()\node, *stonetexture, 0 )
                IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_BACK_FACE_CULLING, #IRR_On) 
                IrrSetNodeMaterialType( stone_liste()\node, #IRR_EMT_SOLID)
                
                IrrSetNodeID( stone_liste()\node,@stone_liste())
                IrrAddChildToParent(stone_liste()\node,*welt_node)
                
                x.f=(100-Random(200))
                y.f=(100-Random(200))
                z.f=(100-Random(200))
                
                IrrSetNodePosition(stone_liste()\node,sx.f,sy.f,sz.f)
                stone_liste()\Move_animator=IrrAddFlyStraightAnimator(stone_liste()\node,sx.f,sy.f,sz.f,sx.f+x.f,sy.f+y.f,sz.f+z.f,30000,0)
                IrrSetNodeScale(stone_liste()\node,0.0025,0.0025,0.0025)  
              Next
            Else
              ;--- Punkte für kleine Brocken.
              counter.l=counter.l+100
              
              ;--- Time Bonus
              If addexplosionmass.l=1
                Rtimer.l=Rtimer.l+5000
              EndIf
              
            EndIf
            
            For i=0 To 8
              AddElement(stone_liste())
              stone_liste()\node=IrrAddMeshToScene(*stone_mesh)
              stone_liste()\visible=0
              stone_liste()\ColRadius=0.05
              stone_liste()\live=1
              stone_liste()\mass=0
              stone_liste()\time=5000+ElapsedMilliseconds()
              IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_LIGHTING, #IRR_Off )
              IrrSetNodeMaterialTexture( stone_liste()\node, *stonetexture, 0 )
              IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_BACK_FACE_CULLING, #IRR_On) 
              IrrSetNodeMaterialType( stone_liste()\node, #IRR_EMT_SOLID)
              
              IrrSetNodeID( stone_liste()\node,@stone_liste())
              IrrAddChildToParent(stone_liste()\node,*welt_node)
              
              x.f=(100-Random(200))
              y.f=(100-Random(200))
              z.f=(100-Random(200))
              
              IrrSetNodePosition(stone_liste()\node,sx.f,sy.f,sz.f)
              stone_liste()\Move_animator=IrrAddFlyStraightAnimator(stone_liste()\node,sx.f,sy.f,sz.f,sx.f+x.f,sy.f+y.f,sz.f+z.f,15000,0)
              IrrSetNodeScale(stone_liste()\node,0.0005,0.0005,0.0005)  
            Next
            
            If Random(1)=1
                
                AddElement(stone_liste())
                stone_liste()\node=IrrAddMeshToScene(*explosion_mesh)
                stone_liste()\visible=0
                stone_liste()\ColRadius=0.5
                stone_liste()\live=1
                stone_liste()\mass=1
                stone_liste()\time=8000+ElapsedMilliseconds()               
                IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_LIGHTING, #IRR_Off )
                IrrSetNodeMaterialTexture( stone_liste()\node, *CubeTexture, 0 )
                IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_BACK_FACE_CULLING, #IRR_Off) 
                IrrSetNodeMaterialType( stone_liste()\node, #IRR_EMT_TRANSPARENT_ADD_COLOR)
                
                IrrSetNodeID( stone_liste()\node,@stone_liste())
                IrrAddChildToParent(stone_liste()\node,*welt_node)
                
                x.f=(100-Random(200))
                y.f=(100-Random(200))
                z.f=(100-Random(200))
                
                IrrSetNodePosition(stone_liste()\node,sx.f,sy.f,sz.f)
                stone_liste()\Move_animator=IrrAddFlyStraightAnimator(stone_liste()\node,sx.f,sy.f,sz.f,sx.f+x.f,sy.f+y.f,sz.f+z.f,45000,0)
                stone_liste()\Turn_animator=IrrAddRotationAnimator(stone_liste()\node,0.3,0.5,0.9)
 
                IrrSetNodeScale(stone_liste()\node,0.4,0.4,0.4)
                  
            EndIf
      EndIf
      
; ----------------------------------------------------------------------------------------

      anim.f=0.001*alpha.f

      ResetList(explosion_liste())
      ForEach explosion_liste()
        If explosion_liste()\visible=0
          IrrSetNodeMaterialTexture( explosion_liste()\node, *explosionTexture, 0 )
          IrrSetNodeMaterialFlag( explosion_liste()\node, #IRR_EMF_LIGHTING, #IRR_Off )
          explosion_liste()\visible=1
        ElseIf explosion_liste()\visible=-1
          explosion_liste()\visible=0
        ElseIf explosion_liste()\visible=1
          IrrGetNodeScale(explosion_liste()\node,@x.f,@y.f,@z.f)
          If x.f<0.01
            IrrRemoveNode(explosion_liste()\node)
            DeleteElement(explosion_liste())
          Else
             IrrSetNodeScale(explosion_liste()\node,x.f-anim.f,y.f-anim.f,z.f-anim.f)
             If explosion_liste()\parent>0
                IrrGetNodePosition(explosion_liste()\parent,@sx.f,@sy.f,@sz.f)
                IrrSetNodePosition(explosion_liste()\node,sx.f+explosion_liste()\xd.f,sy.f+explosion_liste()\yd.f,sz.f+explosion_liste()\zd.f)
             EndIf
          EndIf
        EndIf
      Next

; ----------------------------------------------------------------------------------------
      
      ;--- Automatisches Restart
      
      If Rtimer=< ElapsedMilliseconds()
            ResetList(schuss_liste())
            ForEach schuss_liste()
              IrrRemoveAnimator(schuss_liste()\node,schuss_liste()\move_animator)
              IrrRemoveAnimator(schuss_liste()\node,schuss_liste()\turn_animator)
              IrrRemoveNode(schuss_liste()\node)
              DeleteElement(schuss_liste())
            Next
            ResetList(explosion_liste())
            ForEach explosion_liste()
              IrrRemoveNode(explosion_liste()\node)
              DeleteElement(explosion_liste())
            Next
            ResetList(stone_liste())
            ForEach stone_liste()
              If stone_liste()\move_animator
                IrrRemoveAnimator(stone_liste()\node,stone_liste()\move_animator)
              EndIf
              If stone_liste()\turn_animator
                IrrRemoveAnimator(stone_liste()\node,stone_liste()\turn_animator)
              EndIf
              IrrRemoveNode(stone_liste()\node)
              DeleteElement(stone_liste())
            Next
            en=3
      EndIf
 
Until en>0

If en=2
  en=0
  ResetList(schuss_liste())
  ForEach schuss_liste()
    IrrRemoveAnimator(schuss_liste()\node,schuss_liste()\move_animator)
    IrrRemoveAnimator(schuss_liste()\node,schuss_liste()\turn_animator)
    IrrRemoveNode(schuss_liste()\node)
    DeleteElement(schuss_liste())
  Next
  ResetList(explosion_liste())
  ForEach explosion_liste()
    IrrRemoveNode(explosion_liste()\node)
    DeleteElement(explosion_liste())
  Next
    ResetList(stone_liste())
    ForEach stone_liste()
      If stone_liste()\move_animator
        IrrRemoveAnimator(stone_liste()\node,stone_liste()\move_animator)
      EndIf
      If stone_liste()\turn_animator
        IrrRemoveAnimator(stone_liste()\node,stone_liste()\turn_animator)
      EndIf
      IrrRemoveNode(stone_liste()\node)
      DeleteElement(stone_liste())
    Next
    IrrStop()
    Irr3DRequester(#IRR3DREQ_REQUESTER)
    Goto neustart

ElseIf en=3

    en=0
        
    Rtimer=ElapsedMilliseconds()+3000
        
    Repeat
            
          ;--- !!! Falle 9 !!! 
          ;
          ; Aus einem mir noch nicht bekannten Grund functioniert
          ; hir die Tastatur Abfrage nicht mer. Obwohl sie weiter oben
          ; sehr wohl ihren dienst verrichtet. Ich habe einiges
          ; Versucht. Aber jetzt muss ich erst mal einen anderen Weg
          ; beschreiten.
               
          ;While IrrKeyEventAvailable()
                  
          ;    *KeyEvent.irr_key_event = IrrReadKeyEvent()
        
          ;   Select *KeyEvent\key
          ;   Case #IRR_KEY_ESCAPE
          ;     en=2
          ;   EndSelect
             
          ;Wend
            
            
          IrrBeginScene(0, 0, 55 )  
          IrrDrawScene()
              
          Irr2DFontDraw ( *BitmapFont,"Punkte = "+Str(counter.l),4,4,0,0)
          Irr2DFontDraw ( *BitmapFont,"GameOver ",4,80,0,0)
           
          IrrEndScene()
            
             
        Delay(10)
     
        If Rtimer=< ElapsedMilliseconds()
          en=2
        EndIf
             
    Until en=2 
EndIf


IrrStop()
 
End 

; ----------------------------------------------------------------------------------------

DataSection

  Objectdata:
  ;; Anzahl Punkte,Anzahl Dreiecke, Texture
  Data.l 16,8
  Data.s "fire.bmp"
    
  ObjectPoint:
  ;; x,y,z,tex_x,tex_y,v_col
  Data.f -1 ,  0 , -1 ,  0 ,  0 
  Data.f -1 ,  0 ,  1 ,  0 ,  1 
  Data.f  1 ,  0 ,  1 ,  1 ,  1 
  Data.f  1 ,  0 , -1 ,  1 ,  0 
    
  Data.f -0.7 ,  0.7 , -1 ,  0 ,  0 
  Data.f -0.7 ,  0.7 ,  1 ,  0 ,  1 
  Data.f  0.7 , -0.7 ,  1 ,  1 ,  1 
  Data.f  0.7 , -0.7 , -1 ,  1 ,  0 
    
  Data.f  0 , -1 , -1 ,  0 ,  0 
  Data.f  0 , -1 ,  1 ,  0 ,  1 
  Data.f  0 ,  1 ,  1 ,  1 ,  1 
  Data.f  0 ,  1 , -1 ,  1 ,  0 
   
  Data.f -0.7 , -0.7 , -1 ,  0 ,  0 
  Data.f -0.7 , -0.7 ,  1 ,  0 ,  1 
  Data.f  0.7 ,  0.7 ,  1 ,  1 ,  1 
  Data.f  0.7 ,  0.7 , -1 ,  1 ,  0 
    
  PointToTriangle:
  ;; p0,p1,p2 , rechts herum
  Data.l 0,1,2
  Data.l 2,3,0
  Data.l 4,5,6
  Data.l 6,7,4
  Data.l 8,9,10
  Data.l 10,11,8
  Data.l 12,13,14
  Data.l 14,15,12
  
  Objectdata2:
  ;; Anzahl Punkte,Anzahl Dreiecke, Texture
  Data.l 12,6
  Data.s "spark.bmp"
    
  ObjectPoint2:
  ;; x,y,z,tex_x,tex_y,v_col
  Data.f -1 ,  0 , -1 ,  0 ,  0 
  Data.f -1 ,  0 ,  1 ,  0 ,  1 
  Data.f  1 ,  0 ,  1 ,  1 ,  1 
  Data.f  1 ,  0 , -1 ,  1 ,  0 
  
  Data.f -1 , -1 ,  0 ,  0 ,  0 
  Data.f -1 ,  1 ,  0 ,  0 ,  1 
  Data.f  1 ,  1 ,  0 ,  1 ,  1 
  Data.f  1 , -1 ,  0 ,  1 ,  0 
  
  Data.f  0 , -1 , -1 ,  0 ,  0 
  Data.f  0 , -1 ,  1 ,  0 ,  1 
  Data.f  0 ,  1 ,  1 ,  1 ,  1 
  Data.f  0 ,  1 , -1 ,  1 ,  0 
  
    
  PointToTriangle2:
  ;; p0,p1,p2 , rechts herum
  Data.l 0,1,2
  Data.l 2,3,0
  Data.l 4,5,6
  Data.l 6,7,4
  Data.l 8,9,10
  Data.l 10,11,8
  
EndDataSection 





TFT seid 1989 , Turgut Frank Temucin , CH-Dachsen/DE-Berlin/TR-Antalya
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung

PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler :-)
Benutzeravatar
tft
Beiträge: 650
Registriert: 08.09.2004 20:18
Computerausstattung: GFX 3060 Ti , i7 12700F , 32 GB Ram , 900 GB SSD , TV
Wohnort: Dachsen
Kontaktdaten:

Beitrag von tft »

Code: Alles auswählen

;
; -------------------------------------------------------------------------------
;
;   PureBasic - Irrlicht
;
;   Von 0 auf 100 (c) 2008 - TFT
;
;   Part 013
;
; -------------------------------------------------------------------------------
;
; In allen Parts sind die Komentare des vorherigen Parts gelöscht. Und der Code 
; soweit gerafft. Das die Übersichtlichkeit nicht all zu arg leidet. Die neuen
; Code Segmente sind mit ;--- gekenzeichnet. Das Procedure Fenster zeigt die
; entsprechenden Sprungmarken.
;
; Da diese Tutorial sich ja um die IrrlichtWrapper dreht. Werden wir nun mal
; einen neuen Befehl versuchen. Die SkyBox. Das problem dabei ist aber, das wir
; nicht wirklich eine brauchen. Aber einen coolen hintergrund..... das wäre nicht
; schlecht. Wir werden daher die SkyBox verwenden um automatisch einen Hintergrund
; Darstellen zu lassen. Um den wir uns dann nicht weiter kümmern müssen.
;
; Um die Zeitbonie nicht unendlich lange fortlaufen zu lassen. Werden wir dies
; begrenzen.
;
; !!! Die SkyBox ist noch nicht WideScreen tauglich .

XIncludeFile "Irr3DRequester_mod.pb"
Irr3DRequester(#IRR3DREQ_SKIP)

; ----------------------------------------------------------------------------------------

Structure NodeListe

    *node.irr_node
    visible.l
    ColRadius.f
    live.l
    *Move_animator.irr_animator
    *Turn_animator.irr_animator
    *parent.l
    xd.f
    yd.f
    zd.f
    mass.l
    time.l
       
EndStructure

; ----------------------------------------------------------------------------------------

neustart:

; ----------------------------------------------------------------------------------------

ScrX.l=irr3DRequesterSetting\videomode\dimension\width
ScrY.l=irr3DRequesterSetting\videomode\dimension\height
LeftMouseBotonDown.l=0
RigtMouseBotonDown.l=0

EndTimer.l=90000

; ----------------------------------------------------------------------------------------

*camera.irr_camera = IrrAddCamera( 0,0,0, 0,0,1 )

IrrSetCameraClipDistance(*Camera,10000)
IrrSetCameraNearValue(*Camera,0.1)

; ----------------------------------------------------------------------------------------

*BitmapFont = IrrGetFont ( "bitmapfont.bmp" )

; ----------------------------------------------------------------------------------------
 
NewList stone_liste.NodeListe()

*Stone_Mesh.irr_mesh = IrrGetMesh("stone1.ms3d")
*StoneTexture.irr_texture = IrrGetTexture("stone1.jpg")  
    
; ----------------------------------------------------------------------------------------
 
Restore ObjectData
Read a.l
Read b.l
Read Pfad.s

Dim verts.IRR_VERT(a)
Dim indices.w(b*3)
 
Restore ObjectPoint
For i=0 To a-1
  Read mx.f
  Read my.f
  Read mz.f
  Read tx.f
  Read ty.f
  vc.l = $00FFFFFF
  verts(i)\X = mx 
  verts(i)\Y = my  
  verts(i)\Z = mz 
  verts(i)\texture_x = tx  
  verts(i)\texture_y = ty 
  verts(i)\vcolor = vc
Next
  
Restore PointToTriangle
For i=0 To (b*3)-1
  Read p.l
  indices(i)  = p
Next 
     
*schuss_mesh.irr_mesh = IrrCreateMesh( "TestMesh", a, @verts(0), b*3, @indices(0))
*SchussTexture.irr_texture = IrrGetTexture( Pfad.s )

NewList schuss_liste.NodeListe()

; ----------------------------------------------------------------------------------------
 
Restore ObjectData2
Read a.l
Read b.l
Read Pfad.s

Dim verts.IRR_VERT(a)
Dim indices.w(b*3)
 
Restore ObjectPoint2
For i=0 To a-1
  Read mx.f
  Read my.f
  Read mz.f
  Read tx.f
  Read ty.f
  vc.l = $00FFFFFF
  verts(i)\X = mx 
  verts(i)\Y = my  
  verts(i)\Z = mz 
  verts(i)\texture_x = tx  
  verts(i)\texture_y = ty 
  verts(i)\vcolor = vc
Next
  
Restore PointToTriangle2
For i=0 To (b*3)-1
  Read p.l
  indices(i)  = p
Next 
     
*explosion_mesh.irr_mesh = IrrCreateMesh( "TestMesh", a, @verts(0), b*3, @indices(0))
*explosionTexture.irr_texture = IrrGetTexture( Pfad.s )

NewList explosion_liste.NodeListe()

; ----------------------------------------------------------------------------------------

*welt_node.irr_node = IrrAddEmptySceneNode()

; ----------------------------------------------------------------------------------------


*flieger_mesh.irr_mesh=IrrGetMesh("ship.x") ; Object Scalierung bei DOGA 0.001
*flieger_node=IrrAddMeshToScene(*flieger_mesh)
IrrSetNodeScale(*flieger_node,0.1,0.1,0.1)
IrrSetNodeMaterialFlag( *flieger_node,#IRR_EMF_LIGHTING, #IRR_OFF )
IrrSetNodeMaterialFlag( *flieger_node, #IRR_EMF_BACK_FACE_CULLING, #IRR_OFF) 
IrrSetNodeRotation( *flieger_node,0,180,0)
IrrSetNodePosition( *flieger_node,0,-0.05,0.15)


*cube.irr_node=IrrAddCubeSceneNode(0.02)
IrrSetNodeMaterialFlag( *cube,#IRR_EMF_LIGHTING, #IRR_OFF )
IrrSetNodeMaterialFlag( *cube, #IRR_EMF_BACK_FACE_CULLING, #IRR_On) 
IrrSetNodeMaterialType( *cube, #IRR_EMT_TRANSPARENT_ADD_COLOR)
IrrSetNodePosition( *cube,0,0,0.15)
*CubeTexture.irr_texture = IrrGetTexture( "test.bmp" )
*CubeBlank.irr_texture = IrrGetTexture( "blank.bmp" )
IrrSetNodeMaterialTexture( *cube, *CubeTexture, 0 )

; ----------------------------------------------------------------------------------------

Rtimer=ElapsedMilliseconds()+EndTimer.l

; ----------------------------------------------------------------------------------------

;--- Add SkyBox
;
; normalerweise besteht eine SkyBox aus einem Cube wo die Vertics (Punkte eines Dreieks)
; so angeordnet sind. Das flächen nur von innen gesehen werden können. (Rechtsherum) Genauer
; werde ich hir nicht weiter drauf eingehen. Jedenfals benötigen wir ja keine vollständige
; SkyBox. Daher benutzen wir erstmal auch nur eine TExture. Eigentlich benötigen wir dazu kein
; Array. Aber da für gewönlich eins benutz wird. Werden wir was nicht gebraucht wird ausklammern.

;Dim *textures.irr_texture(6)
;*textures(0) = IrrGetTexture("ba-left.jpg")
;*textures(1) = IrrGetTexture("ba-left.jpg")
;*textures(2) = IrrGetTexture("ba-left.jpg")
;*textures(3) = IrrGetTexture("ba-left.jpg")
;*textures(4) = IrrGetTexture("ba-left.jpg")
;*textures(5) = IrrGetTexture("ba-left.jpg")

;*SkyBox = IrrAddSkyBoxToScene( *textures(0),*textures(1),*textures(2),*textures(3),*textures(4),*textures(5))

; Wir benötigen das alles aber nicht. Daher eine andere Variante. Verwenden werden wir
; für die nicht sichtbaren Seiten. Die Texture die wir auch schon für das vertecken der
; Nodes bei erzeugung verwendet haben.

*SkyTexture.irr_texture = IrrGetTexture("ba-left.jpg")
*SkyBox = IrrAddSkyBoxToScene( *CubeBlank,*CubeBlank,*CubeBlank,*CubeBlank,*CubeBlank,*SkyTexture)
  
Repeat
 
      If Rtimer<=ElapsedMilliseconds()
        en=3
      EndIf
 ; ----------------------------------------------------------------------------------------

      el.l=ElapsedMilliseconds()
      If fpst.l<el.l
        fpst.l=el.l+1000
        fpsl.l=fps.l
        fps.l=0
        alpha.f=(1000/fpsl)
      EndIf
      fps.l=fps.l+1

; ----------------------------------------------------------------------------------------
           
      If IrrRunning()=0
         en=1
      EndIf

; ----------------------------------------------------------------------------------------
             
      While IrrKeyEventAvailable()
          
          *KeyEvent.irr_key_event = IrrReadKeyEvent()
  
          Select *KeyEvent\key
          Case #IRR_KEY_ESCAPE
            en=1
          Case #IRR_KEY_F12
            ;--- Änderung um das Goto zu entfernen
            en=2
          EndSelect
          
      Wend

; ----------------------------------------------------------------------------------------
      
      LeftMouseBotonHit.l=0
      RigtMouseBotonHit.l=0
      WheelHit.l=0
      
      While IrrMouseEventAvailable()
          
          *MouseEvent.irr_mouse_event = IrrReadMouseEvent()
          
          Select *MouseEvent\action 
          Case #IRR_EMIE_MOUSE_MOVED
            MouseSpeedX.l=MouseX.l-*MouseEvent\X
            MouseSpeedY.l=MouseY.l-*MouseEvent\Y
            MouseX.l= *MouseEvent\X
            MouseY.l= *MouseEvent\Y
          Case #IRR_EMIE_MOUSE_WHEEL
            WheelHit.l=*MouseEvent\wheel
          Case #IRR_EMIE_LMOUSE_PRESSED_DOWN
            LeftMouseBotonDown.l=1
            LeftMouseBotonHit.l=1
          Case #IRR_EMIE_LMOUSE_LEFT_UP
            LeftMouseBotonDown.l=0
          Case #IRR_EMIE_RMOUSE_PRESSED_DOWN
            RigtMouseBotonDown.l=1
            RigtMouseBotonHit.l=1
          Case #IRR_EMIE_RMOUSE_LEFT_UP
            RigtMouseBotonDown.l=0
          EndSelect
      
      Wend
; ----------------------------------------------------------------------------------------

      nx.f=((ScrX.l/2)-MouseX)/50.0
      ny.f=((ScrY.l/2)-MouseY)/-50.0
      IrrSetNodePosition(*welt_node,nx.f,ny.f,0)
      
; ----------------------------------------------------------------------------------------

      If StoneTimer.l<ElapsedMilliseconds()
        StoneTimer.l=ElapsedMilliseconds()+300
        AddElement(stone_liste())
        stone_liste()\node=IrrAddMeshToScene(*stone_mesh)
        stone_liste()\visible=0
        stone_liste()\ColRadius=1.0
        stone_liste()\live=10
        stone_liste()\mass=5
        stone_liste()\time=-1
        IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_LIGHTING, #IRR_Off )
        IrrSetNodeMaterialTexture( stone_liste()\node, *stonetexture, 0 )
        IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_BACK_FACE_CULLING, #IRR_On) 
        IrrSetNodeMaterialType( stone_liste()\node, #IRR_EMT_SOLID)
        
        x.f=(250-Random(500))/30
        y.f=(250-Random(500))/30
        
        IrrSetNodeID( stone_liste()\node,@stone_liste())
        IrrAddChildToParent(stone_liste()\node,*welt_node)
          
        IrrSetNodePosition(stone_liste()\node,x.f,y.f,80)
        stone_liste()\Move_animator=IrrAddFlyStraightAnimator(stone_liste()\node,x.f,y.f,40,x.f,y.f,-10,9000,0)
        IrrSetNodeScale(stone_liste()\node,0.01,0.01,0.01)
      EndIf
      
; ----------------------------------------------------------------------------------------
      
      If LeftMouseBotonDown.l=1
        If schuss_interval_timer.l<ElapsedMilliseconds()
          schuss_interval_timer.l=ElapsedMilliseconds()+100
          AddElement(schuss_liste())
          schuss_liste()\node=IrrAddMeshToScene(*schuss_mesh)
          schuss_liste()\visible=0
          schuss_liste()\ColRadius=0.05
          schuss_liste()\live=1
          schuss_liste()\mass=1
          schuss_liste()\time=-1
          IrrSetNodeMaterialFlag( schuss_liste()\node, #IRR_EMF_LIGHTING, #IRR_On )
          IrrSetNodeMaterialTexture( schuss_liste()\node, *CubeBlank, 0 )
          IrrSetNodeMaterialFlag( schuss_liste()\node, #IRR_EMF_BACK_FACE_CULLING, #IRR_Off) 
          IrrSetNodeMaterialType( schuss_liste()\node, #IRR_EMT_TRANSPARENT_ADD_COLOR)
          
          nx.f=((ScrX.l/2)-MouseX)/-50.0
          ny.f=(((ScrY.l/2)-MouseY)/50.0)-0.05
          nz.f=0.4
          
          IrrSetNodeID( schuss_liste()\node,@schuss_liste())
          IrrAddChildToParent(schuss_liste()\node,*welt_node)
          
          IrrSetNodePosition(schuss_liste()\node,nx.f,ny.f,0.2)
          schuss_liste()\Move_animator=IrrAddFlyStraightAnimator(schuss_liste()\node,nx.f,ny.f,nz.f,nx.f,ny.f,30,5000,0)
          schuss_liste()\Turn_animator=IrrAddRotationAnimator(schuss_liste()\node,0,0,10)
          IrrSetNodeScale(schuss_liste()\node,0.1,0.1,0.3)
        EndIf
      EndIf

; ----------------------------------------------------------------------------------------
       
      If WheelHit.l<>0
         IrrGetNodePosition(*Camera,@x.f,@y.f,@z.f) 
         IrrSetNodePosition(*Camera,x.f,y.f,z.f+(WheelHit.l/10.))
         IrrGetNodePosition(*Camera,@x.f,@y.f,@z.f)
         IrrSetCameraTarget(*Camera,x.f,y.f,z.f+1)
      EndIf

; ----------------------------------------------------------------------------------------
      
      IrrBeginScene(0, 0, 55 )  
      IrrDrawScene()
      
      Irr2DFontDraw ( *BitmapFont,"Punkte = "+Str(counter.l),4,4,0,0)
      Irr2DFontDraw ( *BitmapFont,"Timer = "+Str((rtimer-el)/1000),4,40,0,0)
      
      IrrEndScene()
      
      Delay(1)
 
 ; ----------------------------------------------------------------------------------------
      
      ResetList(schuss_liste())
      ForEach schuss_liste()
        IrrGetNodePosition(schuss_liste()\node,@sx.f,@sy.f,@sz.f)
        If sz.f>20.0
          IrrRemoveAnimator(schuss_liste()\node,schuss_liste()\move_animator)
          IrrRemoveNode(schuss_liste()\node)
          DeleteElement(schuss_liste())
        Else
          If schuss_liste()\visible=0
            IrrSetNodeMaterialTexture( schuss_liste()\node, *SchussTexture, 0 )
            IrrSetNodeMaterialFlag( schuss_liste()\node, #IRR_EMF_LIGHTING, #IRR_Off )
            IrrSetNodeMaterialType( schuss_liste()\node, #IRR_EMT_TRANSPARENT_ADD_COLOR)
            schuss_liste()\visible=1
          Else
            
            ResetList(stone_liste())
            ForEach stone_liste()
              IrrGetNodePosition(stone_liste()\node,@cx.f,@cy.f,@cz.f)
 
              ex.f=Abs(cx.f-sx.f)
              ey.f=Abs(cy.f-sy.f)
              ez.f=Abs(cz.f-sz.f)
              c1.f=Sqr((ex.f*ex.f)+Sqr((ey.f*ey.f)+(ez.f*ez.f)))-stone_liste()\ColRadius-schuss_liste()\ColRadius
              If c1.f<=0
              
                IrrRemoveAnimator(schuss_liste()\node,schuss_liste()\move_animator)
                IrrRemoveNode(schuss_liste()\node)
                DeleteElement(schuss_liste())
   
                AddElement(explosion_liste())
                explosion_liste()\visible=-1
                explosion_liste()\node=IrrAddMeshToScene(*explosion_mesh)
                IrrSetNodeScale(explosion_liste()\node,0.4,0.4,0.4)
               
                IrrSetNodeID( explosion_liste()\node,@explosion_liste())
                IrrAddChildToParent(explosion_liste()\node,*welt_node)

                explosion_liste()\parent = stone_liste()\node
                explosion_liste()\xd.f=(sx.f-cx.f)*1
                explosion_liste()\yd.f=(sy.f-cy.f)*1
                explosion_liste()\zd.f=(sz.f-cz.f)*1
                
                IrrSetNodePosition(explosion_liste()\node,sx.f,sy.f,sz.f)
                                                
                IrrSetNodeMaterialFlag( explosion_liste()\node, #IRR_EMF_LIGHTING, #IRR_On )
                IrrSetNodeMaterialTexture( explosion_liste()\node, *CubeBlank, 0 )
                IrrSetNodeMaterialFlag( explosion_liste()\node, #IRR_EMF_BACK_FACE_CULLING, #IRR_On) 
                IrrSetNodeMaterialType( explosion_liste()\node, #IRR_EMT_TRANSPARENT_ADD_COLOR)

                stone_liste()\live=stone_liste()\live-1
                
                Break
              EndIf 
            Next
           
          EndIf
        EndIf
        
      Next
      
      addexplosion.l=0
      addexplosionmass.l=0
      
      ResetList(stone_liste())
      ForEach stone_liste()
         IrrGetNodePosition(stone_liste()\node,@x.f,@y.f,@z.f)
         If z.f<-8 Or stone_liste()\live<=0 Or (stone_liste()\time>0 And stone_liste()\time<ElapsedMilliseconds())
            If stone_liste()\move_animator
              IrrRemoveAnimator(stone_liste()\node,stone_liste()\move_animator)
            EndIf
            If stone_liste()\turn_animator
              IrrRemoveAnimator(stone_liste()\node,stone_liste()\turn_animator)
            EndIf
 
            If  stone_liste()\live<=0 And stone_liste()\mass>0
              addexplosion.l=1
              addexplosionmass.l=stone_liste()\mass
              IrrGetNodePosition(stone_liste()\node,@sx.f,@sy.f,@sz.f)
            EndIf
            
            ResetList(explosion_liste())
            ForEach explosion_liste()
              If explosion_liste()\parent=stone_liste()\node
                explosion_liste()\parent=0
              EndIf
            Next
            
            IrrRemoveNode(stone_liste()\node)
            DeleteElement(stone_liste())
            
         EndIf   
      Next 
      
      If addexplosion.l>0
            If addexplosionmass.l>2
              
              counter.l=counter.l+10
              
              For i=0 To 8
                AddElement(stone_liste())
                stone_liste()\node=IrrAddMeshToScene(*stone_mesh)
                stone_liste()\visible=0
                stone_liste()\ColRadius=0.5
                stone_liste()\live=1
                stone_liste()\mass=2
                stone_liste()\time=10000+ElapsedMilliseconds()
                IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_LIGHTING, #IRR_Off )
                IrrSetNodeMaterialTexture( stone_liste()\node, *stonetexture, 0 )
                IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_BACK_FACE_CULLING, #IRR_On) 
                IrrSetNodeMaterialType( stone_liste()\node, #IRR_EMT_SOLID)
                
                IrrSetNodeID( stone_liste()\node,@stone_liste())
                IrrAddChildToParent(stone_liste()\node,*welt_node)
                
                x.f=(100-Random(200))
                y.f=(100-Random(200))
                z.f=(100-Random(200))
                
                IrrSetNodePosition(stone_liste()\node,sx.f,sy.f,sz.f)
                stone_liste()\Move_animator=IrrAddFlyStraightAnimator(stone_liste()\node,sx.f,sy.f,sz.f,sx.f+x.f,sy.f+y.f,sz.f+z.f,30000,0)
                IrrSetNodeScale(stone_liste()\node,0.0025,0.0025,0.0025)  
              Next
            Else
              counter.l=counter.l+100
 
              If addexplosionmass.l=1
                Rtimer.l=Rtimer.l+5000
              EndIf
              
            EndIf
            
            For i=0 To 8
              AddElement(stone_liste())
              stone_liste()\node=IrrAddMeshToScene(*stone_mesh)
              stone_liste()\visible=0
              stone_liste()\ColRadius=0.05
              stone_liste()\live=1
              stone_liste()\mass=0
              stone_liste()\time=5000+ElapsedMilliseconds()
              IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_LIGHTING, #IRR_Off )
              IrrSetNodeMaterialTexture( stone_liste()\node, *stonetexture, 0 )
              IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_BACK_FACE_CULLING, #IRR_On) 
              IrrSetNodeMaterialType( stone_liste()\node, #IRR_EMT_SOLID)
              
              IrrSetNodeID( stone_liste()\node,@stone_liste())
              IrrAddChildToParent(stone_liste()\node,*welt_node)
              
              x.f=(100-Random(200))
              y.f=(100-Random(200))
              z.f=(100-Random(200))
              
              IrrSetNodePosition(stone_liste()\node,sx.f,sy.f,sz.f)
              stone_liste()\Move_animator=IrrAddFlyStraightAnimator(stone_liste()\node,sx.f,sy.f,sz.f,sx.f+x.f,sy.f+y.f,sz.f+z.f,15000,0)
              IrrSetNodeScale(stone_liste()\node,0.0005,0.0005,0.0005)  
            Next
            
            ;--- Bonie Automatisch reduzieren
            If Random(1+BoniDef.f)=1
                
                BoniDef.f=BoniDef.f+0.2
                
                AddElement(stone_liste())
                stone_liste()\node=IrrAddMeshToScene(*explosion_mesh)
                stone_liste()\visible=0
                stone_liste()\ColRadius=0.5
                stone_liste()\live=1
                stone_liste()\mass=1
                stone_liste()\time=8000+ElapsedMilliseconds()               
                IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_LIGHTING, #IRR_Off )
                IrrSetNodeMaterialTexture( stone_liste()\node, *CubeTexture, 0 )
                IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_BACK_FACE_CULLING, #IRR_Off) 
                IrrSetNodeMaterialType( stone_liste()\node, #IRR_EMT_TRANSPARENT_ADD_COLOR)
                
                IrrSetNodeID( stone_liste()\node,@stone_liste())
                IrrAddChildToParent(stone_liste()\node,*welt_node)
                
                x.f=(100-Random(200))
                y.f=(100-Random(200))
                z.f=(100-Random(200))
                
                IrrSetNodePosition(stone_liste()\node,sx.f,sy.f,sz.f)
                stone_liste()\Move_animator=IrrAddFlyStraightAnimator(stone_liste()\node,sx.f,sy.f,sz.f,sx.f+x.f,sy.f+y.f,sz.f+z.f,45000,0)
                stone_liste()\Turn_animator=IrrAddRotationAnimator(stone_liste()\node,0.3,0.5,0.9)
 
                IrrSetNodeScale(stone_liste()\node,0.4,0.4,0.4)
                  
            EndIf
      EndIf
      
; ----------------------------------------------------------------------------------------

      anim.f=0.001*alpha.f

      ResetList(explosion_liste())
      ForEach explosion_liste()
        If explosion_liste()\visible=0
          IrrSetNodeMaterialTexture( explosion_liste()\node, *explosionTexture, 0 )
          IrrSetNodeMaterialFlag( explosion_liste()\node, #IRR_EMF_LIGHTING, #IRR_Off )
          explosion_liste()\visible=1
        ElseIf explosion_liste()\visible=-1
          explosion_liste()\visible=0
        ElseIf explosion_liste()\visible=1
          IrrGetNodeScale(explosion_liste()\node,@x.f,@y.f,@z.f)
          If x.f<0.01
            IrrRemoveNode(explosion_liste()\node)
            DeleteElement(explosion_liste())
          Else
             IrrSetNodeScale(explosion_liste()\node,x.f-anim.f,y.f-anim.f,z.f-anim.f)
             If explosion_liste()\parent>0
                IrrGetNodePosition(explosion_liste()\parent,@sx.f,@sy.f,@sz.f)
                IrrSetNodePosition(explosion_liste()\node,sx.f+explosion_liste()\xd.f,sy.f+explosion_liste()\yd.f,sz.f+explosion_liste()\zd.f)
             EndIf
          EndIf
        EndIf
      Next

; ----------------------------------------------------------------------------------------
      
Until en>0

If en=2
  en=0
  ResetList(schuss_liste())
  ForEach schuss_liste()
    IrrRemoveAnimator(schuss_liste()\node,schuss_liste()\move_animator)
    IrrRemoveAnimator(schuss_liste()\node,schuss_liste()\turn_animator)
    IrrRemoveNode(schuss_liste()\node)
    DeleteElement(schuss_liste())
  Next
  ResetList(explosion_liste())
  ForEach explosion_liste()
    IrrRemoveNode(explosion_liste()\node)
    DeleteElement(explosion_liste())
  Next
    ResetList(stone_liste())
    ForEach stone_liste()
      If stone_liste()\move_animator
        IrrRemoveAnimator(stone_liste()\node,stone_liste()\move_animator)
      EndIf
      If stone_liste()\turn_animator
        IrrRemoveAnimator(stone_liste()\node,stone_liste()\turn_animator)
      EndIf
      IrrRemoveNode(stone_liste()\node)
      DeleteElement(stone_liste())
    Next
    IrrStop()
    Irr3DRequester(#IRR3DREQ_REQUESTER)
    Goto neustart
EndIf

IrrStop()
 
End 

; ----------------------------------------------------------------------------------------

DataSection

  Objectdata:
  ;; Anzahl Punkte,Anzahl Dreiecke, Texture
  Data.l 16,8
  Data.s "fire.bmp"
    
  ObjectPoint:
  ;; x,y,z,tex_x,tex_y,v_col
  Data.f -1 ,  0 , -1 ,  0 ,  0 
  Data.f -1 ,  0 ,  1 ,  0 ,  1 
  Data.f  1 ,  0 ,  1 ,  1 ,  1 
  Data.f  1 ,  0 , -1 ,  1 ,  0 
    
  Data.f -0.7 ,  0.7 , -1 ,  0 ,  0 
  Data.f -0.7 ,  0.7 ,  1 ,  0 ,  1 
  Data.f  0.7 , -0.7 ,  1 ,  1 ,  1 
  Data.f  0.7 , -0.7 , -1 ,  1 ,  0 
    
  Data.f  0 , -1 , -1 ,  0 ,  0 
  Data.f  0 , -1 ,  1 ,  0 ,  1 
  Data.f  0 ,  1 ,  1 ,  1 ,  1 
  Data.f  0 ,  1 , -1 ,  1 ,  0 
   
  Data.f -0.7 , -0.7 , -1 ,  0 ,  0 
  Data.f -0.7 , -0.7 ,  1 ,  0 ,  1 
  Data.f  0.7 ,  0.7 ,  1 ,  1 ,  1 
  Data.f  0.7 ,  0.7 , -1 ,  1 ,  0 
    
  PointToTriangle:
  ;; p0,p1,p2 , rechts herum
  Data.l 0,1,2
  Data.l 2,3,0
  Data.l 4,5,6
  Data.l 6,7,4
  Data.l 8,9,10
  Data.l 10,11,8
  Data.l 12,13,14
  Data.l 14,15,12
  
  Objectdata2:
  ;; Anzahl Punkte,Anzahl Dreiecke, Texture
  Data.l 12,6
  Data.s "spark.bmp"
    
  ObjectPoint2:
  ;; x,y,z,tex_x,tex_y,v_col
  Data.f -1 ,  0 , -1 ,  0 ,  0 
  Data.f -1 ,  0 ,  1 ,  0 ,  1 
  Data.f  1 ,  0 ,  1 ,  1 ,  1 
  Data.f  1 ,  0 , -1 ,  1 ,  0 
  
  Data.f -1 , -1 ,  0 ,  0 ,  0 
  Data.f -1 ,  1 ,  0 ,  0 ,  1 
  Data.f  1 ,  1 ,  0 ,  1 ,  1 
  Data.f  1 , -1 ,  0 ,  1 ,  0 
  
  Data.f  0 , -1 , -1 ,  0 ,  0 
  Data.f  0 , -1 ,  1 ,  0 ,  1 
  Data.f  0 ,  1 ,  1 ,  1 ,  1 
  Data.f  0 ,  1 , -1 ,  1 ,  0 
  
    
  PointToTriangle2:
  ;; p0,p1,p2 , rechts herum
  Data.l 0,1,2
  Data.l 2,3,0
  Data.l 4,5,6
  Data.l 6,7,4
  Data.l 8,9,10
  Data.l 10,11,8
  
EndDataSection 


TFT seid 1989 , Turgut Frank Temucin , CH-Dachsen/DE-Berlin/TR-Antalya
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung

PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler :-)
Benutzeravatar
tft
Beiträge: 650
Registriert: 08.09.2004 20:18
Computerausstattung: GFX 3060 Ti , i7 12700F , 32 GB Ram , 900 GB SSD , TV
Wohnort: Dachsen
Kontaktdaten:

Beitrag von tft »

Code: Alles auswählen

;
; -------------------------------------------------------------------------------
;
;   PureBasic - Irrlicht
;
;   Von 0 auf 100 (c) 2008 - TFT
;
;   Part 014
;
; -------------------------------------------------------------------------------
;
; In allen Parts sind die Komentare des vorherigen Parts gelöscht. Und der Code 
; soweit gerafft. Das die Übersichtlichkeit nicht all zu arg leidet. Die neuen
; Code Segmente sind mit ;--- gekenzeichnet. Das Procedure Fenster zeigt die
; entsprechenden Sprungmarken.
;
; Eine Sache die mich recht ärgert. Ist die grösse des BitMap Font. Und deren ausshen 
; im Screen. Ich werde einen Kleineren verwenden und nach einer anderen Lösung suchen.
;
; und damit es auch Akustisch mal was zu Hören gibt. Machen wir eine runde lärm. Denkt aber
; nicht das das so einfach war. Denn es gibt da ein paar dinge die ich erst herrausfinden
; muste. Zum Beispiel das man keine Sounds doppelt laden kann. Oder das mp3 Sounds nur mit
; der Console 3D funktionieren. Schluss endlich habe ich es dann doch geschafft.

XIncludeFile "Irr3DRequester_mod.pb"
Irr3DRequester(#IRR3DREQ_SKIP)

; ----------------------------------------------------------------------------------------

Structure NodeListe

    *node.irr_node
    visible.l
    ColRadius.f
    live.l
    *Move_animator.irr_animator
    *Turn_animator.irr_animator
    *parent.l
    xd.f
    yd.f
    zd.f
    mass.l
    time.l
       
EndStructure

; ----------------------------------------------------------------------------------------

neustart:

; ----------------------------------------------------------------------------------------

ScrX.l=irr3DRequesterSetting\videomode\dimension\width
ScrY.l=irr3DRequesterSetting\videomode\dimension\height
LeftMouseBotonDown.l=0
RigtMouseBotonDown.l=0

EndTimer.l=90000

; ----------------------------------------------------------------------------------------

*camera.irr_camera = IrrAddCamera( 0,0,0, 0,0,1 )

IrrSetCameraClipDistance(*Camera,10000)
IrrSetCameraNearValue(*Camera,0.1)

; ----------------------------------------------------------------------------------------

*BitmapFont = IrrGetFont ( "bitmapfont.bmp" )

; ----------------------------------------------------------------------------------------
 
NewList stone_liste.NodeListe()

*Stone_Mesh.irr_mesh = IrrGetMesh("stone1.ms3d")
*StoneTexture.irr_texture = IrrGetTexture("stone1.jpg")  
    
; ----------------------------------------------------------------------------------------
 
Restore ObjectData
Read a.l
Read b.l
Read Pfad.s

Dim verts.IRR_VERT(a)
Dim indices.w(b*3)
 
Restore ObjectPoint
For i=0 To a-1
  Read mx.f
  Read my.f
  Read mz.f
  Read tx.f
  Read ty.f
  vc.l = $00FFFFFF
  verts(i)\X = mx 
  verts(i)\Y = my  
  verts(i)\Z = mz 
  verts(i)\texture_x = tx  
  verts(i)\texture_y = ty 
  verts(i)\vcolor = vc
Next
  
Restore PointToTriangle
For i=0 To (b*3)-1
  Read p.l
  indices(i)  = p
Next 
     
*schuss_mesh.irr_mesh = IrrCreateMesh( "TestMesh", a, @verts(0), b*3, @indices(0))
*SchussTexture.irr_texture = IrrGetTexture( Pfad.s )

NewList schuss_liste.NodeListe()

; ----------------------------------------------------------------------------------------
 
Restore ObjectData2
Read a.l
Read b.l
Read Pfad.s

Dim verts.IRR_VERT(a)
Dim indices.w(b*3)
 
Restore ObjectPoint2
For i=0 To a-1
  Read mx.f
  Read my.f
  Read mz.f
  Read tx.f
  Read ty.f
  vc.l = $00FFFFFF
  verts(i)\X = mx 
  verts(i)\Y = my  
  verts(i)\Z = mz 
  verts(i)\texture_x = tx  
  verts(i)\texture_y = ty 
  verts(i)\vcolor = vc
Next
  
Restore PointToTriangle2
For i=0 To (b*3)-1
  Read p.l
  indices(i)  = p
Next 
     
*explosion_mesh.irr_mesh = IrrCreateMesh( "TestMesh", a, @verts(0), b*3, @indices(0))
*explosionTexture.irr_texture = IrrGetTexture( Pfad.s )

NewList explosion_liste.NodeListe()

; ----------------------------------------------------------------------------------------

*welt_node.irr_node = IrrAddEmptySceneNode()

; ----------------------------------------------------------------------------------------


*flieger_mesh.irr_mesh=IrrGetMesh("ship.x") ; Object Scalierung bei DOGA 0.001
*flieger_node=IrrAddMeshToScene(*flieger_mesh)
IrrSetNodeScale(*flieger_node,0.1,0.1,0.1)
IrrSetNodeMaterialFlag( *flieger_node,#IRR_EMF_LIGHTING, #IRR_OFF )
IrrSetNodeMaterialFlag( *flieger_node, #IRR_EMF_BACK_FACE_CULLING, #IRR_OFF) 
IrrSetNodeRotation( *flieger_node,0,180,0)
IrrSetNodePosition( *flieger_node,0,-0.05,0.15)


*cube.irr_node=IrrAddCubeSceneNode(0.02)
IrrSetNodeMaterialFlag( *cube,#IRR_EMF_LIGHTING, #IRR_OFF )
IrrSetNodeMaterialFlag( *cube, #IRR_EMF_BACK_FACE_CULLING, #IRR_On) 
IrrSetNodeMaterialType( *cube, #IRR_EMT_TRANSPARENT_ADD_COLOR)
IrrSetNodePosition( *cube,0,0,0.15)
*CubeTexture.irr_texture = IrrGetTexture( "test.bmp" )
*CubeBlank.irr_texture = IrrGetTexture( "blank.bmp" )
IrrSetNodeMaterialTexture( *cube, *CubeTexture, 0 )

; ----------------------------------------------------------------------------------------

Rtimer=ElapsedMilliseconds()+EndTimer.l

; ----------------------------------------------------------------------------------------

*SkyTexture.irr_texture = IrrGetTexture("ba-left.jpg")
*SkyBox = IrrAddSkyBoxToScene( *CubeBlank,*CubeBlank,*CubeBlank,*CubeBlank,*CubeBlank,*SkyTexture)

; ----------------------------------------------------------------------------------------

;--- Sound Start
If IrrKlangStart()=0
  End
EndIf
;--- Effecte Laden
 *fx1_soundsource = IrrKlangAddSound("explosion.wav")
 *fx2_soundsource = IrrKlangAddSound("bell.wav")
 
Repeat
 
      If Rtimer<=ElapsedMilliseconds()
        en=3
      EndIf
 ; ----------------------------------------------------------------------------------------

      el.l=ElapsedMilliseconds()
      If fpst.l<el.l
        fpst.l=el.l+1000
        fpsl.l=fps.l
        fps.l=0
        alpha.f=(1000/fpsl)
      EndIf
      fps.l=fps.l+1

; ----------------------------------------------------------------------------------------
           
      If IrrRunning()=0
         en=1
      EndIf

; ----------------------------------------------------------------------------------------
             
      While IrrKeyEventAvailable()
          
          *KeyEvent.irr_key_event = IrrReadKeyEvent()
  
          Select *KeyEvent\key
          Case #IRR_KEY_ESCAPE
            en=1
          Case #IRR_KEY_F12
            en=2
          EndSelect
          
      Wend

; ----------------------------------------------------------------------------------------
      
      LeftMouseBotonHit.l=0
      RigtMouseBotonHit.l=0
      WheelHit.l=0
      
      While IrrMouseEventAvailable()
          
          *MouseEvent.irr_mouse_event = IrrReadMouseEvent()
          
          Select *MouseEvent\action 
          Case #IRR_EMIE_MOUSE_MOVED
            MouseSpeedX.l=MouseX.l-*MouseEvent\X
            MouseSpeedY.l=MouseY.l-*MouseEvent\Y
            MouseX.l= *MouseEvent\X
            MouseY.l= *MouseEvent\Y
          Case #IRR_EMIE_MOUSE_WHEEL
            WheelHit.l=*MouseEvent\wheel
          Case #IRR_EMIE_LMOUSE_PRESSED_DOWN
            LeftMouseBotonDown.l=1
            LeftMouseBotonHit.l=1
          Case #IRR_EMIE_LMOUSE_LEFT_UP
            LeftMouseBotonDown.l=0
          Case #IRR_EMIE_RMOUSE_PRESSED_DOWN
            RigtMouseBotonDown.l=1
            RigtMouseBotonHit.l=1
          Case #IRR_EMIE_RMOUSE_LEFT_UP
            RigtMouseBotonDown.l=0
          EndSelect
      
      Wend
; ----------------------------------------------------------------------------------------

      nx.f=((ScrX.l/2)-MouseX)/50.0
      ny.f=((ScrY.l/2)-MouseY)/-50.0
      IrrSetNodePosition(*welt_node,nx.f,ny.f,0)
      
      ;--- Position für IrrKlang
      ikx.f=nx.f*-1
      iky.f=ny.f*-1
      
; ----------------------------------------------------------------------------------------

      If StoneTimer.l<ElapsedMilliseconds()
        StoneTimer.l=ElapsedMilliseconds()+300
        AddElement(stone_liste())
        stone_liste()\node=IrrAddMeshToScene(*stone_mesh)
        stone_liste()\visible=0
        stone_liste()\ColRadius=1.0
        stone_liste()\live=10
        stone_liste()\mass=5
        stone_liste()\time=-1
        IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_LIGHTING, #IRR_Off )
        IrrSetNodeMaterialTexture( stone_liste()\node, *stonetexture, 0 )
        IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_BACK_FACE_CULLING, #IRR_On) 
        IrrSetNodeMaterialType( stone_liste()\node, #IRR_EMT_SOLID)
        
        x.f=(250-Random(500))/30
        y.f=(250-Random(500))/30
        
        IrrSetNodeID( stone_liste()\node,@stone_liste())
        IrrAddChildToParent(stone_liste()\node,*welt_node)
          
        IrrSetNodePosition(stone_liste()\node,x.f,y.f,80)
        stone_liste()\Move_animator=IrrAddFlyStraightAnimator(stone_liste()\node,x.f,y.f,40,x.f,y.f,-10,9000,0)
        IrrSetNodeScale(stone_liste()\node,0.01,0.01,0.01)
      EndIf
      
; ----------------------------------------------------------------------------------------
      
      If LeftMouseBotonDown.l=1
        If schuss_interval_timer.l<ElapsedMilliseconds()
          schuss_interval_timer.l=ElapsedMilliseconds()+100
          AddElement(schuss_liste())
          schuss_liste()\node=IrrAddMeshToScene(*schuss_mesh)
          schuss_liste()\visible=0
          schuss_liste()\ColRadius=0.05
          schuss_liste()\live=1
          schuss_liste()\mass=1
          schuss_liste()\time=-1
          IrrSetNodeMaterialFlag( schuss_liste()\node, #IRR_EMF_LIGHTING, #IRR_On )
          IrrSetNodeMaterialTexture( schuss_liste()\node, *CubeBlank, 0 )
          IrrSetNodeMaterialFlag( schuss_liste()\node, #IRR_EMF_BACK_FACE_CULLING, #IRR_Off) 
          IrrSetNodeMaterialType( schuss_liste()\node, #IRR_EMT_TRANSPARENT_ADD_COLOR)
          
          nx.f=((ScrX.l/2)-MouseX)/-50.0
          ny.f=(((ScrY.l/2)-MouseY)/50.0)-0.05
          nz.f=0.4
          
          IrrSetNodeID( schuss_liste()\node,@schuss_liste())
          IrrAddChildToParent(schuss_liste()\node,*welt_node)
          
          IrrSetNodePosition(schuss_liste()\node,nx.f,ny.f,0.2)
          schuss_liste()\Move_animator=IrrAddFlyStraightAnimator(schuss_liste()\node,nx.f,ny.f,nz.f,nx.f,ny.f,30,5000,0)
          schuss_liste()\Turn_animator=IrrAddRotationAnimator(schuss_liste()\node,0,0,10)
          IrrSetNodeScale(schuss_liste()\node,0.1,0.1,0.3)
        EndIf
      EndIf

; ----------------------------------------------------------------------------------------
      
      IrrBeginScene(0, 0, 55 )  
      IrrDrawScene()
      
      Irr2DFontDraw ( *BitmapFont,"Punkte = "+Str(counter.l),4,4,0,0)
      Irr2DFontDraw ( *BitmapFont,"Timer = "+Str((rtimer-el)/1000),4,40,0,0)
      
      IrrEndScene()
      
      Delay(1)
 
 ; ----------------------------------------------------------------------------------------
      
      ResetList(schuss_liste())
      ForEach schuss_liste()
        IrrGetNodePosition(schuss_liste()\node,@sx.f,@sy.f,@sz.f)
        If sz.f>20.0
          IrrRemoveAnimator(schuss_liste()\node,schuss_liste()\move_animator)
          IrrRemoveNode(schuss_liste()\node)
          DeleteElement(schuss_liste())
        Else
          If schuss_liste()\visible=0
            IrrSetNodeMaterialTexture( schuss_liste()\node, *SchussTexture, 0 )
            IrrSetNodeMaterialFlag( schuss_liste()\node, #IRR_EMF_LIGHTING, #IRR_Off )
            IrrSetNodeMaterialType( schuss_liste()\node, #IRR_EMT_TRANSPARENT_ADD_COLOR)
            schuss_liste()\visible=1
          Else
            
            ResetList(stone_liste())
            ForEach stone_liste()
              IrrGetNodePosition(stone_liste()\node,@cx.f,@cy.f,@cz.f)
 
              ex.f=Abs(cx.f-sx.f)
              ey.f=Abs(cy.f-sy.f)
              ez.f=Abs(cz.f-sz.f)
              c1.f=Sqr((ex.f*ex.f)+Sqr((ey.f*ey.f)+(ez.f*ez.f)))-stone_liste()\ColRadius-schuss_liste()\ColRadius
              If c1.f<=0
              
                IrrRemoveAnimator(schuss_liste()\node,schuss_liste()\move_animator)
                IrrRemoveNode(schuss_liste()\node)
                DeleteElement(schuss_liste())
   
                AddElement(explosion_liste())
                explosion_liste()\visible=-1
                explosion_liste()\node=IrrAddMeshToScene(*explosion_mesh)
                IrrSetNodeScale(explosion_liste()\node,0.4,0.4,0.4)
               
                IrrSetNodeID( explosion_liste()\node,@explosion_liste())
                IrrAddChildToParent(explosion_liste()\node,*welt_node)

                explosion_liste()\parent = stone_liste()\node
                explosion_liste()\xd.f=(sx.f-cx.f)*1
                explosion_liste()\yd.f=(sy.f-cy.f)*1
                explosion_liste()\zd.f=(sz.f-cz.f)*1
                
                IrrSetNodePosition(explosion_liste()\node,sx.f,sy.f,sz.f)
                                                
                IrrSetNodeMaterialFlag( explosion_liste()\node, #IRR_EMF_LIGHTING, #IRR_On )
                IrrSetNodeMaterialTexture( explosion_liste()\node, *CubeBlank, 0 )
                IrrSetNodeMaterialFlag( explosion_liste()\node, #IRR_EMF_BACK_FACE_CULLING, #IRR_On) 
                IrrSetNodeMaterialType( explosion_liste()\node, #IRR_EMT_TRANSPARENT_ADD_COLOR)

                stone_liste()\live=stone_liste()\live-1
                
                Break
              EndIf 
            Next
           
          EndIf
        EndIf
        
      Next
      
      addexplosion.l=0
      addexplosionmass.l=0
      
      ResetList(stone_liste())
      ForEach stone_liste()
         IrrGetNodePosition(stone_liste()\node,@x.f,@y.f,@z.f)
         If z.f<-8 Or stone_liste()\live<=0 Or (stone_liste()\time>0 And stone_liste()\time<ElapsedMilliseconds())
            If stone_liste()\move_animator
              IrrRemoveAnimator(stone_liste()\node,stone_liste()\move_animator)
            EndIf
            If stone_liste()\turn_animator
              IrrRemoveAnimator(stone_liste()\node,stone_liste()\turn_animator)
            EndIf
 
            If  stone_liste()\live<=0 And stone_liste()\mass>0
              addexplosion.l=1
              addexplosionmass.l=stone_liste()\mass
              IrrGetNodePosition(stone_liste()\node,@sx.f,@sy.f,@sz.f)
            EndIf
            
            ResetList(explosion_liste())
            ForEach explosion_liste()
              If explosion_liste()\parent=stone_liste()\node
                explosion_liste()\parent=0
              EndIf
            Next
            
            IrrRemoveNode(stone_liste()\node)
            DeleteElement(stone_liste())
            
         EndIf   
      Next 
      
      ;--- Position des Hörenden festlegen
      IrrKlangListenerPosition(ikx.f,iky.f,0, ikx.f,iky.f,1,  0,0,0,  0,0,0)     
      
      If addexplosion.l>0
            If addexplosionmass.l>2
              
              ;--- Explosions Sound
              *fx_sound.l=IrrKlangPlay3D(*fx1_soundsource, sx.f,sy.f,sz.f , #False,#False, #True)
              If *fx_sound <> #Null
                IrrKlangSoundSetMinDistance(*fx_sound, 6)
                IrrKlangSoundSetMaxDistance(*fx_sound, 80)
              EndIf
                         
              counter.l=counter.l+10
              
              For i=0 To 8
                AddElement(stone_liste())
                stone_liste()\node=IrrAddMeshToScene(*stone_mesh)
                stone_liste()\visible=0
                stone_liste()\ColRadius=0.5
                stone_liste()\live=1
                stone_liste()\mass=2
                stone_liste()\time=10000+ElapsedMilliseconds()
                IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_LIGHTING, #IRR_Off )
                IrrSetNodeMaterialTexture( stone_liste()\node, *stonetexture, 0 )
                IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_BACK_FACE_CULLING, #IRR_On) 
                IrrSetNodeMaterialType( stone_liste()\node, #IRR_EMT_SOLID)
                
                IrrSetNodeID( stone_liste()\node,@stone_liste())
                IrrAddChildToParent(stone_liste()\node,*welt_node)
                
                x.f=(100-Random(200))
                y.f=(100-Random(200))
                z.f=(100-Random(200))
                
                IrrSetNodePosition(stone_liste()\node,sx.f,sy.f,sz.f)
                stone_liste()\Move_animator=IrrAddFlyStraightAnimator(stone_liste()\node,sx.f,sy.f,sz.f,sx.f+x.f,sy.f+y.f,sz.f+z.f,30000,0)
                IrrSetNodeScale(stone_liste()\node,0.0025,0.0025,0.0025)  
              Next
            Else
              counter.l=counter.l+100
 
              If addexplosionmass.l=1
                Rtimer.l=Rtimer.l+5000
                ;--- Extra Sound
                *fx_sound=IrrKlangPlay3D(*fx2_soundsource, sx.f,sy.f,sz.f , #False,#False, #True)
                If *fx_sound <> #Null
                  IrrKlangSoundSetMinDistance(*fx_sound, 6)
                  IrrKlangSoundSetMaxDistance(*fx_sound, 80)
                EndIf
              EndIf
              
            EndIf
            
            For i=0 To 8
              AddElement(stone_liste())
              stone_liste()\node=IrrAddMeshToScene(*stone_mesh)
              stone_liste()\visible=0
              stone_liste()\ColRadius=0.05
              stone_liste()\live=1
              stone_liste()\mass=0
              stone_liste()\time=5000+ElapsedMilliseconds()
              IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_LIGHTING, #IRR_Off )
              IrrSetNodeMaterialTexture( stone_liste()\node, *stonetexture, 0 )
              IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_BACK_FACE_CULLING, #IRR_On) 
              IrrSetNodeMaterialType( stone_liste()\node, #IRR_EMT_SOLID)
              
              IrrSetNodeID( stone_liste()\node,@stone_liste())
              IrrAddChildToParent(stone_liste()\node,*welt_node)
              
              x.f=(100-Random(200))
              y.f=(100-Random(200))
              z.f=(100-Random(200))
              
              IrrSetNodePosition(stone_liste()\node,sx.f,sy.f,sz.f)
              stone_liste()\Move_animator=IrrAddFlyStraightAnimator(stone_liste()\node,sx.f,sy.f,sz.f,sx.f+x.f,sy.f+y.f,sz.f+z.f,15000,0)
              IrrSetNodeScale(stone_liste()\node,0.0005,0.0005,0.0005)  
            Next
            
            ;--- Bonie Automatisch reduzieren
            If Random(1+BoniDef.f)=1
                
                BoniDef.f=BoniDef.f+0.2
                
                AddElement(stone_liste())
                stone_liste()\node=IrrAddMeshToScene(*explosion_mesh)
                stone_liste()\visible=0
                stone_liste()\ColRadius=0.5
                stone_liste()\live=1
                stone_liste()\mass=1
                stone_liste()\time=8000+ElapsedMilliseconds()               
                IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_LIGHTING, #IRR_Off )
                IrrSetNodeMaterialTexture( stone_liste()\node, *CubeTexture, 0 )
                IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_BACK_FACE_CULLING, #IRR_Off) 
                IrrSetNodeMaterialType( stone_liste()\node, #IRR_EMT_TRANSPARENT_ADD_COLOR)
                
                IrrSetNodeID( stone_liste()\node,@stone_liste())
                IrrAddChildToParent(stone_liste()\node,*welt_node)
                
                x.f=(100-Random(200))
                y.f=(100-Random(200))
                z.f=(100-Random(200))
                
                IrrSetNodePosition(stone_liste()\node,sx.f,sy.f,sz.f)
                stone_liste()\Move_animator=IrrAddFlyStraightAnimator(stone_liste()\node,sx.f,sy.f,sz.f,sx.f+x.f,sy.f+y.f,sz.f+z.f,45000,0)
                stone_liste()\Turn_animator=IrrAddRotationAnimator(stone_liste()\node,0.3,0.5,0.9)
 
                IrrSetNodeScale(stone_liste()\node,0.4,0.4,0.4)
                  
            EndIf
      EndIf
      
; ----------------------------------------------------------------------------------------

      anim.f=0.001*alpha.f

      ResetList(explosion_liste())
      ForEach explosion_liste()
        If explosion_liste()\visible=0
          IrrSetNodeMaterialTexture( explosion_liste()\node, *explosionTexture, 0 )
          IrrSetNodeMaterialFlag( explosion_liste()\node, #IRR_EMF_LIGHTING, #IRR_Off )
          explosion_liste()\visible=1
        ElseIf explosion_liste()\visible=-1
          explosion_liste()\visible=0
        ElseIf explosion_liste()\visible=1
          IrrGetNodeScale(explosion_liste()\node,@x.f,@y.f,@z.f)
          If x.f<0.01
            IrrRemoveNode(explosion_liste()\node)
            DeleteElement(explosion_liste())
          Else
             IrrSetNodeScale(explosion_liste()\node,x.f-anim.f,y.f-anim.f,z.f-anim.f)
             If explosion_liste()\parent>0
                IrrGetNodePosition(explosion_liste()\parent,@sx.f,@sy.f,@sz.f)
                IrrSetNodePosition(explosion_liste()\node,sx.f+explosion_liste()\xd.f,sy.f+explosion_liste()\yd.f,sz.f+explosion_liste()\zd.f)
             EndIf
          EndIf
        EndIf
      Next

; ----------------------------------------------------------------------------------------
      
Until en>0

If en=2
  en=0
  ResetList(schuss_liste())
  ForEach schuss_liste()
    IrrRemoveAnimator(schuss_liste()\node,schuss_liste()\move_animator)
    IrrRemoveAnimator(schuss_liste()\node,schuss_liste()\turn_animator)
    IrrRemoveNode(schuss_liste()\node)
    DeleteElement(schuss_liste())
  Next
  ResetList(explosion_liste())
  ForEach explosion_liste()
    IrrRemoveNode(explosion_liste()\node)
    DeleteElement(explosion_liste())
  Next
    ResetList(stone_liste())
    ForEach stone_liste()
      If stone_liste()\move_animator
        IrrRemoveAnimator(stone_liste()\node,stone_liste()\move_animator)
      EndIf
      If stone_liste()\turn_animator
        IrrRemoveAnimator(stone_liste()\node,stone_liste()\turn_animator)
      EndIf
      IrrRemoveNode(stone_liste()\node)
      DeleteElement(stone_liste())
    Next
    IrrStop()
    Irr3DRequester()
    Goto neustart

ElseIf en=3

    en=0
        
    Rtimer=ElapsedMilliseconds()+3000
        
    Repeat
 
        IrrBeginScene(0, 0, 55 )  
        IrrDrawScene()
             
        Irr2DFontDraw ( *BitmapFont,"Punkte = "+Str(counter.l),4,4,0,0)
        Irr2DFontDraw ( *BitmapFont,"GameOver ",4,80,0,0)
          
        IrrEndScene()
            
             
        Delay(10)
     
        If Rtimer=< ElapsedMilliseconds()
          en=2
        EndIf
             
    Until en=2 

EndIf

IrrStop()
 
End 

; ----------------------------------------------------------------------------------------

DataSection

  Objectdata:
  ;; Anzahl Punkte,Anzahl Dreiecke, Texture
  Data.l 16,8
  Data.s "fire.bmp"
    
  ObjectPoint:
  ;; x,y,z,tex_x,tex_y,v_col
  Data.f -1 ,  0 , -1 ,  0 ,  0 
  Data.f -1 ,  0 ,  1 ,  0 ,  1 
  Data.f  1 ,  0 ,  1 ,  1 ,  1 
  Data.f  1 ,  0 , -1 ,  1 ,  0 
    
  Data.f -0.7 ,  0.7 , -1 ,  0 ,  0 
  Data.f -0.7 ,  0.7 ,  1 ,  0 ,  1 
  Data.f  0.7 , -0.7 ,  1 ,  1 ,  1 
  Data.f  0.7 , -0.7 , -1 ,  1 ,  0 
    
  Data.f  0 , -1 , -1 ,  0 ,  0 
  Data.f  0 , -1 ,  1 ,  0 ,  1 
  Data.f  0 ,  1 ,  1 ,  1 ,  1 
  Data.f  0 ,  1 , -1 ,  1 ,  0 
   
  Data.f -0.7 , -0.7 , -1 ,  0 ,  0 
  Data.f -0.7 , -0.7 ,  1 ,  0 ,  1 
  Data.f  0.7 ,  0.7 ,  1 ,  1 ,  1 
  Data.f  0.7 ,  0.7 , -1 ,  1 ,  0 
    
  PointToTriangle:
  ;; p0,p1,p2 , rechts herum
  Data.l 0,1,2
  Data.l 2,3,0
  Data.l 4,5,6
  Data.l 6,7,4
  Data.l 8,9,10
  Data.l 10,11,8
  Data.l 12,13,14
  Data.l 14,15,12
  
  Objectdata2:
  ;; Anzahl Punkte,Anzahl Dreiecke, Texture
  Data.l 12,6
  Data.s "spark.bmp"
    
  ObjectPoint2:
  ;; x,y,z,tex_x,tex_y,v_col
  Data.f -1 ,  0 , -1 ,  0 ,  0 
  Data.f -1 ,  0 ,  1 ,  0 ,  1 
  Data.f  1 ,  0 ,  1 ,  1 ,  1 
  Data.f  1 ,  0 , -1 ,  1 ,  0 
  
  Data.f -1 , -1 ,  0 ,  0 ,  0 
  Data.f -1 ,  1 ,  0 ,  0 ,  1 
  Data.f  1 ,  1 ,  0 ,  1 ,  1 
  Data.f  1 , -1 ,  0 ,  1 ,  0 
  
  Data.f  0 , -1 , -1 ,  0 ,  0 
  Data.f  0 , -1 ,  1 ,  0 ,  1 
  Data.f  0 ,  1 ,  1 ,  1 ,  1 
  Data.f  0 ,  1 , -1 ,  1 ,  0 
  
    
  PointToTriangle2:
  ;; p0,p1,p2 , rechts herum
  Data.l 0,1,2
  Data.l 2,3,0
  Data.l 4,5,6
  Data.l 6,7,4
  Data.l 8,9,10
  Data.l 10,11,8
  
EndDataSection 

TFT seid 1989 , Turgut Frank Temucin , CH-Dachsen/DE-Berlin/TR-Antalya
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung

PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler :-)
Benutzeravatar
tft
Beiträge: 650
Registriert: 08.09.2004 20:18
Computerausstattung: GFX 3060 Ti , i7 12700F , 32 GB Ram , 900 GB SSD , TV
Wohnort: Dachsen
Kontaktdaten:

Beitrag von tft »

Code: Alles auswählen

;
; -------------------------------------------------------------------------------
;
;   PureBasic - Irrlicht
;
;   Von 0 auf 100 (c) 2008 - TFT
;
;   Part 015
;   IrrAddDeleteAnimator()
;
; -------------------------------------------------------------------------------
;
; In allen Parts sind die Komentare des vorherigen Parts gelöscht. Und der Code 
; soweit gerafft. Das die Übersichtlichkeit nicht all zu arg leidet. Die neuen
; Code Segmente sind mit ;--- gekenzeichnet. Das Procedure Fenster zeigt die
; entsprechenden Sprungmarken.
;
; Bei den Exlosionen ist schön zu sehen, das es Mittelgrosse und kleine Steine
; Gibt. Die Colisionsrutine berücksichtigt zur Zeit alle objecte die in der
; StoneListe eingetragen sind. Das gild natürlich auch für die kleinen steine
; die eigentlich da nicht hinein gehören. Irrlicht stellt eine Funktion zur
; Verfügung, die es elaubt objecte nach einer Zeit X automatisch zu löschen.
; Da wir dies ja auch mit einem Timer realisieren. Striken wir das ganze
; in diesem Part mal um.

XIncludeFile "Irr3DRequester_mod.pb"
Irr3DRequester(#IRR3DREQ_SKIP)

; ----------------------------------------------------------------------------------------

Structure NodeListe

    *node.irr_node
    visible.l
    ColRadius.f
    live.l
    *Move_animator.irr_animator
    *Turn_animator.irr_animator
    *parent.l
    xd.f
    yd.f
    zd.f
    mass.l
    time.l
       
EndStructure

; ----------------------------------------------------------------------------------------

neustart:

; ----------------------------------------------------------------------------------------

ScrX.l=irr3DRequesterSetting\videomode\dimension\width
ScrY.l=irr3DRequesterSetting\videomode\dimension\height
LeftMouseBotonDown.l=0
RigtMouseBotonDown.l=0

EndTimer.l=90000

; ----------------------------------------------------------------------------------------

*camera.irr_camera = IrrAddCamera( 0,0,0, 0,0,1 )

IrrSetCameraClipDistance(*Camera,10000)
IrrSetCameraNearValue(*Camera,0.1)

; ----------------------------------------------------------------------------------------

*BitmapFont = IrrGetFont ( "bitmapfont.bmp" )

; ----------------------------------------------------------------------------------------
 
NewList stone_liste.NodeListe()

*Stone_Mesh.irr_mesh = IrrGetMesh("stone1.ms3d")
*StoneTexture.irr_texture = IrrGetTexture("stone1.jpg")  
    
; ----------------------------------------------------------------------------------------
 
Restore ObjectData
Read a.l
Read b.l
Read Pfad.s

Dim verts.IRR_VERT(a)
Dim indices.w(b*3)
 
Restore ObjectPoint
For i=0 To a-1
  Read mx.f
  Read my.f
  Read mz.f
  Read tx.f
  Read ty.f
  vc.l = $00FFFFFF
  verts(i)\X = mx 
  verts(i)\Y = my  
  verts(i)\Z = mz 
  verts(i)\texture_x = tx  
  verts(i)\texture_y = ty 
  verts(i)\vcolor = vc
Next
  
Restore PointToTriangle
For i=0 To (b*3)-1
  Read p.l
  indices(i)  = p
Next 
     
*schuss_mesh.irr_mesh = IrrCreateMesh( "TestMesh", a, @verts(0), b*3, @indices(0))
*SchussTexture.irr_texture = IrrGetTexture( Pfad.s )

NewList schuss_liste.NodeListe()

; ----------------------------------------------------------------------------------------
 
Restore ObjectData2
Read a.l
Read b.l
Read Pfad.s

Dim verts.IRR_VERT(a)
Dim indices.w(b*3)
 
Restore ObjectPoint2
For i=0 To a-1
  Read mx.f
  Read my.f
  Read mz.f
  Read tx.f
  Read ty.f
  vc.l = $00FFFFFF
  verts(i)\X = mx 
  verts(i)\Y = my  
  verts(i)\Z = mz 
  verts(i)\texture_x = tx  
  verts(i)\texture_y = ty 
  verts(i)\vcolor = vc
Next
  
Restore PointToTriangle2
For i=0 To (b*3)-1
  Read p.l
  indices(i)  = p
Next 
     
*explosion_mesh.irr_mesh = IrrCreateMesh( "TestMesh", a, @verts(0), b*3, @indices(0))
*explosionTexture.irr_texture = IrrGetTexture( Pfad.s )

NewList explosion_liste.NodeListe()

; ----------------------------------------------------------------------------------------

*welt_node.irr_node = IrrAddEmptySceneNode()

; ----------------------------------------------------------------------------------------

*flieger_mesh.irr_mesh=IrrGetMesh("ship.x") ; Object Scalierung bei DOGA 0.001
*flieger_node=IrrAddMeshToScene(*flieger_mesh)
IrrSetNodeScale(*flieger_node,0.1,0.1,0.1)
IrrSetNodeMaterialFlag( *flieger_node,#IRR_EMF_LIGHTING, #IRR_OFF )
IrrSetNodeMaterialFlag( *flieger_node, #IRR_EMF_BACK_FACE_CULLING, #IRR_OFF) 
IrrSetNodeRotation( *flieger_node,0,180,0)
IrrSetNodePosition( *flieger_node,0,-0.05,0.15)


*cube.irr_node=IrrAddCubeSceneNode(0.02)
IrrSetNodeMaterialFlag( *cube,#IRR_EMF_LIGHTING, #IRR_OFF )
IrrSetNodeMaterialFlag( *cube, #IRR_EMF_BACK_FACE_CULLING, #IRR_On) 
IrrSetNodeMaterialType( *cube, #IRR_EMT_TRANSPARENT_ADD_COLOR)
IrrSetNodePosition( *cube,0,0,0.15)
*CubeTexture.irr_texture = IrrGetTexture( "test.bmp" )
*CubeBlank.irr_texture = IrrGetTexture( "blank.bmp" )
IrrSetNodeMaterialTexture( *cube, *CubeTexture, 0 )

; ----------------------------------------------------------------------------------------

Rtimer=ElapsedMilliseconds()+EndTimer.l

; ----------------------------------------------------------------------------------------

*SkyTexture.irr_texture = IrrGetTexture("ba-left.jpg")
If Not *SkyTexture
  Debug "*"
EndIf
*SkyBox = IrrAddSkyBoxToScene( *CubeBlank,*CubeBlank,*CubeBlank,*CubeBlank,*CubeBlank,*SkyTexture)

; ----------------------------------------------------------------------------------------

If IrrKlangStart()=0
  End
EndIf

 *fx1_soundsource = IrrKlangAddSound("explosion.wav")
 *fx2_soundsource = IrrKlangAddSound("bell.wav")
 
Repeat
 
      If Rtimer<=ElapsedMilliseconds()
        en=3
      EndIf
 ; ----------------------------------------------------------------------------------------

      el.l=ElapsedMilliseconds()
      If fpst.l<el.l
        fpst.l=el.l+1000
        fpsl.l=fps.l
        fps.l=0
        alpha.f=(1000/fpsl)
      EndIf
      fps.l=fps.l+1

; ----------------------------------------------------------------------------------------
           
      If IrrRunning()=0
         en=1
      EndIf

; ----------------------------------------------------------------------------------------
             
      While IrrKeyEventAvailable()
          
          *KeyEvent.irr_key_event = IrrReadKeyEvent()
  
          Select *KeyEvent\key
          Case #IRR_KEY_ESCAPE
            en=1
          Case #IRR_KEY_F12
            en=2
          EndSelect
          
      Wend

; ----------------------------------------------------------------------------------------
      
      LeftMouseBotonHit.l=0
      RigtMouseBotonHit.l=0
      WheelHit.l=0
      
      While IrrMouseEventAvailable()
          
          *MouseEvent.irr_mouse_event = IrrReadMouseEvent()
          
          Select *MouseEvent\action 
          Case #IRR_EMIE_MOUSE_MOVED
            MouseSpeedX.l=MouseX.l-*MouseEvent\X
            MouseSpeedY.l=MouseY.l-*MouseEvent\Y
            MouseX.l= *MouseEvent\X
            MouseY.l= *MouseEvent\Y
          Case #IRR_EMIE_MOUSE_WHEEL
            WheelHit.l=*MouseEvent\wheel
          Case #IRR_EMIE_LMOUSE_PRESSED_DOWN
            LeftMouseBotonDown.l=1
            LeftMouseBotonHit.l=1
          Case #IRR_EMIE_LMOUSE_LEFT_UP
            LeftMouseBotonDown.l=0
          Case #IRR_EMIE_RMOUSE_PRESSED_DOWN
            RigtMouseBotonDown.l=1
            RigtMouseBotonHit.l=1
          Case #IRR_EMIE_RMOUSE_LEFT_UP
            RigtMouseBotonDown.l=0
          EndSelect
      
      Wend
; ----------------------------------------------------------------------------------------

      nx.f=((ScrX.l/2)-MouseX)/50.0
      ny.f=((ScrY.l/2)-MouseY)/-50.0
      IrrSetNodePosition(*welt_node,nx.f,ny.f,0)
      
      ikx.f=nx.f*-1
      iky.f=ny.f*-1
      
; ----------------------------------------------------------------------------------------

      If StoneTimer.l<ElapsedMilliseconds()
        StoneTimer.l=ElapsedMilliseconds()+300
        AddElement(stone_liste())
        stone_liste()\node=IrrAddMeshToScene(*stone_mesh)
        stone_liste()\visible=0
        stone_liste()\ColRadius=1.0
        stone_liste()\live=10
        stone_liste()\mass=5
        stone_liste()\time=-1
        IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_LIGHTING, #IRR_Off )
        IrrSetNodeMaterialTexture( stone_liste()\node, *stonetexture, 0 )
        IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_BACK_FACE_CULLING, #IRR_On) 
        IrrSetNodeMaterialType( stone_liste()\node, #IRR_EMT_SOLID)
        
        x.f=(250-Random(500))/30
        y.f=(250-Random(500))/30
        
        IrrSetNodeID( stone_liste()\node,@stone_liste())
        IrrAddChildToParent(stone_liste()\node,*welt_node)
          
        IrrSetNodePosition(stone_liste()\node,x.f,y.f,80)
        stone_liste()\Move_animator=IrrAddFlyStraightAnimator(stone_liste()\node,x.f,y.f,40,x.f,y.f,-10,9000,0)
        IrrSetNodeScale(stone_liste()\node,0.01,0.01,0.01)
      EndIf
      
; ----------------------------------------------------------------------------------------
      
      If LeftMouseBotonDown.l=1
        If schuss_interval_timer.l<ElapsedMilliseconds()
          schuss_interval_timer.l=ElapsedMilliseconds()+100
          AddElement(schuss_liste())
          schuss_liste()\node=IrrAddMeshToScene(*schuss_mesh)
          schuss_liste()\visible=0
          schuss_liste()\ColRadius=0.05
          schuss_liste()\live=1
          schuss_liste()\mass=1
          schuss_liste()\time=-1
          IrrSetNodeMaterialFlag( schuss_liste()\node, #IRR_EMF_LIGHTING, #IRR_On )
          IrrSetNodeMaterialTexture( schuss_liste()\node, *CubeBlank, 0 )
          IrrSetNodeMaterialFlag( schuss_liste()\node, #IRR_EMF_BACK_FACE_CULLING, #IRR_Off) 
          IrrSetNodeMaterialType( schuss_liste()\node, #IRR_EMT_TRANSPARENT_ADD_COLOR)
          
          nx.f=((ScrX.l/2)-MouseX)/-50.0
          ny.f=(((ScrY.l/2)-MouseY)/50.0)-0.05
          nz.f=0.4
          
          IrrSetNodeID( schuss_liste()\node,@schuss_liste())
          IrrAddChildToParent(schuss_liste()\node,*welt_node)
          
          IrrSetNodePosition(schuss_liste()\node,nx.f,ny.f,0.2)
          schuss_liste()\Move_animator=IrrAddFlyStraightAnimator(schuss_liste()\node,nx.f,ny.f,nz.f,nx.f,ny.f,30,5000,0)
          schuss_liste()\Turn_animator=IrrAddRotationAnimator(schuss_liste()\node,0,0,10)
          IrrSetNodeScale(schuss_liste()\node,0.1,0.1,0.3)
        EndIf
      EndIf

; ----------------------------------------------------------------------------------------
      
      IrrBeginScene(0, 0, 55 )  
      IrrDrawScene()
      
      Irr2DFontDraw ( *BitmapFont,"Punkte = "+Str(counter.l),4,4,0,0)
      Irr2DFontDraw ( *BitmapFont,"Timer = "+Str((rtimer-el)/1000),4,40,0,0)
      
      IrrEndScene()
      
      Delay(1)
 
 ; ----------------------------------------------------------------------------------------
      
      ResetList(schuss_liste())
      ForEach schuss_liste()
        IrrGetNodePosition(schuss_liste()\node,@sx.f,@sy.f,@sz.f)
        If sz.f>20.0
          IrrRemoveAnimator(schuss_liste()\node,schuss_liste()\move_animator)
          IrrRemoveNode(schuss_liste()\node)
          DeleteElement(schuss_liste())
        Else
          If schuss_liste()\visible=0
            IrrSetNodeMaterialTexture( schuss_liste()\node, *SchussTexture, 0 )
            IrrSetNodeMaterialFlag( schuss_liste()\node, #IRR_EMF_LIGHTING, #IRR_Off )
            IrrSetNodeMaterialType( schuss_liste()\node, #IRR_EMT_TRANSPARENT_ADD_COLOR)
            schuss_liste()\visible=1
          Else
            
            ResetList(stone_liste())
            ForEach stone_liste()
              IrrGetNodePosition(stone_liste()\node,@cx.f,@cy.f,@cz.f)
 
              ex.f=Abs(cx.f-sx.f)
              ey.f=Abs(cy.f-sy.f)
              ez.f=Abs(cz.f-sz.f)
              c1.f=Sqr((ex.f*ex.f)+Sqr((ey.f*ey.f)+(ez.f*ez.f)))-stone_liste()\ColRadius-schuss_liste()\ColRadius
              If c1.f<=0
              
                IrrRemoveAnimator(schuss_liste()\node,schuss_liste()\move_animator)
                IrrRemoveNode(schuss_liste()\node)
                DeleteElement(schuss_liste())
   
                AddElement(explosion_liste())
                explosion_liste()\visible=-1
                explosion_liste()\node=IrrAddMeshToScene(*explosion_mesh)
                IrrSetNodeScale(explosion_liste()\node,0.4,0.4,0.4)
               
                IrrSetNodeID( explosion_liste()\node,@explosion_liste())
                IrrAddChildToParent(explosion_liste()\node,*welt_node)

                explosion_liste()\parent = stone_liste()\node
                explosion_liste()\xd.f=(sx.f-cx.f)*1
                explosion_liste()\yd.f=(sy.f-cy.f)*1
                explosion_liste()\zd.f=(sz.f-cz.f)*1
                
                IrrSetNodePosition(explosion_liste()\node,sx.f,sy.f,sz.f)
                                                
                IrrSetNodeMaterialFlag( explosion_liste()\node, #IRR_EMF_LIGHTING, #IRR_On )
                IrrSetNodeMaterialTexture( explosion_liste()\node, *CubeBlank, 0 )
                IrrSetNodeMaterialFlag( explosion_liste()\node, #IRR_EMF_BACK_FACE_CULLING, #IRR_On) 
                IrrSetNodeMaterialType( explosion_liste()\node, #IRR_EMT_TRANSPARENT_ADD_COLOR)

                stone_liste()\live=stone_liste()\live-1
                
                Break
              EndIf 
            Next
           
          EndIf
        EndIf
        
      Next
      
      addexplosion.l=0
      addexplosionmass.l=0
      
      ResetList(stone_liste())
      ForEach stone_liste()
         IrrGetNodePosition(stone_liste()\node,@x.f,@y.f,@z.f)
         If z.f<-8 Or stone_liste()\live<=0 Or (stone_liste()\time>0 And stone_liste()\time<ElapsedMilliseconds())
            If stone_liste()\move_animator
              IrrRemoveAnimator(stone_liste()\node,stone_liste()\move_animator)
            EndIf
            If stone_liste()\turn_animator
              IrrRemoveAnimator(stone_liste()\node,stone_liste()\turn_animator)
            EndIf
 
            If  stone_liste()\live<=0 And stone_liste()\mass>0
              addexplosion.l=1
              addexplosionmass.l=stone_liste()\mass
              IrrGetNodePosition(stone_liste()\node,@sx.f,@sy.f,@sz.f)
            EndIf
            
            ResetList(explosion_liste())
            ForEach explosion_liste()
              If explosion_liste()\parent=stone_liste()\node
                explosion_liste()\parent=0
              EndIf
            Next
            
            IrrRemoveNode(stone_liste()\node)
            DeleteElement(stone_liste())
            
         EndIf   
      Next 
      
      IrrKlangListenerPosition(ikx.f,iky.f,0, ikx.f,iky.f,1,  0,0,0,  0,0,0)     
      
      If addexplosion.l>0
            If addexplosionmass.l>2
              
              *fx_sound.l=IrrKlangPlay3D(*fx1_soundsource, sx.f,sy.f,sz.f , #False,#False, #True)
              If *fx_sound <> #Null
                IrrKlangSoundSetMinDistance(*fx_sound, 6)
                IrrKlangSoundSetMaxDistance(*fx_sound, 80)
              EndIf
                         
              counter.l=counter.l+10
              
              For i=0 To 8
                AddElement(stone_liste())
                stone_liste()\node=IrrAddMeshToScene(*stone_mesh)
                stone_liste()\visible=0
                stone_liste()\ColRadius=0.5
                stone_liste()\live=1
                stone_liste()\mass=2
                stone_liste()\time=10000+ElapsedMilliseconds()
                IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_LIGHTING, #IRR_Off )
                IrrSetNodeMaterialTexture( stone_liste()\node, *stonetexture, 0 )
                IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_BACK_FACE_CULLING, #IRR_On) 
                IrrSetNodeMaterialType( stone_liste()\node, #IRR_EMT_SOLID)
                
                IrrSetNodeID( stone_liste()\node,@stone_liste())
                IrrAddChildToParent(stone_liste()\node,*welt_node)
                
                x.f=(100-Random(200))
                y.f=(100-Random(200))
                z.f=(100-Random(200))
                
                IrrSetNodePosition(stone_liste()\node,sx.f,sy.f,sz.f)
                stone_liste()\Move_animator=IrrAddFlyStraightAnimator(stone_liste()\node,sx.f,sy.f,sz.f,sx.f+x.f,sy.f+y.f,sz.f+z.f,30000,0)
                IrrSetNodeScale(stone_liste()\node,0.0025,0.0025,0.0025)  
              Next
            Else
              counter.l=counter.l+100
 
              If addexplosionmass.l=1
                Rtimer.l=Rtimer.l+5000
                
                *fx_sound=IrrKlangPlay3D(*fx2_soundsource, sx.f,sy.f,sz.f , #False,#False, #True)
                If *fx_sound <> #Null
                  IrrKlangSoundSetMinDistance(*fx_sound, 6)
                  IrrKlangSoundSetMaxDistance(*fx_sound, 80)
                EndIf
              EndIf
              
            EndIf
            
            For i=0 To 8
                            
              *stone.irr_node=IrrAddMeshToScene(*stone_mesh)
               
              IrrSetNodeMaterialFlag( *stone, #IRR_EMF_LIGHTING, #IRR_Off )
              IrrSetNodeMaterialTexture( *stone, *stonetexture, 0 )
              IrrSetNodeMaterialFlag( *stone, #IRR_EMF_BACK_FACE_CULLING, #IRR_On) 
              IrrSetNodeMaterialType( *stone, #IRR_EMT_SOLID)
              
              IrrAddChildToParent(*stone,*welt_node)
              
              ;--- Der Timer zum automatische löschen der Node
              ;
              ; für Objecte die nicht weiter mit ihrer Umgebung interagieren ist das
              ; eine einfache methode um die Resurcen automatisch freizugenben
              
              IrrAddDeleteAnimator(*stone,3000)
              
              x.f=(100-Random(200))
              y.f=(100-Random(200))
              z.f=(100-Random(200))
              
              IrrSetNodePosition(*stone,sx.f,sy.f,sz.f)
              IrrAddFlyStraightAnimator(*stone,sx.f,sy.f,sz.f,sx.f+x.f,sy.f+y.f,sz.f+z.f,15000,0)
              IrrSetNodeScale(*stone,0.0005,0.0005,0.0005)  
            
            Next
            
            ;--- Bonie Automatisch reduzieren
            If Random(1+BoniDef.f)=1
                
                BoniDef.f=BoniDef.f+0.2
                
                AddElement(stone_liste())
                stone_liste()\node=IrrAddMeshToScene(*explosion_mesh)
                stone_liste()\visible=0
                stone_liste()\ColRadius=0.5
                stone_liste()\live=1
                stone_liste()\mass=1
                stone_liste()\time=8000+ElapsedMilliseconds()               
                IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_LIGHTING, #IRR_Off )
                IrrSetNodeMaterialTexture( stone_liste()\node, *CubeTexture, 0 )
                IrrSetNodeMaterialFlag( stone_liste()\node, #IRR_EMF_BACK_FACE_CULLING, #IRR_Off) 
                IrrSetNodeMaterialType( stone_liste()\node, #IRR_EMT_TRANSPARENT_ADD_COLOR)
                
                IrrSetNodeID( stone_liste()\node,@stone_liste())
                IrrAddChildToParent(stone_liste()\node,*welt_node)
                
                x.f=(100-Random(200))
                y.f=(100-Random(200))
                z.f=(100-Random(200))
                
                IrrSetNodePosition(stone_liste()\node,sx.f,sy.f,sz.f)
                stone_liste()\Move_animator=IrrAddFlyStraightAnimator(stone_liste()\node,sx.f,sy.f,sz.f,sx.f+x.f,sy.f+y.f,sz.f+z.f,45000,0)
                stone_liste()\Turn_animator=IrrAddRotationAnimator(stone_liste()\node,0.3,0.5,0.9)
 
                IrrSetNodeScale(stone_liste()\node,0.4,0.4,0.4)
                  
            EndIf
      EndIf
      
; ----------------------------------------------------------------------------------------

      anim.f=0.001*alpha.f

      ResetList(explosion_liste())
      ForEach explosion_liste()
        If explosion_liste()\visible=0
          IrrSetNodeMaterialTexture( explosion_liste()\node, *explosionTexture, 0 )
          IrrSetNodeMaterialFlag( explosion_liste()\node, #IRR_EMF_LIGHTING, #IRR_Off )
          explosion_liste()\visible=1
        ElseIf explosion_liste()\visible=-1
          explosion_liste()\visible=0
        ElseIf explosion_liste()\visible=1
          IrrGetNodeScale(explosion_liste()\node,@x.f,@y.f,@z.f)
          If x.f<0.01
            IrrRemoveNode(explosion_liste()\node)
            DeleteElement(explosion_liste())
          Else
             IrrSetNodeScale(explosion_liste()\node,x.f-anim.f,y.f-anim.f,z.f-anim.f)
             If explosion_liste()\parent>0
                IrrGetNodePosition(explosion_liste()\parent,@sx.f,@sy.f,@sz.f)
                IrrSetNodePosition(explosion_liste()\node,sx.f+explosion_liste()\xd.f,sy.f+explosion_liste()\yd.f,sz.f+explosion_liste()\zd.f)
             EndIf
          EndIf
        EndIf
      Next

; ----------------------------------------------------------------------------------------
      
Until en>0

If en=2
  en=0
  ResetList(schuss_liste())
  ForEach schuss_liste()
    IrrRemoveAnimator(schuss_liste()\node,schuss_liste()\move_animator)
    IrrRemoveAnimator(schuss_liste()\node,schuss_liste()\turn_animator)
    IrrRemoveNode(schuss_liste()\node)
    DeleteElement(schuss_liste())
  Next
  ResetList(explosion_liste())
  ForEach explosion_liste()
    IrrRemoveNode(explosion_liste()\node)
    DeleteElement(explosion_liste())
  Next
    ResetList(stone_liste())
    ForEach stone_liste()
      If stone_liste()\move_animator
        IrrRemoveAnimator(stone_liste()\node,stone_liste()\move_animator)
      EndIf
      If stone_liste()\turn_animator
        IrrRemoveAnimator(stone_liste()\node,stone_liste()\turn_animator)
      EndIf
      IrrRemoveNode(stone_liste()\node)
      DeleteElement(stone_liste())
    Next
    IrrStop()
    Irr3DRequester()
    Goto neustart

ElseIf en=3

    en=0
        
    Rtimer=ElapsedMilliseconds()+3000
        
    Repeat
 
        IrrBeginScene(0, 0, 55 )  
        IrrDrawScene()
             
        Irr2DFontDraw ( *BitmapFont,"Punkte = "+Str(counter.l),4,4,0,0)
        Irr2DFontDraw ( *BitmapFont,"GameOver ",4,80,0,0)
          
        IrrEndScene()
            
             
        Delay(10)
     
        If Rtimer=< ElapsedMilliseconds()
          en=2
        EndIf
             
    Until en=2 

EndIf

IrrStop()
 
End 

; ----------------------------------------------------------------------------------------

DataSection

  Objectdata:
  ;; Anzahl Punkte,Anzahl Dreiecke, Texture
  Data.l 16,8
  Data.s "fire.bmp"
    
  ObjectPoint:
  ;; x,y,z,tex_x,tex_y,v_col
  Data.f -1 ,  0 , -1 ,  0 ,  0 
  Data.f -1 ,  0 ,  1 ,  0 ,  1 
  Data.f  1 ,  0 ,  1 ,  1 ,  1 
  Data.f  1 ,  0 , -1 ,  1 ,  0 
    
  Data.f -0.7 ,  0.7 , -1 ,  0 ,  0 
  Data.f -0.7 ,  0.7 ,  1 ,  0 ,  1 
  Data.f  0.7 , -0.7 ,  1 ,  1 ,  1 
  Data.f  0.7 , -0.7 , -1 ,  1 ,  0 
    
  Data.f  0 , -1 , -1 ,  0 ,  0 
  Data.f  0 , -1 ,  1 ,  0 ,  1 
  Data.f  0 ,  1 ,  1 ,  1 ,  1 
  Data.f  0 ,  1 , -1 ,  1 ,  0 
   
  Data.f -0.7 , -0.7 , -1 ,  0 ,  0 
  Data.f -0.7 , -0.7 ,  1 ,  0 ,  1 
  Data.f  0.7 ,  0.7 ,  1 ,  1 ,  1 
  Data.f  0.7 ,  0.7 , -1 ,  1 ,  0 
    
  PointToTriangle:
  ;; p0,p1,p2 , rechts herum
  Data.l 0,1,2
  Data.l 2,3,0
  Data.l 4,5,6
  Data.l 6,7,4
  Data.l 8,9,10
  Data.l 10,11,8
  Data.l 12,13,14
  Data.l 14,15,12
  
  Objectdata2:
  ;; Anzahl Punkte,Anzahl Dreiecke, Texture
  Data.l 12,6
  Data.s "spark.bmp"
    
  ObjectPoint2:
  ;; x,y,z,tex_x,tex_y,v_col
  Data.f -1 ,  0 , -1 ,  0 ,  0 
  Data.f -1 ,  0 ,  1 ,  0 ,  1 
  Data.f  1 ,  0 ,  1 ,  1 ,  1 
  Data.f  1 ,  0 , -1 ,  1 ,  0 
  
  Data.f -1 , -1 ,  0 ,  0 ,  0 
  Data.f -1 ,  1 ,  0 ,  0 ,  1 
  Data.f  1 ,  1 ,  0 ,  1 ,  1 
  Data.f  1 , -1 ,  0 ,  1 ,  0 
  
  Data.f  0 , -1 , -1 ,  0 ,  0 
  Data.f  0 , -1 ,  1 ,  0 ,  1 
  Data.f  0 ,  1 ,  1 ,  1 ,  1 
  Data.f  0 ,  1 , -1 ,  1 ,  0 
  
    
  PointToTriangle2:
  ;; p0,p1,p2 , rechts herum
  Data.l 0,1,2
  Data.l 2,3,0
  Data.l 4,5,6
  Data.l 6,7,4
  Data.l 8,9,10
  Data.l 10,11,8
  
EndDataSection 

TFT seid 1989 , Turgut Frank Temucin , CH-Dachsen/DE-Berlin/TR-Antalya
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung

PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler :-)
Benutzeravatar
tft
Beiträge: 650
Registriert: 08.09.2004 20:18
Computerausstattung: GFX 3060 Ti , i7 12700F , 32 GB Ram , 900 GB SSD , TV
Wohnort: Dachsen
Kontaktdaten:

Beitrag von tft »

Code: Alles auswählen

;
; -------------------------------------------------------------------------------
;
;   PureBasic - Irrlicht
;
;   Von 0 auf 100 (c) 2008 - TFT
;
;   Part 016
;
; -------------------------------------------------------------------------------
;
; In allen Parts sind die Komentare des vorherigen Parts gelöscht. Und der Code 
; soweit gerafft. Das die Übersichtlichkeit nicht all zu arg leidet. Die neuen
; Code Segmente sind mit ;--- gekenzeichnet. Das Procedure Fenster zeigt die
; entsprechenden Sprungmarken.
;
; in diesem Teil, wird es keinen neuen Irrlicht befehl geben. Aber dafür werden wier
; das Tutoriel etwas aufreumen. Denn mit der Zeit ist es mühsam. Immer den gesamten
; Code durchgehen zu müssen. Daher werden die einzelnen Abschnitt in Includes verpackt.
; Abschitte in denen etwas geändert wird. Werden kommplet abgebildet und das Include 
; ausgeklammert.


IncludeFile "Irr3DRequester_mod.pbi"
Irr3DRequester(#IRR3DREQ_SKIP)


IncludeFile "strukturen.pbi"
IncludeFile "init-allgemein.pbi"
IncludeFile "init-stone.pbi"
IncludeFile "init-schuss.pbi"
IncludeFile "init-schuss-aufschlag.pbi"
IncludeFile "init-player-chip.pbi"
IncludeFile "init-hud.pbi"
IncludeFile "init-skybox.pbi"
IncludeFile "init-irrklang.pbi"

Repeat
 
  IncludeFile "all-loops.pbi"  
  IncludeFile "add-stone.pbi"  
  IncludeFile "add-schuss.pbi"  
  IncludeFile "irr-draw.pbi" 
  IncludeFile "colisions-test.pbi"   
  IncludeFile "remove-stone.pbi"    
  IncludeFile "add-stone-explosion.pbi"
  IncludeFile "calc-schuss-aufschlag.pbi"

Until en>0

IncludeFile "end.pbi"
 
End 

; ----------------------------------------------------------------------------------------


TFT seid 1989 , Turgut Frank Temucin , CH-Dachsen/DE-Berlin/TR-Antalya
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung

PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler :-)
Antworten