Pièce Tetris cassée... Why ?

Généralités sur la programmation 3D
Avatar de l’utilisateur
SPH
Messages : 4942
Inscription : mer. 09/nov./2005 9:53

Pièce Tetris cassée... Why ?

Message par SPH »

Lors de la création d'une pièce Tetris, j'ai un décalage entre les caisses.
Je peux le retourner dans tous les sens, mais je ne comprends pas...
Bug ou pas bug ?

Code : Tout sélectionner

EnableExplicit

Define Dim camera(1),Dim light(1),Dim mesh(20),Dim material(1),Dim entity(20)
Define xx.f, yy.f, zz.f, xx2.f, yy2.f, zz2.f
Define i.l,u.l,n.l,x.l,y.l,taille_x,taille_y,piece,piece_tetris
Define b.b

Define mesh, entity

ExamineDesktops()
InitEngine3D(#PB_Engine3D_DebugLog) : InitSprite() : InitKeyboard() : InitMouse()
OpenScreen(DesktopWidth(0), DesktopHeight(0), 32, "3D de base")
Add3DArchive(#PB_Compiler_Home + "examples\3D\Data\Textures", #PB_3DArchive_FileSystem)

; Camera
camera(0) = CreateCamera(#PB_Any, 0, 0, 100, 100)
MoveCamera(camera(0), 0, 6, 40) 
CameraLookAt(camera(0), 0, 0, 0)
RotateCamera(camera(0), 0 ,0 ,0)

; Si pas de ciel, couleur de fond
CameraBackColor(camera(0), RGB(184, 134, 11))

; Lumiere
light(0) = CreateLight(#PB_Any, RGB(255, 255, 255), -100, 100, 0)

; Création du premier cube

material(0) = CreateMaterial(#PB_Any, TextureID(LoadTexture(#PB_Any, "caisse.png")))

Dim piece.b(3,3) ; une pièce tetris dans un Dim
For y=0 To 3
  For x=0 To 3
    Read.b piece(x,y)
  Next
Next
;;;;;;

i=0 ; creation de 4 caisses
For y=0 To 3
  For x=0 To 3
    If piece(x,y)=1
      mesh(i) = CreateCube(#PB_Any, 1)
      entity(i) = CreateEntity(#PB_Any, MeshID(mesh(i)), MaterialID(material(0)))
      MoveEntity(entity(i), x, y, 0)
      i+1
    EndIf
  Next
Next

;;;;;; lier 4 caisses pour en faire une piece tetris  
For u=1 To 3
  AttachEntityObject(entity(0), "", EntityID(entity(u)))
Next


; Boucle 3D
yy=-0.02
Repeat
  ExamineKeyboard()
  ExamineMouse()

  MoveEntity(entity(0), 0, yy, 0)
  RenderWorld() 
  FlipBuffers()    
Until KeyboardReleased(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Middle)
End

;{

DataSection
  ;;;
  Data.b 0,0,0,0
  Data.b 1,1,1,1
  Data.b 0,0,0,0
  Data.b 0,0,0,0
  ;;;
EndDataSection
;}

Le morceau de Tetris descendant est cassé. pourquoi ?

Pourtant :

Code : Tout sélectionner

  Data.b 0,0,0,0
  Data.b 1,1,1,1
  Data.b 0,0,0,0
  Data.b 0,0,0,0
!!! :!:

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
falsam
Messages : 7323
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Pièce Tetris cassée... Why ?

Message par falsam »

AttachEntityObject() fait un déplacement relatif sur l'axe Y de 1 si tes cubes ne se trouvent pas en position 0 sur l'axe des Y.
Ca ne me semble pas normal !!

Exemple avec ce code représentant deux cubes cote à cote mais en 0 sur l'axe y

Code : Tout sélectionner

EnableExplicit

InitEngine3D(#PB_Engine3D_DebugLog) : InitSprite() : InitKeyboard() : InitMouse()

OpenWindow(0, 0, 0, 0, 0, "", #PB_Window_Maximize | #PB_Window_BorderLess)
OpenWindowedScreen(WindowID(0),0, 0, WindowWidth(0) , WindowHeight(0)) 

CreateCamera(0, 0, 0, 100, 100) : MoveCamera(0,0,3,-6) : CameraLookAt(0,0,0,0)
CreateLight(0,$ffffff, -10, 10, 0)
AmbientColor($111111*3)
CameraBackColor(0,$444488)

CreateCube(0, 1)
CreateEntity(0, MeshID(0), #PB_Material_None, 0, 0, 0)
CreateEntity(1, MeshID(0), #PB_Material_None, 1, 0, 0)

AttachEntityObject(0, "", EntityID(1))

Repeat
  While WindowEvent() : Wend
  ExamineKeyboard()
  ExamineMouse()
    
  RenderWorld()
  FlipBuffers()    
Until KeyboardReleased(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Middle)
la liaison est correcte dans ce cas.

Maintenant change

Code : Tout sélectionner

CreateEntity(0, MeshID(0), #PB_Material_None, 0, 0, 0)
CreateEntity(1, MeshID(0), #PB_Material_None, 1, 0, 0)
par

Code : Tout sélectionner

CreateEntity(0, MeshID(0), #PB_Material_None, 0, 1, 0)
CreateEntity(1, MeshID(0), #PB_Material_None, 1, 1, 0)
Les deux cubes sont en position 1 sur l'axe des Y mais la jointure ne fonctionne pas.
Les trois cubes de droite sont décalés vers le haut !!
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7323
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Pièce Tetris cassée... Why ?

Message par falsam »

La solution serait de créer un node centré sur la position de tes quatre cubes et d'attacher les cubes sur le node.
Je pense que pour un tetris, la solution node sera plus simple.

■ Ton code corrigé.

Code : Tout sélectionner

EnableExplicit

Define Dim camera(1),Dim light(1),Dim mesh(20),Dim material(1),Dim entity(20)
Define xx.f, yy.f, zz.f, xx2.f, yy2.f, zz2.f
Define i.l,u.l,n.l,x.l,y.l,taille_x,taille_y,piece,piece_tetris
Define b.b

Define mesh, entity

ExamineDesktops()
InitEngine3D(#PB_Engine3D_DebugLog) : InitSprite() : InitKeyboard() : InitMouse()
OpenScreen(DesktopWidth(0), DesktopHeight(0), 32, "3D de base")
Add3DArchive(#PB_Compiler_Home + "examples\3D\Data\Textures", #PB_3DArchive_FileSystem)

; Camera
camera(0) = CreateCamera(#PB_Any, 0, 0, 100, 100)
MoveCamera(camera(0), 0, 6, 40) 
CameraLookAt(camera(0), 0, 0, 0)
RotateCamera(camera(0), 0 ,0 ,0)

; Si pas de ciel, couleur de fond
CameraBackColor(camera(0), RGB(184, 134, 11))

; Lumiere
light(0) = CreateLight(#PB_Any, RGB(255, 255, 255), -100, 100, 0)

; Création du premier cube

material(0) = CreateMaterial(#PB_Any, TextureID(LoadTexture(#PB_Any, "caisse.png")))

Dim piece.b(3,3) ; une pièce tetris dans un Dim
For y=0 To 3
  For x=0 To 3
    Read.b piece(x,y)
  Next
Next
;;;;;;

i=0 ; creation de 4 caisses
For y=0 To 3
  For x=0 To 3
    If piece(x,y)=1
      mesh(i) = CreateCube(#PB_Any, 1)
      entity(i) = CreateEntity(#PB_Any, MeshID(mesh(i)), MaterialID(material(0)))
      Debug Str(x) + " " + Str(y)
      MoveEntity(entity(i), x, y, 0)
      i+1
    EndIf
  Next
Next

;;;;;; lier 4 caisses pour en faire une piece tetris 

; Création d'un node centrée sur les 4 cubes
; Le node ne sera pas visible
;
; Tes quatres cubes étant en position
; 0 1
; 1 1
; 2 1
; 3 1
; Les point central sur l'axe x est situé à 1.5
; Aucun changement pour l'axe y et z
CreateNode(0, 1.5, 1, 0) 

; Tu attaches les 4 cubes sur le node
For u=0 To 3
  AttachNodeObject(0, EntityID(entity(u)))
Next


; Boucle 3D
yy=-0.02
Repeat
  ExamineKeyboard()
  ExamineMouse()

  MoveNode(0, 0, yy, 0)
  RenderWorld() 
  FlipBuffers()    
Until KeyboardReleased(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Middle)
End

;{

DataSection
  ;;;
  Data.b 0,0,0,0
  Data.b 1,1,1,1
  Data.b 0,0,0,0
  Data.b 0,0,0,0
  ;;;
EndDataSection
;}

■ La documentation sur les nodes
https://www.purebasic.com/french/docume ... index.html
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
SPH
Messages : 4942
Inscription : mer. 09/nov./2005 9:53

Re: Pièce Tetris cassée... Why ?

Message par SPH »

Ton 2ème code fonctionne. Je vais bosser à partir de celui là.

Thx

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Pièce Tetris cassée... Why ?

Message par comtois »

ton code à peine modifié
Pas besoin de créer un mesh cube pour chaque entity, un seul mesh suffit

Code : Tout sélectionner

EnableExplicit

Define Dim camera(1),Dim light(1),Dim mesh(20),Dim material(1),Dim entity(20)
Define xx.f, yy.f, zz.f, xx2.f, yy2.f, zz2.f
Define i.l,u.l,n.l,x.l,y.l,taille_x,taille_y,piece,piece_tetris
Define b.b

Define mesh, entity

ExamineDesktops()
InitEngine3D(#PB_Engine3D_DebugLog) : InitSprite() : InitKeyboard() : InitMouse()
OpenScreen(DesktopWidth(0), DesktopHeight(0), 32, "3D de base")
Add3DArchive(#PB_Compiler_Home + "examples\3D\Data\Textures", #PB_3DArchive_FileSystem)

; Camera
camera(0) = CreateCamera(#PB_Any, 0, 0, 100, 100)
MoveCamera(camera(0), 0, 6, 40) 
CameraLookAt(camera(0), 0, 0, 0)
RotateCamera(camera(0), 0 ,0 ,0)

; Si pas de ciel, couleur de fond
CameraBackColor(camera(0), RGB(184, 134, 11))

; Lumiere
light(0) = CreateLight(#PB_Any, RGB(255, 255, 255), -100, 100, 0)

; Création du premier cube

material(0) = CreateMaterial(#PB_Any, TextureID(LoadTexture(#PB_Any, "caisse.png")))

Dim piece.b(3,3) ; une pièce tetris dans un Dim
For y=0 To 3
  For x=0 To 3
    Read.b piece(x,y)
  Next
Next
;;;;;;

i=0 ; creation de 4 caisses
CreateCube(0, 1); pas la peine de créer un mesh pour chaque entity, un seul maillage suffit pour définir une entity

For y=0 To 3
  For x=0 To 3
    If piece(x,y)=1
      
      entity(i) = CreateEntity(#PB_Any, MeshID(mesh(0)), MaterialID(material(0)))
      MoveEntity(entity(i), x, y, 0)
      i+1
    EndIf
  Next
Next

;;;;;; lier 4 caisses pour en faire une piece tetris  


For u=1 To 3
  MoveEntity(entity(u), 0, -1, 0)
  AttachEntityObject(entity(0), "", EntityID(entity(u)))
Next


; Boucle 3D
yy=-0.02
Repeat
  ExamineKeyboard()
  ExamineMouse()
  
  MoveEntity(entity(0), 0, yy, 0)
  RenderWorld() 
  FlipBuffers()    
Until KeyboardReleased(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Middle)
End

;{

DataSection
  ;;;
  Data.b 0,0,0,0
  Data.b 1,1,1,1
  Data.b 0,0,0,0
  Data.b 0,0,0,0
  ;;;
EndDataSection
;}
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Répondre