
j'ai corrigé le source ci dessus
j'ai aussi acceleré le deplacement avec les Fleche du clavier
lorsque j'aurai un peut de temps j'ajouterai au fur a mesure des petites choses auquel je pense , mais aps tout de suite, donc tu peux le prendre tel quel

Code : Tout sélectionner
; Fichiers Include
IncludePath "Include\" : IncludeFile "dreamotion3d.pbi"
Declare FreeCam(*camera.CEntity, posx.l, posy.l)
Declare PickCam(*camera.CEntity, posx.l, posy.l)
; Globales
Global anglex.f, angley.f, flagXDown.w
Global mox.f, omx.f, moy.l, omy.l
Global *camera1.CEntity
Global *camera2.CEntity
Global *camera3.CEntity
Global *camera4.CEntity
Global *mesh.CEntity
Global *boule.CEntity
; Initialisation des différents modules
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
End
EndIf
; Initialise la fenêtre graphique
DM_Graphics3D(800,600, 32, 0, 1)
; Lumière
DM_CreateLight(3)
; ---------------------------------------
; Creation des mesh
; ---------------------------------------
; un teapot pour exemple
*mesh = DM_CreateTeapot()
*boule = DM_CreateSphere()
; réduit la boule
DM_ScaleMesh(*boule, 0.125, 0.125, 0.125)
; en bleu
DM_EntityColor(*boule, 50,100,200,255)
; désactive le picking sur le petite boule bleu
DM_EntityPickMode(*boule, #False)
; ---------------------------------------
; Nos 4 camera avec les 4 vues
; ---------------------------------------
*camera1 = DM_CreateCamera()
DM_TranslateEntity(*camera1, 0,0,-10)
DM_CameraClsColor(*camera1, 200, 0, 0)
DM_CameraViewPort(*camera1, 0,0,399,299)
*camera2 = DM_CreateCamera()
DM_TranslateEntity(*camera2, 0,10,0)
DM_RotateEntity(*camera2, 90,0,0)
DM_CameraViewPort(*camera2, 400,0,400,300)
DM_CameraClsColor(*camera2, 0, 200, 0)
*camera3 = DM_CreateCamera()
DM_TranslateEntity(*camera3, 10,0,0)
DM_RotateEntity(*camera3, 0,-90,0)
DM_CameraViewPort(*camera3, 0,300,400,300)
DM_CameraClsColor(*camera3, 0, 0, 200)
*camera4 = DM_CreateCamera()
DM_TranslateEntity(*camera4, -10,0,0)
DM_RotateEntity(*camera4, 0,90,0)
DM_CameraViewPort(*camera4, 400,300,399,299)
DM_CameraClsColor(*camera4, 0, 0, 0)
; ---------------------------------------
; Boucle principale
; ---------------------------------------
; si plein ecran, permet d'avoir la fleche
;change_curseur( #IDC_ARROW )
Repeat
ExamineKeyboard()
ExamineMouse()
ShowCursor_(1)
If KeyboardReleased(#PB_Key_Escape) Or WindowEvent()=#PB_Event_CloseWindow
Quit=1
EndIf
; Gestion de la caméra
mx.l = MouseX() : my.l = MouseY()
If( (mx<400) And (my<300) )
FreeCam(*camera1, MouseX(), MouseY())
ElseIf ( (mx>=400) And (my<300) )
FreeCam(*camera2, MouseX()-400, MouseY())
ElseIf ( (mx<400) And (my>=300) )
FreeCam(*camera3, MouseX(), MouseY()-300)
ElseIf ( (mx>=400) And (my>=300) )
FreeCam(*camera4, MouseX()-400, MouseY()-300)
EndIf
; Picking
If MouseButton(#PB_MouseButton_Right)
If( (mx<400) And (my<300) )
PickCam(*camera1, MouseX(), MouseY())
ElseIf ( (mx>=400) And (my<300) )
PickCam(*camera2, MouseX()-400, MouseY())
ElseIf ( (mx<400) And (my>=300) )
PickCam(*camera3, MouseX(), MouseY()-300)
ElseIf ( (mx>=400) And (my>=300) )
PickCam(*camera4, MouseX()-400, MouseY()-300)
EndIf
EndIf
; ---------------
; Rendu
; ---------------
DM_BeginScene()
DM_RenderWorld()
DM_EndScene()
Until Quit=1
DM_ClearGraphics()
End
; gestion des picking
Procedure PickCam(*camera.CEntity, posx.l, posy.l)
Protected *pickedmesh
*pickedmesh = DM_CameraPick(*camera, posx, posy)
If *pickedmesh<> #Null
DM_PositionEntity(*boule, DM_PickedX(),DM_PickedY(),DM_PickedZ())
EndIf
EndProcedure
; gestion camera libre
Procedure FreeCam(*camera.CEntity, posx.l, posy.l)
; Gestion de la caméra
If KeyboardPushed(#PB_Key_Up)
DM_MoveEntity(*camera, 0,0,1)
EndIf
If KeyboardPushed(#PB_Key_Down)
DM_MoveEntity(*camera, 0,0,-1)
EndIf
If KeyboardPushed(#PB_Key_Right)
DM_MoveEntity(*camera, 1,0,0)
EndIf
If KeyboardPushed(#PB_Key_Left)
DM_MoveEntity(*camera, -1,0,0)
EndIf
If MouseButton(#PB_MouseButton_Left)
If flagXdown=0
omx = MouseX()
omy = MouseY()
flagXDown=11
Else
moy = MouseY()-omy
angley=(moy/5.0)
omy= MouseY()
mox = MouseX()-omx
anglex=(mox/5.0)
omx= MouseX()
DM_TurnEntity(*camera, angley,anglex,0)
EndIf
Else
flagXDown=0
EndIf
EndProcedure
Code : Tout sélectionner
; Init different modules
; Fichiers Include
; voir le dreamotion3d.pbi pour le details des commandes reconnu
Dim tableau(1024,15)
Enumeration
#fenetre
#Police
#curseur
#image
EndEnumeration
Structure cube
numero.l
x.f
Y.f
z.f
EndStructure
Dim cube.cube(1000)
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
End
EndIf
SetCurrentDirectory("media/")
FontID = LoadFont(#Police, "arial", 18, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran
WindowID = OpenWindow(#fenetre, 0, 0,EcranX,EcranY, "hello",#PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
Result = OpenWindowedScreen(WindowID(#fenetre) ,0,0, EcranX,EcranY, 1, 0,0)
CreateImage(#image,1024,768,32)
StartDrawing( ImageOutput(#image))
DrawText(0, 0, "Dreamotion3d Votre Moteur 3D" ,RGB(255,255,255),RGB(0,0,0))
For Y =0 To 15
For x=0 To 1024
tableau(x,Y)=Point(x,Y)
Next x
Next Y
StopDrawing()
CloseWindow(#fenetre)
IncludePath "D:\PureBasic\dobro\Exemple Perso\3Dreammotion\Samples\Include\"
IncludeFile "D:\PureBasic\dobro\Exemple Perso\3Dreammotion\Samples\include\d3dx9.pbi"
IncludeFile "D:\PureBasic\dobro\Exemple Perso\3Dreammotion\Samples\include\dreamotion3d.pbi"
; demarre le moteur 3D
DM_Graphics3D(1024,768, 32, #False, #False) ; Initialize graphic windows
*Camera = DM_CreateCamera(#Null) ; on cree une camera
For Y =0 To 15
For x=0 To 1024
If tableau(x,Y)<>0
; creer un Cube
nb=nb+1
cube=DM_CreateCube.l(#Null) ; on peut creer un Cube
scalex.f=4: scaley.f=4: scalez.f=4
DM_ScaleEntity(cube, scalex.f, scaley.f, scalez.f);
posxe.f =x*10
posye.f=Y*10
posze.f=0
cube(nb)\x=posxe.f
cube(nb)\Y=posye.f
cube(nb)\z=posze.f
DM_PositionEntity(cube, cube(nb)\x, cube(nb)\Y, cube(nb)\z)
EndIf
Next x
Next Y
; **************** bouger la camera ********************
;- bouger camera
poz.f=500 ; avance/recule ; pour le terrain
posy.f=-100
DM_MoveEntity(*Camera, posx,posy,poz); on recule la camera
Rouge=0
Vert=10
Bleu=0
DM_CameraClsColor(*Camera, Rouge, Vert, Bleu) ; on choisi une couleur de fond
rotxc.f=-20 ; oui de la tete
rotyc.f=150; non de la tete
rotzc.f=180; droite gauche pour un avion
DM_TurnEntity(*Camera, rotxc.f, rotyc.f, rotzc.f)
; ****** Lumiere *****************
; cree une petite lumière, type POINT
;-creer une lumiere
light = DM_CreateLight(1, Null)
Red.w=255
Green.w=10
Blue.w=100
Alpha.w=2
DM_LightColor(light, Red.w, Green.w, Blue.w, Alpha.w) ; change la couleur de la lumiere
; *********************************
Repeat
ExamineKeyboard()
ExamineMouse()
ShowCursor_(1)
If KeyboardReleased(#PB_Key_Escape) Or WindowEvent()=#PB_Event_CloseWindow
Quit=1
ElseIf KeyboardPushed(#PB_Key_Up )
poz=1
DM_MoveEntity(*Camera, 0,0,0.8); on recule/avance la camera
ElseIf KeyboardPushed(#PB_Key_Down )
poz=-1
DM_MoveEntity(*Camera, 0,0,-0.8); on recule/avance la camera
ElseIf KeyboardPushed(#PB_Key_Left )
;rotx.f=30 ; oui de la tete
rotyc.f= rotyc.f+0.8; non de la tete
;rotz.f=0; droite gauche pour un avion
DM_RotateEntity(*Camera, rotxc.f, rotyc.f, rotzc.f)
ElseIf KeyboardPushed(#PB_Key_Right )
; rotx.f=30 ; oui de la tete
rotyc.f=rotyc.f-0.8; non de la tete
; rotz.f=0; droite gauche pour un avion
DM_RotateEntity(*Camera, rotxc.f, rotyc.f, rotzc.f)
EndIf
If MouseButton(#PB_MouseButton_Left)
Quit=1
EndIf
DM_TurnEntity(*Camera, -MouseDeltaY()/8,- MouseDeltaX()/8,0)
translatex.f=-0.2
translatey.f=0
translatez.f=0
; For nume=0 To nb
; cube(nume)\x=cube(nume)\x-0.2
; DM_TranslateEntity(cube, cube(nume)\x, cube(nume)\Y, cube(nume)\z, glob.b=#False)
; Next nume
;
; Render c'es ce qui permet de voir le resultat !
DM_BeginScene()
DM_RenderWorld()
DM_EndScene()
; *************************************
Until Quit=1
DM_ClearGraphics()
End
Code : Tout sélectionner
For nume=0 To nb
cube(nume)\x=cube(nume)\x-0.2
DM_TranslateEntity(cube(nume)\numero, cube(nume)\x, cube(nume)\Y, cube(nume)\z, glob.b=#False)
Next nume
Code : Tout sélectionner
Structure cube
*numero.CEntity
x.f
Y.f
z.f
EndStructure
Code : Tout sélectionner
For Y =0 To 15
For x=0 To 1024
If tableau(x,Y)<>0
; creer un Cube
*cube_c.CEntity=DM_CreateCube() ; on peut creer un Cube
scalex.f=4: scaley.f=4: scalez.f=4
DM_ScaleEntity(*cube_c, scalex.f, scaley.f, scalez.f);
posxe.f =x*10
posye.f=Y*10
posze.f=0
cube(nb)\x=posxe.f
cube(nb)\Y=posye.f
cube(nb)\z=posze.f
cube(nb)\numero = *cube_c
DM_PositionEntity(*cube_c, cube(nb)\x, cube(nb)\Y, cube(nb)\z)
nb=nb+1
EndIf
Next x
Next Y
Code : Tout sélectionner
For nume= 0 To nb-1
cube(nume)\x=cube(nume)\x-0.2
DM_TranslateEntity(cube(nume)\numero, cube(nume)\x, cube(nume)\Y, cube(nume)\z)
Next nume
Code : Tout sélectionner
For x=0 To 1000
; creer un Cube
nb=nb+1
*cube=DM_CreateCube.l(#Null) ; on peut creer un Cube
scalex.f=4: scaley.f=4: scalez.f=4
DM_ScaleEntity( *cube, scalex.f, scaley.f, scalez.f);
posxe.f =x*10
DM_PositionEntity( *cube, posxe, Y, z)
Next x
Code : Tout sélectionner
Structure cube
index.l
x.f
Y.f
z.f
EndStructure
Dim cube.cube(1000)
Code : Tout sélectionner
For x=0 To 1000
; creer un Cube
nb=nb+1
cube(nb)\index=DM_CreateCube.l(#Null) ; on peut creer un Cube
scalex.f=4: scaley.f=4: scalez.f=4
DM_ScaleEntity( cube(nb)\index, cube(nb)\x, cube(nb)\Y, cube(nb)\z);
cube(nb)\x =cube(nb)\x*10
DM_PositionEntity( cube(nb)\index, cube(nb)\x, cube(nb)\Y, cube(nb)\z)
Next x
Code : Tout sélectionner
; Fichiers Include
IncludePath "Include\" : IncludeFile "dreamotion3d.pbi"
; Globales
Global *camera.CEntity
; Initialisation des différents modules
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
End
EndIf
; Initialise la fenêtre graphique
DM_Graphics3D(800, 600, 32, 0, 1)
DM_CreateLight(3)
;--------------------------------------------------------------
; p'tite struct et creation des cubes
;--------------------------------------------------------------
Structure struct_cube
*mesh.CEntity
x.f
Y.f
z.f
EndStructure
Dim cube.struct_cube(20)
; creation des cube
For t= 0 To 19
cube(t)\mesh = DM_CreateCube()
DM_TranslateEntity(cube(t)\mesh, 3.0*t,0,0)
Next
; ---------------------------------------
; Gestion des caméras
; ---------------------------------------
*camera = DM_CreateCamera(#Null)
DM_MoveEntity(*camera, 30,10,-70)
DM_CameraClsColor(*camera, 125, 125, 125)
index.l=0
; ---------------------------------------
; Boucle principale
; ---------------------------------------
; si plein ecran, permet d'avoir la fleche
;change_curseur( #IDC_ARROW )
Repeat
ExamineKeyboard()
ExamineMouse()
ShowCursor_(1)
If KeyboardReleased(#PB_Key_Escape) Or WindowEvent()=#PB_Event_CloseWindow
Quit=1
EndIf
DM_TranslateEntity( cube(index)\mesh, 0,1,0)
index +1
If (index>19) : index=0 : EndIf
; ---------------
; Rendu
; ---------------
DM_BeginScene()
DM_RenderWorld()
DM_EndScene()
Until Quit=1
DM_ClearGraphics()
End