Page 1 sur 1

Déplacer une entité physique

Publié : dim. 30/août/2015 18:09
par falsam
Deux questions
J'ai un souci avec le déplacement d'une entité (player) qui de temps en temps bascule.
:?: Quel serait la bonne méthode pour éviter que mon entité bascule ?

:?: Comment faire aussi pour que mon entité sache monter un escalier par exemple, sans pour cela utiliser une touche pour effectuer une impulsion verticale.

Le code initiale étant trop long. Je poste un code minimaliste dans lequel le player est représenté par un cylindre. Le player ayant tendance à s'endormir j'ai ajouté un

Code : Tout sélectionner

DisableEntityBody(Player, #False)
pour le réveiller.

Code de test.

Code : Tout sélectionner

Enumeration
  #Mainform
EndEnumeration 

Global Speed.f

InitEngine3D() : InitKeyboard() : InitSprite() : InitMouse()

OpenWindow(#Mainform,0,0, 1024, 768, "", #PB_Window_TitleBar)
OpenWindowedScreen(WindowID(#Mainform),0,0,1024,768,0, 0, 0)
Add3DArchive(#PB_Compiler_Home + "\Examples\3D\Data\Textures", #PB_3DArchive_FileSystem)

;Light & Shadow
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -5, 10, 5)
WorldShadows(#PB_Shadow_Additive)

;Camera
CreateCamera(0, 0, 0,100,100)
CameraBackColor(0, RGB(145, 182, 201))
MoveCamera(0, 0, 5, 10, #PB_Absolute)  
CameraLookAt(0, 0,0,0)   

;Ground
Ground = CreateEntity(-1, MeshID(CreatePlane(-1, 20, 20, 1, 1, 10, 10)), #PB_Material_None)
EntityPhysicBody(Ground, #PB_Entity_StaticBody)

;Escalier
For n = 1 To 5
  Entity = CreateEntity(-1, MeshID(CreateCube(-1, 1)), #PB_Material_None, 3+n, n/10, -3)
  ScaleEntity(Entity, 1, 0.2, 1)
  EntityPhysicBody(Entity, #PB_Entity_StaticBody)
Next

;Player
Player = CreateEntity(-1, MeshID(CreateCylinder(-1, 0.2, 2)), #PB_Material_None, 0, 1.5, 0)
EntityPhysicBody(Player, #PB_Entity_CylinderBody, 1, 0.1, 0.1)

Repeat
  Repeat : Until WindowEvent() = 0
          
  If ExamineKeyboard()
    If KeyboardPushed (#PB_Key_Escape)
      Break
    EndIf
    
    If KeyboardPushed (#PB_Key_Up)
      Speed = -1
    ElseIf KeyboardPushed (#PB_Key_Down)
      Speed = 1
    Else
      Speed = 0
    EndIf
    
    If KeyboardPushed (#PB_Key_Right)
      Rotate = -1
    ElseIf KeyboardPushed (#PB_Key_Left)
      Rotate = 1
    Else
      Rotate = 0
    EndIf
  EndIf
  
  If Speed <> 0 Or Rotate <> 0
    DisableEntityBody(Player, #False) ;Workaround 
    
    RotateEntity(Player, 0, Rotate, 0, #PB_Relative)
    MoveEntity(Player, 0, 0, Speed, #PB_Absolute|#PB_Local)
  EndIf 
  
  CameraFollow(Camera, EntityID(Player), 0, 3, 3, 0.1, 0.1)
  
  RenderWorld(30)
  FlipBuffers()  
ForEver

Re: Déplacer une entité physique

Publié : dim. 30/août/2015 19:31
par falsam
Merci à celui qui m'a soufflé la réponse pour empêcher le player de basculer. Il faut utiliser la fonction EntityAngularFactor()

J'ai modifié le code. Le player (Toujours matérialisé par un cylindre) peut maintenant monter les escaliers.

J'ai utilisé la fonction RayPick() pour gérer les collisions avec les autres entités. Si le player tombe de l'escalier, j'interdis la fonction MoveEntity() afin qu'il évite de marcher dans le vide.

Code : Tout sélectionner

Enumeration
  #Mainform
EndEnumeration 

Global Speed.f

InitEngine3D() : InitKeyboard() : InitSprite() : InitMouse()

OpenWindow(#Mainform,0,0, 1024, 768, "", #PB_Window_TitleBar)
OpenWindowedScreen(WindowID(#Mainform),0,0,1024,768,0, 0, 0)
Add3DArchive(#PB_Compiler_Home + "\Examples\3D\Data\Textures", #PB_3DArchive_FileSystem)

;Light & Shadow
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -5, 10, 5)
WorldShadows(#PB_Shadow_Additive)

;Camera
CreateCamera(0, 0, 0,100,100)
CameraBackColor(0, RGB(145, 182, 201))
MoveCamera(0, 0, 5, 10, #PB_Absolute)  
CameraLookAt(0, 0,0,0)   

;Ground - Sol
Ground = CreateEntity(-1, MeshID(CreatePlane(-1, 20, 20, 1, 1, 10, 10)), #PB_Material_None)
EntityPhysicBody(Ground, #PB_Entity_StaticBody)

;Stairway - Escalier
For n = 1 To 10
  Entity = CreateEntity(-1, MeshID(CreateCube(-1, 1)), #PB_Material_None, 10-n, (n/10) - 0.2, -3)
  ScaleEntity(Entity, 1, 0.1, 1)
  EntityPhysicBody(Entity, #PB_Entity_StaticBody)
Next
For n = 10 To 1 Step -1
  Entity = CreateEntity(-1, MeshID(CreateCube(-1, 1)), #PB_Material_None, 0, (n/10) - 0.2, 8-n)
  ScaleEntity(Entity, 1, 0.1, 1)
  EntityPhysicBody(Entity, #PB_Entity_StaticBody)
Next

;Player
Player = CreateEntity(-1, MeshID(CreateCylinder(-1, 0.2, 2)), #PB_Material_None, 9, 1.5, 0)
EntityPhysicBody(Player, #PB_Entity_SphereBody , 1, 0.1, 0.1)
EntityAngularFactor(Player, 0, 0, 0)

Repeat
  Repeat : Until WindowEvent() = 0
          
  If ExamineKeyboard()
    ;End Of Game
    If KeyboardPushed (#PB_Key_Escape)
      Break
    EndIf
    
    ;Player Move
    If KeyboardPushed (#PB_Key_Up)
      Speed = -1.5
    ElseIf KeyboardPushed (#PB_Key_Down)
      Speed = 1.5
    Else
      Speed = 0
    EndIf
    
    ;Player Rotate
    If KeyboardPushed (#PB_Key_Right)
      Rotate = -1
    ElseIf KeyboardPushed (#PB_Key_Left)
      Rotate = 1
    Else
      Rotate = 0
    EndIf
  EndIf
  
  ;Collision avec une autre entité (Method Raypick)
  Collide = RayPick(EntityX(Player), EntityY(Player)-1.05, EntityZ(Player),
                   EntityX(Player), 0, EntityZ(Player))
  
  If (Speed <> 0 Or Rotate <> 0) And Collide <> -1
    DisableEntityBody(Player, #False) ;Workaround 
    
    RotateEntity(Player, 0, Rotate, 0, #PB_Relative)
    MoveEntity(Player, 0, 0, Speed, #PB_Absolute|#PB_Local)
  EndIf 
  
  CameraFollow(Camera, EntityID(Player), 0, 3, 5, 0.1, 0.1)
  
  RenderWorld(30)
  FlipBuffers()  
ForEver

Re: Déplacer une entité physique

Publié : lun. 31/août/2015 12:46
par Kwai chang caine
Marche niquel sur XP et 5.31
Merci pour le partage 8)

Re: Déplacer une entité physique

Publié : lun. 31/août/2015 14:55
par falsam
@Kwai chang caine: Pas folichon ma démo hein ? Je ne savais pas que tu t'amusais toi aussi avec la 3D. Une ouvre à nous montrer ?

Re: Déplacer une entité physique

Publié : lun. 31/août/2015 15:14
par Kwai chang caine
Non j'y connais rien, comme dans tous les graphismes :oops:
Mais j'aime bien essayer les codes 3D, comme tous les autres me diras tu, mais particulierement ceux la, je trouve ça super impressionant ce que vous arrivez à faire avec au final peu de lignes 8O
Certes me diras tu à nouveau, encore faut il trouver les bonnes :mrgreen:
C'est l'avis d'un "newbite"...mais je la trouve cool ta colonne :wink: peut être un peu raide...mais cool 8)