bon je viens de tester avec mon code le rubick cube. les premières rotations semblent correctes, mais ça merdouille très rapidement, après deux ou trois rotations.
Faudrait que je trouve un code plus simple pour tester, parce qu'après tout je ne sais pas si c'est mon code qui est bogué ou non.
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, 85)
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))
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
DM_EntityFormat(2)
*entity = DM_CreateMesh(12, 24, 1, #Null)
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_VertexCoords(*entity, i, x, y, z)
;les coordonnées de texture (canal 0)
DM_VertexTexCoords(*entity, i, 0, u, v)
DM_VertexTexCoords(*entity, i, 1, u, v)
;Couleurs
DM_VertexColor(*entity, i, rouge, vert, bleu, 255)
Next i
;les triangles
Restore Indice
For i = 0 To 11
Read v1.l : Read v2.l : Read v3.l
DM_VertexTriangle(*entity, i, v1, v2, v3, 0)
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