Comment poser une pièce sur une autre ?

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

Comment poser une pièce sur une autre ?

Message 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


!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: Comment poser une pièce sur une autre ?

Message 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)
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%
Répondre