Use cursor and mouse.
Code: Select all
;Ribbon example by kelebrindae
;
;http://www.purebasic.fr/french/viewtopic.php?f=13&t=11748&start=10
#PB_Engine_Space_Local=1
#PB_Engine_Space_Parent=2
#PB_Engine_Space_World=4
#PB_Engine_Absolute_Rotation=8
#PB_Engine_Relative_Rotation=16
#PB_Engine_Quaternion_Rotation=32
#PB_Engine_Euler_Rotation=64
Global RotationAbs = #PB_Engine_Euler_Rotation | #PB_Engine_Absolute_Rotation
Global RotationRel = #PB_Engine_Euler_Rotation | #PB_Engine_Relative_Rotation
#PlayerSpeed = 4
#Camera = 0
Enumeration
#VueArriere
#VueDessus
EndEnumeration
Macro NEW_X(x, Angle, Distance)
((x) + Cos(Radian(Angle)) * (Distance))
EndMacro
Macro NEW_Z(z, Angle, Distance)
((z) + Sin(Radian(Angle)) * (Distance))
EndMacro
Structure Bullet
Bullet.i
numNode.i
numRibbon.i
timer.f
DirectionX.f
DirectionY.f
DirectionZ.f
Speed.f
Life.l
EndStructure
NewList Bullets.Bullet()
;-Variable and tab
Define.f KeyX, KeyY, MouseX, MouseY
Define.l i, j, Color
Define.f AngleCanon,Pas
Color = $0000FF
Pas = 0.05
AngleTourelle = 0
TirMax = 400
Time = ElapsedMilliseconds()
d.f=170
Declare GestionCamera(Mode.l)
Declare CreatePyramideCube(x.f, y.f, z.f, MeshPyramide, PyramideMaterial)
If InitEngine3D()
InitSprite()
InitKeyboard()
InitMouse()
ExamineDesktops()
OpenScreen(DesktopWidth(0), DesktopHeight(0), DesktopDepth(0), "char")
WorldShadows(#PB_Shadow_Modulative)
EnableWorldPhysics(#True)
EnableWorldCollisions(#True)
;-Texture
Add3DArchive(".",#PB_3DArchive_FileSystem)
CreateImage(0,128, 128)
StartDrawing(ImageOutput(0))
Box(0, 0, 128, 128, $FFFFFF)
StopDrawing()
SaveImage(0,"temp.bmp")
FreeImage(0)
LoadTexture(0,"temp.bmp")
DeleteFile("temp.bmp")
; Ribbon texture
CreateImage(0,128, 1)
StartDrawing(ImageOutput(0))
DrawingMode(#PB_2DDrawing_Gradient)
BackColor($000000)
GradientColor(0.5, $FFFFFF)
FrontColor($0000)
LinearGradient(0, 0, 128, 0)
Box(0, 0, 128, 1)
StopDrawing()
SaveImage(0,"temp2.bmp")
FreeImage(0)
LoadTexture(1,"temp2.bmp")
DeleteFile("temp2.bmp")
;-Material
;Tank
CreateMaterial(0, TextureID(0))
MaterialAmbientColor(0, $00FFFF)
;Bullet
CreateMaterial(1, TextureID(0))
MaterialAmbientColor(1, Color)
;Sol
CreateMaterial(5, TextureID(0))
MaterialAmbientColor(5, $00FF00)
;Pyramide
CreateMaterial(6, TextureID(0))
MaterialAmbientColor(6, $4400CC)
;Ribbon
CreateMaterial(7,TextureID(1)) ; ribbons
MaterialDepthWrite(7, #False)
DisableMaterialLighting(7,#True)
MaterialBlendingMode(7,#PB_Material_Add)
MaterialFilteringMode(7,#PB_Material_None)
;-Create Sol
Sol = CreatePlane(#PB_Any, 100, 100, 20, 20, 20, 20)
CreateEntity (5, MeshID(Sol), MaterialID(5))
EntityRenderMode(5, 0) ; Disable shadow casting for this entity as it's our plan
EntityPhysicBody(5, #PB_Entity_StaticBody)
;-Create Pyramide
MeshPyramide = CreateCube(#PB_Any, 10)
Nb=7
Size=20*3+0.5
For j = 0 To Nb
For i= 0 To Nb-j
CreatePyramideCube(j*(Size/2)+i*Size, (Size/2)+(j*Size), 800, MeshPyramide, 6)
Next i
Next j
;-Corps
CreateCube(0, 20)
CreateNode(0)
CreateEntity(0, MeshID(0), MaterialID(0))
ScaleEntity(0,8,2,4)
MoveEntity(0,0,20,0)
AttachNodeObject(0,EntityID(0),#PB_Node_Entity)
;Only for collision
CopyEntity(0,10)
ScaleEntity(10,8,2,4)
MoveEntity(10,0,20,0)
EntityPhysicBody(10, #PB_Entity_BoxBody, 47)
HideEntity(10,1)
;-Tourelle
CreateSphere(1, 30)
CreateNode(1)
CreateEntity(1, MeshID(1), MaterialID(0))
EntityRenderMode(1, 0)
AttachNodeObject(0, NodeID(1),#PB_Node_Node)
AttachNodeObject(1,EntityID(1),#PB_Node_Entity)
MoveNode(1, 0, 40, 0)
;Only for collision
CopyEntity(1, 11)
EntityPhysicBody(11, #PB_Entity_SphereBody, 47)
HideEntity(11,1)
;-Canon
CreateCylinder(2, 10, 170)
CreateEntity(2, MeshID(2), MaterialID(0))
AttachNodeObject(1,EntityID(2),#PB_Node_Entity)
RotateEntity(2,0, 0, 90)
MoveEntity(2, 80, 15, 0)
;-Cameras
CreateCamera(0, 0, 0, 100, 100)
CameraLocate(0, 0, 200, 350)
CameraLookAt(0,NodeX(0),NodeY(0),NodeZ(0))
CameraFOV(0, 50)
CameraBackColor(0,$221100)
CreateCamera(1, 0, 67, 33, 33)
CameraBackColor(1,$661100)
;-Light
CreateLight(0,RGB(125,125,125),800,500,0)
AmbientColor(RGB(85,85,85))
;-Sprite
CreateSprite(0, 400, 60)
;- >>> Main Loop
Repeat
If ExamineKeyboard()
If KeyboardReleased(#PB_Key_F1)
Mode=#VueArriere
ElseIf KeyboardReleased(#PB_Key_F2)
Mode=#VueDessus
EndIf
If KeyboardPushed(#PB_Key_Up)
NodeLocate(0, NEW_X(NodeX(0), NodeYaw(0), #PlayerSpeed), NodeY(0), NEW_Z(NodeZ(0), NodeYaw(0), #PlayerSpeed))
ElseIf KeyboardPushed(#PB_Key_Down)
NodeLocate(0, NEW_X(NodeX(0), NodeYaw(0), -#PlayerSpeed), NodeY(0), NEW_Z(NodeZ(0), NodeYaw(0), -#PlayerSpeed))
EndIf
If KeyboardPushed(#PB_Key_Left)
RotateNode(0,0, -1.2, 0, RotationRel)
ElseIf KeyboardPushed(#PB_Key_Right)
RotateNode(0,0, 1.2 ,0, RotationRel)
EndIf
EndIf
If ExamineMouse()
MouseX = -(MouseDeltaX()/10)*#Playerspeed
MouseY = -(MouseDeltaY()/10)*#PlayerSpeed
If MouseButton(#PB_MouseButton_Left) And ElapsedMilliseconds()-Time > 500
Time = ElapsedMilliseconds()
Bullet = CreateEntity(#PB_Any, MeshID(1), MaterialID(1))
ScaleEntity(Bullet,0.1,0.1,0.1)
EntityLocate(Bullet, NodeX(1) + Cos(Radian(NodeYaw(0) + NodeYaw(1))) * d, 15 + NodeY(1) -Tan(Radian(AngleCanon))* d, NodeZ(1) + Sin(Radian(NodeYaw(0) + NodeYaw(1))) * d)
EntityPhysicBody(Bullet, #PB_Entity_SphereBody, 10)
AddElement(Bullets())
With Bullets()
\Bullet = Bullet
\numNode = CreateNode(#PB_Any)
NodeLocate(\numNode, EntityX(\Bullet), EntityY(\Bullet), EntityZ(\Bullet))
\numRibbon = CreateRibbonEffect(#PB_Any,MaterialID(7),NodeID(\numNode),1,50,60*0.1, 500)
;AttachNodeObject(\numNode, EntityID(\Bullet), #PB_Node_Entity)
RibbonEffectColor(\numRibbon,Color,$FFFFFF)
\DirectionX = Cos(Radian(NodeYaw(0) + NodeYaw(1)))
\DirectionY = -Tan(Radian(AngleCanon))
\DirectionZ = Sin(Radian(NodeYaw(0) + NodeYaw(1)))
\Speed = TirMax
\Life = ElapsedMilliseconds()
EndWith
EndIf
EndIf
ForEach Bullets()
With Bullets()
ApplyEntityImpulse(\Bullet, \DirectionX*\Speed, \DirectionY*\Speed, \DirectionZ*\Speed)
NodeLocate(\numNode, EntityX(\Bullet), EntityY(\Bullet), EntityZ(\Bullet))
If ElapsedMilliseconds()-Bullets()\Life>20000
If IsEntity(\Bullet)
;FreeEntity(\Bullet)
FreeNode(\numNode)
FreeEffect(\numRibbon)
EndIf
DeleteElement(Bullets(), 1)
EndIf
EndWith
Next
AngleCanon + MouseY
If AngleCanon<-45
AngleCanon = -45
ElseIf AngleCanon>2
AngleCanon = 2
EndIf
RotateNode(1, NodePitch(1), NodeYaw(1)-MouseX, AngleCanon, RotationAbs)
RotateEntity(10, NodePitch(0), NodeYaw(0), NodeRoll(0),RotationAbs)
EntityLocate(10, EntityX(0), EntityY(0), EntityZ(0))
EntityLocate(11, NodeX(1), NodeY(1), NodeZ(1))
;Retravailler la position !
CameraLocate(1, NodeX(1), 40 + NodeY(1), NodeZ(1))
RotateCamera(1, NodePitch(1), 90+NodeYaw(0)+NodeYaw(1), AngleCanon, RotationAbs)
CameraLookAt(1, NodeX(1) + Cos(Radian(NodeYaw(0) + NodeYaw(1))) * d, 15 + NodeY(1) -Tan(Radian(AngleCanon))* d, NodeZ(1) + Sin(Radian(NodeYaw(0) + NodeYaw(1))) * d)
GestionCamera(Mode)
RenderWorld()
StartDrawing(SpriteOutput(0))
DrawText(10,10, "FPS = " +Str(Engine3DFrameRate(#PB_Engine3D_Current)), $FFFF00, $FF0000)
StopDrawing()
DisplayTransparentSprite(0,0,0)
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
Else
MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf
End
Procedure CreatePyramideCube(x.f, y.f, z.f, MeshPyramide, PyramideMaterial)
Block = CreateEntity(#PB_Any, MeshID(MeshPyramide), MaterialID(PyramideMaterial), x, y, z)
ScaleEntity(Block, 6, 6, 6)
EntityPhysicBody(Block, #PB_Entity_BoxBody, 47)
ProcedureReturn Block
EndProcedure
Procedure.f curveValue(actuelle.f, Cible.f, P.f)
If P > 1000.0
P = 1000.0
EndIf
ProcedureReturn (actuelle + ( (Cible - actuelle) * P / 1000.0))
EndProcedure
Procedure.f CurveAngle(oldangle.f,newangle.f, increments.f)
If increments>1
If (oldangle+360)-newangle<newangle-oldangle
oldangle=360+oldangle
EndIf
If (newangle+360)-oldangle<oldangle-newangle
newangle=360+newangle
EndIf
oldangle=oldangle-(oldangle-newangle)/increments
EndIf
If increments<=1
ProcedureReturn newangle
EndIf
ProcedureReturn oldangle
EndProcedure
Procedure GestionCamera(Mode.l)
Define.f Px, Py, Pz, Pv, Pp
Static AngleCamera.f
Pv = 25
Pp = 10
Select Mode
Case #VueDessus
AngleCamera = CurveAngle(AngleCamera, NodeYaw(0) + 180, Pp)
Px = CurveValue(CameraX(#Camera), NEW_X(NodeX(0), AngleCamera, 100), Pv)
Py = CurveValue(CameraY(#Camera), NodeY(0) + 1390, Pv)
Pz = CurveValue(CameraZ(#Camera), NEW_Z(NodeZ(0), AngleCamera, 100), Pv)
Case #VueArriere
AngleCamera = CurveAngle(AngleCamera, NodeYaw(0) + 180, Pp)
Px = CurveValue(CameraX(#Camera), NEW_X(NodeX(0), AngleCamera, 260), Pv)
Py = CurveValue(CameraY(#Camera), NodeY(0) + 70, Pv)
Pz = CurveValue(CameraZ(#Camera), NEW_Z(NodeZ(0), AngleCamera, 260), Pv)
EndSelect
CameraLocate(#Camera, Px, Py, Pz)
CameraLookAt(#Camera, NodeX(1), NodeY(1)+ 15, NodeZ(1))
EndProcedure