après plusieurs plantages, j'ai réussi à transformer mon code pour qu'il tourne, enfin presque, ça ne fonctionne toujours pas le détache entity.
Code : Tout sélectionner
;Comtois le 11/11/06
;Rubik
;Fichiers Include
IncludePath "..\Include\"
IncludeFile "d3dx9.pbi"
IncludeFile "dreamotion3d.pbi"
Enumeration
#Haut
#Bas
#Devant
#Derriere
#Gauche
#Droit
#CentreX
#CentreY
#CentreZ
EndEnumeration
Declare CreateCube(x, y, z)
Declare DetacheRotation()
Declare ParentRotation(No)
Declare Rotation(No, S)
Declare MiseAJour(Type, S)
Global *camera.CEntity
Global *font.CFont
Global *brush.CBrush
Global *texture.CTexture
Global *Cube
Global Taille
Define Angle
Global Dim *Pivot(8)
Global Dim *Rubik(2, 2, 2)
Global Dim *TempRubik(2, 2, 2)
;-Initialisation
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
End
EndIf
;-ouvre un ecran 3D
DM_Graphics3D(800, 600, 32, 1, 1)
;-font
*font = DM_LoadFont("Arial", 8, 1)
DM_SetColorText(*font, 255, 255, 0,255)
;-Texture
*texture = DM_CreateTexture(256,256)
;ré-oriente le buffer de sortie graphique vers notre texture
DM_SetBuffer(*texture)
DM_BeginScene()
DM_ClsScreen ( 0, 0, 0, 255) ; efface le buffer avec une couleur
DM_SetColor2D(255, 0, 0, 255) ; change couleur du trait
DM_DrawRect ( 1, 1, 254, 254) ; dessin d'un rectangle 2D
DM_EndScene()
;de nouveau le buffer vers l'ecran
DM_SetBuffer(#Null)
;-Brush
*brush = DM_CreateBrush(Str(*entity))
DM_BrushAmbient(*brush, 255,128,0,255)
DM_BrushDiffuse(*brush, 255,128,0,255)
DM_BrushTexture(*brush, *texture, 0)
; modifie l'état de rendu de la Brush pour voir de tous les cotés
DM_BrushAddRender(*brush, #D3DRS_CULLMODE, #D3DCULL_NONE)
;-Creation rubik cube
Taille = 50
For z = 0 To 2
For y = 0 To 2
For x = 0 To 2
No = CreateCube(x, y, z)
DM_ScaleEntity(No, Taille - 2, Taille - 2, Taille - 2)
DM_PositionEntity(No, (x-1) * Taille , (y-1) * Taille , (z-1) * Taille)
*Rubik(x,y,z) = No
Next x
Next y
Next z
;-Pivots
For i = 0 To 8
*Pivot(i) = DM_CreatePivot()
Next i
Angle = 90
;-Light
;DM_AmbiantLight(180, 180, 180)
;-camera
*camera = DM_CreateCamera(#Null)
DM_CameraClsColor(*camera, 0, 0, 15)
DM_PositionEntity(*camera, DM_EntityX(*Rubik(1,1,1)) + 250,DM_EntityY(*Rubik(1,1,1)) + 250, DM_EntityZ(*Rubik(1,1,1)) - 250)
DM_PointEntity(*camera, *Rubik(1,1,1))
;-Boucle principale
Repeat
ExamineKeyboard()
If KeyboardReleased(#PB_Key_F1)
Pause = 1 - Pause
EndIf
ExamineMouse()
; If MouseButton(#PB_MouseButton_Left)
; *Cube = DM_CameraPick(*camera, MouseX(), MouseY())
; ;Recherche le cube
; For x = 0 To 2
; For y = 0 To 2
; For z = 0 To 2
; If *Rubik(x, y, z) = *Cube
; px = x : py = y : pz = z
; Break 3
; EndIf
; Next z
; Next y
; Next x
; ;Calcul le type de rotation en fonction de la position du cube
; If MouseDeltaX()<>0 Or MouseDeltaY()<>0
; Dx.f = MouseDeltaX()
; Dy.F = MouseDeltaY()
; EndIf
;
; EndIf
If Angle < 90
If pause = 0
Rotation(Type, Sens)
Angle + 1
EndIf
If Angle = 90
MiseAjour(Type, Sens)
EndIf
EndIf
If Angle = 90
DetacheRotation()
Angle = 0
Type = Random(8)
;Type = #CentreZ
Repeat
Sens = 1-Random(2)
Until Sens <> 0
ParentRotation(Type)
EndIf
DM_BeginScene()
DM_Renderworld()
DM_DrawText(*font,0,0,StrF(DX,2) + " : " + StrF(dy,2))
DM_SetColor2D(255, 255, 255, 255)
DM_DrawOval(MouseX(), MouseY(), 8, 8)
DM_EndScene()
Until KeyboardPushed(#PB_Key_Escape)
DM_ClearGraphics()
End
Procedure MiseAjour(Type, Sens)
Define *Temp
If Type = #Haut Or Type = #Droit Or Type = #Derriere
h = 2
ElseIf Type = #CentreX Or Type = #CentreY Or Type = #CentreZ
h = 1
ElseIf Type = #Bas Or Type = #Gauche Or type = #Devant
h = 0
EndIf
CopyMemory(*Rubik(), *TempRubik(), SizeOf(Long) * 27)
If Type = #Haut Or Type = #Bas Or Type = #CentreY
If Sens
*Rubik(0, h, 2) = *TempRubik(2, h, 2)
*Rubik(1, h, 2) = *TempRubik(2, h, 1)
*Rubik(2, h, 2) = *TempRubik(2, h, 0)
*Rubik(0, h, 1) = *TempRubik(1, h, 2)
*Rubik(1, h, 1) = *TempRubik(1, h, 1)
*Rubik(2, h, 1) = *TempRubik(1, h, 0)
*Rubik(0, h, 0) = *TempRubik(0, h, 2)
*Rubik(1, h, 0) = *TempRubik(0, h, 1)
*Rubik(2, h, 0) = *TempRubik(0, h, 0)
Else
*Rubik(0, h, 0) = *TempRubik(0, h, 2)
*Rubik(0, h, 1) = *TempRubik(1, h, 2)
*Rubik(0, h, 2) = *TempRubik(2, h, 2)
*Rubik(1, h, 0) = *TempRubik(0, h, 1)
*Rubik(1, h, 1) = *TempRubik(1, h, 1)
*Rubik(1, h, 2) = *TempRubik(2, h, 1)
*Rubik(2, h, 0) = *TempRubik(0, h, 0)
*Rubik(2, h, 1) = *TempRubik(1, h, 0)
*Rubik(2, h, 2) = *TempRubik(2, h, 0)
EndIf
ElseIf Type = #Gauche Or Type = #Droit Or Type = #CentreX
If Sens
*Rubik(h, 0, 0) = *TempRubik(h, 0, 2)
*Rubik(h, 0, 1) = *TempRubik(h, 1, 2)
*Rubik(h, 0, 2) = *TempRubik(h, 2, 2)
*Rubik(h, 1, 0) = *TempRubik(h, 0, 1)
*Rubik(h, 1, 1) = *TempRubik(h, 1, 1)
*Rubik(h, 1, 2) = *TempRubik(h, 2, 1)
*Rubik(h, 2, 0) = *TempRubik(h, 0, 0)
*Rubik(h, 2, 1) = *TempRubik(h, 1, 0)
*Rubik(h, 2, 2) = *TempRubik(h, 2, 0)
Else
*Rubik(h, 0, 2) = *TempRubik(h, 2, 2)
*Rubik(h, 1, 2) = *TempRubik(h, 2, 1)
*Rubik(h, 2, 2) = *TempRubik(h, 2, 0)
*Rubik(h, 0, 1) = *TempRubik(h, 1, 2)
*Rubik(h, 1, 1) = *TempRubik(h, 1, 1)
*Rubik(h, 2, 1) = *TempRubik(h, 1, 0)
*Rubik(h, 0, 0) = *TempRubik(h, 0, 2)
*Rubik(h, 1, 0) = *TempRubik(h, 0, 1)
*Rubik(h, 2, 0) = *TempRubik(h, 0, 0)
EndIf
Else
If Sens
*Rubik(0, 0, h) = *TempRubik(0, 2, h)
*Rubik(0, 1, h) = *TempRubik(1, 2, h)
*Rubik(0, 2, h) = *TempRubik(2, 2, h)
*Rubik(1, 0, h) = *TempRubik(0, 1, h)
*Rubik(1, 1, h) = *TempRubik(1, 1, h)
*Rubik(1, 2, h) = *TempRubik(2, 1, h)
*Rubik(2, 0, h) = *TempRubik(0, 0, h)
*Rubik(2, 1, h) = *TempRubik(1, 0, h)
*Rubik(2, 2, h) = *TempRubik(2, 0, h)
Else
*Rubik(0, 2, h) = *TempRubik(2, 2, h)
*Rubik(1, 2, h) = *TempRubik(2, 1, h)
*Rubik(2, 2, h) = *TempRubik(2, 0, h)
*Rubik(0, 1, h) = *TempRubik(1, 2, h)
*Rubik(1, 1, h) = *TempRubik(1, 1, h)
*Rubik(2, 1, h) = *TempRubik(1, 0, h)
*Rubik(0, 0, h) = *TempRubik(0, 2, h)
*Rubik(1, 0, h) = *TempRubik(0, 1, h)
*Rubik(2, 0, h) = *TempRubik(0, 0, h)
EndIf
EndIf
EndProcedure
Procedure DetacheRotation()
For x = 0 To 2
For y = 0 To 2
For z = 0 To 2
If DM_GetParent(*Rubik(x, y, z))
;DM_DetachEntity(*Rubik(x, y, z))
DM_EntityParent(*Rubik(x, y, z))
EndIf
Next z
Next y
Next x
EndProcedure
Procedure ParentRotation(No)
Select No
Case #Haut
For x = 0 To 2
For z = 0 To 2
DM_EntityParent(*Rubik(x, 2, z), *Pivot(#Haut))
Next z
Next x
Case #Bas
For x = 0 To 2
For z = 0 To 2
DM_EntityParent(*Rubik(x, 0, z), *Pivot(#Bas))
Next z
Next x
Case #Devant
For x = 0 To 2
For y = 0 To 2
DM_EntityParent(*Rubik(x, y, 0), *Pivot(#Devant))
Next y
Next x
Case #Derriere
For x = 0 To 2
For y = 0 To 2
DM_EntityParent(*Rubik(x, y, 2), *Pivot(#Derriere))
Next y
Next x
Case #Gauche
For y = 0 To 2
For z = 0 To 2
DM_EntityParent(*Rubik(0, y, z), *Pivot(#Gauche))
Next z
Next y
Case #Droit
For y = 0 To 2
For z = 0 To 2
DM_EntityParent(*Rubik(2, y, z), *Pivot(#Droit))
Next z
Next y
Case #CentreX
For y = 0 To 2
For z = 0 To 2
DM_EntityParent(*Rubik(1, y, z), *Pivot(#CentreX))
Next z
Next y
Case #CentreY
For x = 0 To 2
For z = 0 To 2
DM_EntityParent(*Rubik(x, 1, z), *Pivot(#CentreY))
Next z
Next x
Case #CentreZ
For x = 0 To 2
For y = 0 To 2
DM_EntityParent(*Rubik(x, y, 1), *Pivot(#CentreZ))
Next y
Next x
EndSelect
EndProcedure
Procedure Rotation(No, S)
Select No
Case #Haut
DM_TurnEntity(*pivot(#Haut) , 0, S, 0)
Case #Bas
DM_TurnEntity(*pivot(#Bas) , 0, S, 0)
Case #Devant
DM_TurnEntity(*pivot(#Devant) , 0, 0, S)
Case #Derriere
DM_TurnEntity(*pivot(#Derriere), 0, 0, S)
Case #Gauche
DM_TurnEntity(*pivot(#Gauche) , S, 0, 0)
Case #Droit
DM_TurnEntity(*pivot(#Droit) , S, 0, 0)
Case #CentreX
DM_TurnEntity(*pivot(#CentreX) , S, 0, 0)
Case #CentreY
DM_TurnEntity(*pivot(#CentreY) , 0, S, 0)
Case #CentreZ
DM_TurnEntity(*pivot(#CentreZ) , 0, 0, S)
EndSelect
EndProcedure
Procedure CreateCube(xx, yy, zz)
Define.CEntity *entity
*entity = DM_CreateMesh()
*surface = DM_CreateSurface(*entity)
Restore Vertex
For i= 0 To 23
Read x.f : Read y.f : Read z.f
Read u.f : Read v.f
;Read Rouge : Read Vert : Read bleu
rouge = 70 : Vert = 60 : Bleu = 80
;Couleur dessus
If yy = 2 And i >=0 And i <=3
Rouge = 0 : Vert = 0 : bleu = 255
EndIf
;Couleur dessous
If yy = 0 And i >=4 And i <=7
Rouge = 255 : Vert = 255 : bleu = 255
EndIf
;Couleur derriere
If zz = 2 And i >=8 And i <=11
Rouge = 255 : Vert = 255 : bleu = 0
EndIf
;Couleur devant
If zz = 0 And i >=12 And i <=15
Rouge = 255 : Vert = 128 : bleu = 0
EndIf
;Couleur gauche
If xx = 0 And i >=16 And i <=19
Rouge = 0 : Vert = 255 : bleu = 0
EndIf
;Couleur droit
If xx = 2 And i >=20 And i <=23
Rouge = 255 : Vert = 0 : bleu = 0
EndIf
;les coordonnées de vertex
DM_AddVertex(*surface, x, y, z, u, v)
;Couleurs
DM_VertexColor(*surface, i, 255,rouge, vert, bleu)
Next i
;les triangles
Restore Indice
For i = 0 To 11
Read v1.l : Read v2.l : Read v3.l
DM_AddTriangle(*surface, v1, v2, v3)
Next i
; affecte la brush créee a notre entity
;DM_PaintEntity(*entity, *brush, 0)
; génératon auto des normales de l'entity créée
DM_UpdateNormal(*entity)
ProcedureReturn *entity
EndProcedure
DataSection
Vertex:
; liste des 24 vertex avec leurs coordonnées de textures
;Haut
Data.f -0.5, 0.5, 0.5, 0, 0
Data.f 0.5, 0.5, 0.5, 0, 1
Data.f -0.5, 0.5,-0.5, 1, 0
Data.f 0.5, 0.5,-0.5, 1, 1
;Bas
Data.f -0.5,-0.5, 0.5, 0, 0
Data.f -0.5,-0.5,-0.5, 0, 1
Data.f 0.5,-0.5, 0.5, 1, 0
Data.f 0.5,-0.5,-0.5, 1, 1
;Derrière
Data.f -0.5, 0.5, 0.5, 0, 0
Data.f -0.5,-0.5, 0.5, 0, 1
Data.f 0.5, 0.5, 0.5, 1, 0
Data.f 0.5,-0.5, 0.5, 1, 1
;Devant
Data.f -0.5, 0.5,-0.5, 0, 0
Data.f 0.5, 0.5,-0.5, 0, 1
Data.f -0.5,-0.5,-0.5, 1, 0
Data.f 0.5,-0.5,-0.5, 1, 1
;Gauche
Data.f -0.5, 0.5,-0.5, 0, 0
Data.f -0.5,-0.5,-0.5, 0, 1
Data.f -0.5, 0.5, 0.5, 1, 0
Data.f -0.5,-0.5, 0.5, 1, 1
;Droit
Data.f 0.5, 0.5,-0.5, 0, 0
Data.f 0.5, 0.5, 0.5, 0, 1
Data.f 0.5,-0.5,-0.5, 1, 0
Data.f 0.5,-0.5, 0.5, 1, 1
Indice:
;liste des faces
Data.l 0, 1, 2
Data.l 1, 3, 2
Data.l 4, 5, 6
Data.l 5, 7, 6
Data.l 8, 9, 10
Data.l 9, 11, 10
Data.l 12, 13, 14
Data.l 13, 15, 14
Data.l 16, 17, 18
Data.l 17, 19, 18
Data.l 20, 21, 22
Data.l 21, 23, 22
EndDataSection