Page 1 sur 1

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

Publié : ven. 14/avr./2023 11:40
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
!!! :!:

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

Publié : ven. 14/avr./2023 13:26
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 !!

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

Publié : ven. 14/avr./2023 13:52
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

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

Publié : ven. 14/avr./2023 17:00
par SPH
Ton 2ème code fonctionne. Je vais bosser à partir de celui là.

Thx

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

Publié : mer. 19/avr./2023 20:12
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
;}