J'ai un petit soucis avec les collisions.
Je me suis créé une sorte d'éditeur de niveau 3D basé sur un tileset (on pose des portions de murs pour "clôturer" l'espace de jeu, puis des objets pour meubler un peu). Pour simplifier un peu le déplacement du perso, je veux stocker dans un tableau les "cases" du niveau dans lesquelles le perso peut aller.
Donc, une fois le niveau constitué, je lance une procédure qui parcoure toutes les cases de ce niveau pour voir lesquelles sont libres. Et c'est là qu'est le problème: pour faire ça précisément, les objets qui constituent mon niveau doivent être "static". et je n'arrive pas à détecter les collisions (en 4.51 comme en 4.60).
J'ai raté quelque chose ?
Le mesh utilisé dans l'exemple: http://keleb.free.fr/codecorner/downloa ... /cube.mesh
Un extrait du code:
Code : Tout sélectionner
;********************************************************
;- --- Main ---
;********************************************************
;- Initialisation
If InitEngine3D() = 0
MessageRequester( "Error" , "Can't initialize 3D, check if engine3D.dll is available" , 0 )
End
ElseIf InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
MessageRequester( "Error" , "Can't find DirectX 7.0 or above" , 0 )
End
EndIf
;- Window
OpenWindow(0,0, 0, 800 , 500 ,"3D Tileset",#PB_Window_ScreenCentered | #PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(0),0,0, 800 , 500,0,0,0)
;- Add 3D directories
Add3DArchive(".", #PB_3DArchive_FileSystem)
;- Camera
CreateCamera(0,0,0,100,100)
CameraBackColor(0,$9C6B2E)
;- Light
AmbientColor($777777)
CreateLight(0, $DDDDDD,100,200,100)
; Test Collisions
EnableWorldPhysics(#True)
EnableWorldCollisions(#True)
WorldDebug(#PB_World_DebugBody)
; Create Obstacle
nummesh = LoadMesh(#PB_Any,"cube.mesh")
numEntity = CreateEntity(#PB_Any,MeshID(nummesh),#PB_Material_None,12.3,0.5,9.4)
EntityPhysicBody(numEntity,#PB_Entity_StaticBody)
ScaleEntity(numEntity,2.5,1,2.5)
CameraLocate(0,EntityX(numEntity) + 10,EntityY(numEntity) + 20,EntityZ(numEntity) + 15)
CameraLookAt(0,EntityX(numEntity),EntityY(numEntity),EntityZ(numEntity))
gridsize.i = 10
minX = 0:minY = 0
maxX = 2:maxY = 1
; Pour chaque case de la grille:
For tileZ = minY To maxY
For tileX = minX To maxX
; On découpe la case en N subdivisions de taille 1x1, et on teste s'il y a un obstacle dans ces subdivisions
For z = 1 To gridsize
For x = 1 To gridsize
; On crée un cube dans la subdivision courante
numentity = CreateEntity(#PB_Any,MeshID(nummesh),#PB_Material_None,tileX * gridsize + x - 0.5,1,tileZ * gridsize + z - 0.5)
EntityPhysicBody(numEntity,#PB_Entity_BoxBody)
; On l'affiche
RenderWorld()
FlipBuffers()
; On regarde s'il y a une collision
ExamineWorldCollisions()
While NextWorldCollision() > 0
If FirstWorldCollisionEntity() = numentity Or SecondWorldCollisionEntity() = numentity
Debug "Collision at " + StrF(tileX * gridsize + x,2) + " , " + StrF(tileZ * gridsize + z,2)
Break
EndIf
Wend
; Suppression du cube
FreeEntity(numentity)
Next x
Next z
Next tileX
Next tileZ