Page 1 sur 1

Comment poser une pièce sur une autre ?

Publié : mar. 04/avr./2023 18:07
par SPH
Salut,

pour un Tetris, la gravité n'est pas adaptée car elle accélère de plus en plus un objet.
Alors, j'ai fait un MoveEntity.
Mais comment le poser sur la premiere pièce qu'il rencontrera ?

Danke :idea:

Code : Tout sélectionner

EnableExplicit

Define Dim camera(1),Dim light(1),Dim mesh(2000),Dim material(1),Dim entity(2000)
; Define camera, light, mesh, material, entity
; Define camera2, light2, mesh2, material2, entity2
Define xx.f, yy.f, zz.f, xx2.f, yy2.f, zz2.f
; Define Dim create.l(100)
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
taille_x=8
taille_y=16


Dim tableau.b(taille_x,taille_y)

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

For y=0 To taille_y
  For x=0 To taille_x
    If x=0 Or y=0 Or x=taille_x 
      tableau(x,y)=1
      mesh(i) = CreateCube(#PB_Any, 1)
      entity(i) = CreateEntity(#PB_Any, MeshID(mesh(i)), MaterialID(material(0)))
      ; On redimentionne le cube.
      ScaleEntity(entity(i), 1, 1, 0.1)
      MoveEntity(entity(i), x, y, 0)
      i+1   
    EndIf
  Next
Next
For u=1 To i-1
  AttachEntityObject(entity(0), "", EntityID(entity(u)))
Next

piece_tetris=i
mesh(piece_tetris) = CreateCube(#PB_Any, 1)
entity(piece_tetris) = CreateEntity(#PB_Any, MeshID(mesh(piece_tetris)), MaterialID(material(0)))
; On redimentionne le cube.
ScaleEntity(entity(piece_tetris), 1, 1, 0.1)
MoveEntity(entity(piece_tetris), 5,12, 0)


; Boucle 3D
yy=-0.0625
Repeat
  ExamineKeyboard()
  ExamineMouse()
  
  If KeyboardReleased(#PB_Key_G) And IsEntity(Entity(0)) 
    CreateEntityBody(Entity(0), #PB_Entity_BoxBody, -0.25, 0, 0) 
  EndIf
  
  If KeyboardReleased(#PB_Key_K) And IsEntity(Entity(0))
    FreeEntity(Entity(0)) 
  EndIf
  
  MoveEntity(entity(piece_tetris), 0, yy, 0)
  RenderWorld() 
  FlipBuffers()    
Until KeyboardReleased(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Middle)
End


Re: Comment poser une pièce sur une autre ?

Publié : mar. 04/avr./2023 21:26
par falsam
EntityCollide() semble être la solution.

Gravité 0
Camera vue de dessus.
Caisse sur l'axe Z
Chaque caisse a un box body
Quand deux caisse se touche, les deux caisses perdent leurs body.

Code : Tout sélectionner

EnableExplicit

; DPI Résolution
Global drx.f, dry.f

drx = DesktopResolutionX()
dry = DesktopResolutionY()

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

ExamineDesktops()
OpenWindow(0, 0,0, DesktopWidth(0)*0.5,DesktopHeight(0)*0.5, "EntityCollide() - [Esc] quit",#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, WindowWidth(0)*drx, WindowHeight(0)*dry, 0, 0, 0)
EnableWorldPhysics(#True)
WorldGravity(0)

Add3DArchive(#PB_Compiler_Home + "examples\3D\Data\Textures", #PB_3DArchive_FileSystem)
Add3DArchive(GetCurrentDirectory(), #PB_3DArchive_FileSystem )
;Parse3DScripts()

CreateCamera(0, 0, 0, 100, 100) 
CameraBackColor(0, RGB(222, 184, 135))

CreateLight(#PB_Any, RGB(255, 255, 255), 100, 100, 100)
AmbientColor(RGB(184, 184, 184))
WorldShadows(#PB_Shadow_Additive)

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

CreateCube(0, 1)
CreateEntity(0, MeshID(0), MaterialID(0), 0, 0, 0)
CreateEntityBody(0, #PB_Entity_BoxBody, 0.1, 0, 0)

CreateEntity(1, MeshID(0), MaterialID(0), 0, 0, -3)
CreateEntityBody(1, #PB_Entity_BoxBody, 0.1, 0, 0)

Repeat
  While WindowEvent() : Wend
  ExamineKeyboard()
  ExamineMouse()
  
  If EntityCollide(0, 1) = #True
    DisableEntityBody(0, #True)
    DisableEntityBody(1, #True)
  Else
    MoveEntity(1, 0, 0, 0.2)  
  EndIf
  
  MoveCamera(0, 0, 10, 0.1, #PB_Absolute)
  CameraLookAt(0, 0, 0, 0)
  
  RenderWorld()
  FlipBuffers()    
Until KeyboardReleased(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Middle)