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