on pourra discuter autour de ça , supprimer le superflu , mettre les fonctions 3D dans un fichier à part , et faire un include , ça simplifiera le code principal .
Code : Tout sélectionner
;-Initialisation
#ScreenWidth = 800 : #ScreenHeight = 600 : #ScreenDepth = 16
If InitEngine3D() = 0
MessageRequester( "Erreur" , "Impossible d'initialiser la 3D , vérifiez la présence de engine3D.dll" , 0 )
End
ElseIf InitSprite() = 0 Or InitKeyboard() = 0
MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
End
ElseIf OpenScreen( #ScreenWidth , #ScreenHeight , #ScreenDepth , "Sokoban3D" ) = 0
MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 )
End
EndIf
;-Declare procedures
Declare.f WrapValue( Angle.f )
;-Structures
Structure Camera
AngleX.f
AngleY.f
CameraVue.l
CameraDist.f
CameraHaut.f
LookAtY.f
EndStructure
Structure Parametres
AngleX.f
AngleY.f
AngleZ.f
EndStructure
Dim entity.Parametres(100)
Global Camera.Camera
Camera\CameraVue = 1
;- Variables globales
Global Pas.f
;-Mesh
CreateMesh(0) ; Cube
SetMeshData(0, 0, ?CubePoints , 16)
SetMeshData(0, 1, ?CubeTriangles , 12)
SetMeshData(0, 2, ?CubeTextures , 16)
SetMeshData(0, 3, ?CubeNormales , 16)
;- Textures
CreateTexture(1,128,128)
StartDrawing(TextureOutput(1))
Box(0,0,128,128,RGB(255,255,255))
Box(2,2,124,124,RGB(200,0,0))
StopDrawing()
CreateTexture(2,128,128)
StartDrawing(TextureOutput(2))
Box(0,0,128,128,RGB(255,255,255))
Box(2,2,124,124,RGB(0,0,200))
StopDrawing()
CreateTexture(3,128,128)
StartDrawing(TextureOutput(3))
Box(0,0,128,128,RGB(255,255,255))
Box(2,2,124,124,RGB(0,200,0))
For a = 0 To 128 Step 4
For b = 0 To 128 Step 4
Circle(a,b,2,RGB(10,150,10))
Next b
Next a
StopDrawing()
;- Material
For a = 1 To 3
CreateMaterial(a, TextureID( a ))
Next a
;-Entity
Restore Entitys
For a = 0 To 1
Read materialID.l : Read Type.l
Read Longueur.f : Read Hauteur.f : Read Largeur.f
Read X.f : Read Y.f : Read Z.f
Read AngleX.f
CreateEntity(a , MeshID(0) ,MaterialID(materialID))
ScaleEntity(a , Longueur , Hauteur , Largeur )
EntityLocate(a,X,Y,Z)
entity(a)\AngleX = AngleX
RotateEntity(a,entity(a)\AngleX,0,0)
Next a
;- Camera
CreateCamera(0, 0, 0 , 100 , 100)
CameraLocate(0,0,0,20)
AmbientColor(RGB(255,255,255))
;- Procédures
Procedure.f Cosd( Angle.f )
;calcule le cos d'un angle en degré
a.f = Angle * 0.0174533
ProcedureReturn Cos( a )
EndProcedure
Procedure.f Sind( Angle.f )
;calcule le sin d'un angle en degré
a.f = Angle * 0.0174533
ProcedureReturn Sin( a )
EndProcedure
Procedure.f WrapValue( Angle.f )
;Permet de toujours avoir un angle compris entre 0° et 360°
While Angle < 0
Angle + 360
Wend
While Angle - 360 >= 0
Angle - 360
Wend
ProcedureReturn Angle
EndProcedure
Procedure.f NewXValue( X.f , Angle.f , NbUnite.f )
;r utiliser conjointement avec NewZvalue pour calculer une position de <NbUnite> dans la direction <angle>
Valeur.f = X + Cosd( Angle ) * NbUnite
ProcedureReturn Valeur
EndProcedure
Procedure.f NewZValue( Z.f , Angle.f , NbUnite.f )
;r utiliser conjointement avec NewXvalue pour calculer une position de <NbUnite> dans la direction <angle>
Valeur.f = Z - Sind( Angle ) * NbUnite
ProcedureReturn Valeur
EndProcedure
Procedure.f EcartAngle( angle1.f , angle2.f )
; simplifier tout ça
If angle1 > 180
ecart2.f = 360 - angle1
Else
ecart2.f = angle1
EndIf
If angle2 > 180
ecart1.f = 360 - angle2
Else
ecart1.f = angle2
EndIf
If Abs( WrapValue( angle2 ) - WrapValue( angle1 ) ) > 180
If angle2 < angle1
Delta.f = ( ecart1 + ecart2 )
Else
Delta.f = ( ecart1 + ecart2 ) * -1
EndIf
Else
Delta.f = WrapValue( angle2 ) - WrapValue( angle1 )
EndIf
ProcedureReturn Delta
EndProcedure
Procedure.f CurveAngle( Actuelle.f , Cible.f , P.f )
;Calcule un angle progressif allant de la valeur actuelle r la valeur cible
Delta.f = EcartAngle( Actuelle , Cible )
If P > 1000 : P = 1000 : EndIf
Valeur.f = Actuelle + ( Delta * P / 1000 )
ProcedureReturn WrapValue( Valeur )
EndProcedure
Procedure.f CurveValue( Actuelle.f , Cible.f , P.f )
;Calcule une valeur progressive allant de la valeur actuelle r la valeur cible
Delta.f = Cible - Actuelle
If P > 1000 : P = 1000 : EndIf
Valeur.f = Actuelle + ( Delta * P / 1000 )
ProcedureReturn Valeur
EndProcedure
Procedure GestionCamera()
; Touches de la Caméra
If KeyboardReleased(#PB_Key_F1) : Camera\CameraVue = 1 : EndIf
If KeyboardReleased(#PB_Key_F2) : Camera\CameraVue = 2 : EndIf
If KeyboardReleased(#PB_Key_F3) : Camera\CameraVue = 3 : EndIf
If KeyboardPushed(#PB_Key_PageUp)
Camera\AngleY + 0.1
EndIf
If KeyboardPushed(#PB_Key_PageDown)
Camera\AngleY - 0.1
EndIf
If KeyboardPushed(#PB_Key_End)
Camera\AngleY = CurveValue(Camera\AngleY,0,20)
EndIf
If Camera\CameraVue = 1
Camera\CameraDist = CurveValue(Camera\CameraDist ,85 , 20)
Camera\CameraHaut = CurveValue(Camera\CameraHaut ,25 , 20)
Camera\LookAtY = CurveValue(Camera\LookAtY ,0 , 20)
ElseIf Camera\CameraVue = 2
Camera\CameraDist = CurveValue(Camera\CameraDist ,45 , 20)
Camera\CameraHaut = CurveValue(Camera\CameraHaut ,25 , 20)
Camera\LookAtY = CurveValue(Camera\LookAtY , 8 , 20)
ElseIf Camera\CameraVue = 3
Camera\CameraDist = CurveValue(Camera\CameraDist ,15 , 20)
Camera\CameraHaut = CurveValue(Camera\CameraHaut ,95 , 20)
Camera\LookAtY = CurveValue(Camera\LookAtY , 0 , 20)
EndIf
Camera\AngleX = CurveAngle(Camera\AngleX , entity(0)\AngleX , 20 )
PosXCamera.f = CurveValue(CameraX(0) , NewXValue(EntityX(0) , Camera\AngleX + 180 , Camera\CameraDist) , 280)
PosYCamera.f = CurveValue(CameraY(0) , EntityY(0) + Camera\CameraHaut , 30)
PosZCamera.f = CurveValue(CameraZ(0) , NewZValue(EntityZ(0) , Camera\AngleX + 180 , Camera\CameraDist) , 280)
CameraLocate(0 , PosXCamera , PosYCamera , PosZCamera)
CameraLookAt(0 , EntityX(0) , EntityY(0) + Camera\LookAtY + Camera\AngleY , EntityZ(0))
EndProcedure
Procedure AffAide()
StartDrawing(ScreenOutput())
Locate(10,10)
DrawText("Nombre d'images Minimum = " + StrF(Engine3DFrameRate(#PB_Engine3D_Minimum )) + " / Nombre d'images Maximum = " + StrF(Engine3DFrameRate(#PB_Engine3D_Maximum)))
Locate(10,30)
DrawText("Nombre d'images par seconde = " + StrF(Engine3DFrameRate(#PB_Engine3D_Current)))
Locate(10,50)
DrawText(StrF(EntityX(0)) + " / " + StrF(EntityY(0)) + " / " + StrF(EntityZ(0)))
StopDrawing()
EndProcedure
;- Boucle principale
DecAttraction.f = 0.05
Attraction.f = 0
Pas.f = 0
Repeat
ClearScreen(0, 0, 0)
If ExamineKeyboard()
If KeyboardPushed(#PB_Key_Left)
entity(0)\AngleX = WrapValue( entity(0)\AngleX + 1 )
RotateEntity(0,1 , 0, 0 )
ElseIf KeyboardPushed(#PB_Key_Right)
entity(0)\AngleX = WrapValue( entity(0)\AngleX - 1 )
RotateEntity(0, -1 , 0, 0 )
EndIf
If KeyboardPushed(#PB_Key_Up)
Pas = CurveValue(Pas, 2 , 120)
ElseIf KeyboardPushed(#PB_Key_Down)
Pas = CurveValue(Pas, -2 , 120)
Else
Pas = CurveValue(Pas, 0 , 200)
EndIf
If KeyboardReleased(#PB_Key_F4) : AfficheAide = 1 - AfficheAide : EndIf
EndIf
;Bouge le perso
MoveEntity( 0 , Cosd( entity(0)\AngleX ) * Pas , 0, -Sind( entity(0)\AngleX ) * Pas )
; Gestion de la caméra
GestionCamera()
RenderWorld()
If AfficheAide : AffAide(): EndIf
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
;-Datas du Cube
DataSection
Entitys:
; le perso
Data.l 2,1 ; matérial
Data.f 6,6,6 ; Dimension longueur , hauteur , largeur
Data.f 200,7,200,0 ; positions X,Y,Z et angle
; le sol
Data.l 3,0 ; matérial
Data.f 1000,8,1000 ; Dimension longueur , hauteur , largeur
Data.f 500,0,500,0 ; positions X,Y,Z et angle
CubePoints:
Data.f -0.5,-0.5,-0.5
Data.f -0.5,-0.5,0.5
Data.f 0.5,-0.5,0.5
Data.f 0.5,-0.5,-0.5
Data.f -0.5,0.5,-0.5
Data.f -0.5,0.5,0.5
Data.f 0.5,0.5,0.5
Data.f 0.5,0.5,-0.5
Data.f -0.5,-0.5,-0.5
Data.f -0.5,-0.5,0.5
Data.f 0.5,-0.5,0.5
Data.f 0.5,-0.5,-0.5
Data.f -0.5,0.5,-0.5
Data.f -0.5,0.5,0.5
Data.f 0.5,0.5,0.5
Data.f 0.5,0.5,-0.5
CubeNormales:
Data.f -0.5,0,-0.5
Data.f -0.5,0,0.5
Data.f 0.5,0,0.5
Data.f 0.5,0,-0.5
Data.f -0.5,0,-0.5
Data.f -0.5,0,0.5
Data.f 0.5,0,0.5
Data.f 0.5,0,-0.5
Data.f 0,1,0
Data.f 0,1,0
Data.f 0,1,0
Data.f 0,1,0
Data.f 0,-1,0
Data.f 0,-1,0
Data.f 0,-1,0
Data.f 0,-1,0
CubeTriangles:
Data.w 0,4,7
Data.w 0,7,3
Data.w 1,5,4
Data.w 1,4,0
Data.w 2,6,5
Data.w 2,5,1
Data.w 3,7,6
Data.w 3,6,2
Data.w 9,8,11
Data.w 9,11,10
Data.w 12,13,14
Data.w 12,14,15
CubeTextures:
Data.f 0,1
Data.f 1,1
Data.f 0,1
Data.f 1,1
Data.f 0,0
Data.f 1,0
Data.f 0,0
Data.f 1,0
Data.f 0,0
Data.f 1,0
Data.f 1,1
Data.f 0,1
Data.f 0,0
Data.f 1,0
Data.f 1,1
Data.f 0,1
EndDataSection