[v4.51] Collisions avec StaticBody

Généralités sur la programmation 3D
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

[v4.51] Collisions avec StaticBody

Message par kelebrindae »

Bonjour,

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  
Les idées sont le souvenir de choses qui ne se sont pas encore produites.