MoveEntity() ne fonctionne pas quand l'entité c'est endormi

Généralités sur la programmation 3D
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

MoveEntity() ne fonctionne pas quand l'entité c'est endormi

Message par falsam »

Je ne m'explique pas le comportement de cette partie du code.

Code : Tout sélectionner

If PlayerSpeed <> 0
    MoveEntity(Player, 0, 0, PlayerSpeed, #PB_Absolute|#PB_Local)
  EndIf
Quand PlayerSpeed est différent de 0, le cube devrait bouger. Hors ce n'est pas le cas.

Par contre si j’enlève la condition le cube bouge bien !

Un exemple de code.

Code : Tout sélectionner

EnableExplicit

Enumeration
  #Mainform
EndEnumeration

Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered
Global Event.l

Global Camera, Player, PlayerSpeed.f

Procedure Load_Scene()
  Protected Texture, Material, Mesh, Entity
  
  ; Material 
  Texture = CreateTexture(#PB_Any,512,512)
  StartDrawing(TextureOutput(Texture))
  Box(0,0,512,512,RGB(0, 0, 0))
  Box(1,1,510,510,RGB(255, 216, 0))
  StopDrawing()
  Material = CreateMaterial(#PB_Any,TextureID(texture))
  
  ;
  ; Ground
  Mesh = CreatePlane(#PB_Any, 100, 100, 3, 6, 6, 6)
  Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material), 0, 0, 0)
  EntityPhysicBody(Entity, #PB_Entity_StaticBody, 2, 0, 1)

  ;
  ; Player
  Mesh = CreateCube (#PB_Any, 1)
  Player = CreateEntity(#PB_Any, MeshID(Mesh), #PB_Material_None, 0, 1, 0)
  EntityPhysicBody(Player, #PB_Entity_BoxBody, 1, 1, 0)
  
  ;
  ; Ambience
  AmbientColor(RGB(127, 127, 127))
  CreateLight(#PB_Any,RGB(151, 251, 151), -1.8, 10, 5)
  WorldShadows(#PB_Shadow_Additive)

  ;
  ; camera 
  Camera = CreateCamera(#PB_Any,0,0,100,100)
  CameraBackColor(Camera, RGB(145, 182, 201))

  MoveCamera(Camera, 0, 500, 0, #PB_Absolute)  

EndProcedure

Procedure Start()
  InitEngine3D()
  InitKeyboard()
  InitSprite()
  InitMouse()
    
  OpenWindow(#Mainform,0,0,1024,768, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  OpenWindowedScreen(WindowID(#Mainform),0,0,1024,768,0, 0, 0)

  KeyboardMode(#PB_Keyboard_International)

  Load_Scene()
EndProcedure

start()

Repeat
  Repeat
    Event  = WindowEvent()
    Select Event
      Case #PB_Event_CloseWindow
        End
        
    EndSelect
  Until Event = 0
  
  If ExamineKeyboard()
    
    If KeyboardPushed (#PB_Key_Escape)
      Break
    EndIf
  EndIf
  
  If KeyboardPushed (#PB_Key_Up)
    PlayerSpeed = -  1
  ElseIf KeyboardPushed (#PB_Key_Down)
    PlayerSpeed  =  1
  Else
    PlayerSpeed = 0
  EndIf
    
  If KeyboardPushed (#PB_Key_Left)
    RotateEntity(Player, 0, 1.5, 0, #PB_Relative)
  ElseIf KeyboardPushed (#PB_Key_Right)
    RotateEntity(Player, 0, -1.5, 0, #PB_Relative)
  EndIf
  
  If PlayerSpeed <> 0
    MoveEntity(Player, 0, 0, PlayerSpeed, #PB_Absolute|#PB_Local)
  EndIf
  
  CameraFollow(Camera, EntityID(Player), 0, EntityY(Player) + 2, 6, 0.08, 0.08, #True)
  
  ; Render
  ClearScreen(RGB(0, 0, 0))
  RenderWorld(80)
  FlipBuffers()  
  
ForEver
Je fais ce test pour que le moteur 3D s'occupe de l'inertie du cube quand on ne presse plus sur la touche Up ou Down.
Dernière modification par falsam le ven. 04/avr./2014 13:53, modifié 2 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: MoveEntity() ne fonctionne pas dans un test conditionnel

Message par falsam »

Si on place un debug dans le test conditionnel, on voit bien que PlayerSpeed prend la valeur -1 ou 1. Mais le cube ne bouge pas.

Code : Tout sélectionner

If PlayerSpeed <> 0
    Debug PlayerSpeed
    MoveEntity(Player, 0, 0, PlayerSpeed, #PB_Absolute|#PB_Local)
  EndIf
Par contre si je force la valeur de PlayerSpeed à -1 par exemple juste avant le test conditionnel alors là ça fonctionne !

Code : Tout sélectionner

PlayerSpeed = -1
  If PlayerSpeed <> 0
    Debug PlayerSpeed
    MoveEntity(Player, 0, 0, PlayerSpeed, #PB_Absolute|#PB_Local)
  EndIf
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
comtois
Messages : 5172
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: MoveEntity() ne fonctoonne pas dans une condition

Message par comtois »

si tu ajoutes DisableEntityBody(Player, 0) dans ton if , tu réveilles le body.
Si c'est pour gérer l'inertie, tu peux faire comme ça (certes c'est pas le moteur qui s'en charge)

Code : Tout sélectionner

 If KeyboardPushed (#PB_Key_Up)
    If PlayerSpeed >-1
      PlayerSpeed - 0.1
    EndIf  
  ElseIf KeyboardPushed (#PB_Key_Down)
    If PlayerSpeed <1
      PlayerSpeed + 0.1
    EndIf  
  EndIf
   
  If KeyboardPushed (#PB_Key_Left)
    RotateEntity(Player, 0, 1.5, 0, #PB_Relative)
  ElseIf KeyboardPushed (#PB_Key_Right)
    RotateEntity(Player, 0, -1.5, 0, #PB_Relative)
  EndIf
   
  MoveEntity(Player, 0, 0, PlayerSpeed, #PB_Absolute|#PB_Local)
  PlayerSpeed * 0.98
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
comtois
Messages : 5172
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: MoveEntity() ne fonctoonne pas dans une condition

Message par comtois »

et pour un meilleur rendu du sol, tu peux ajouter cette ligne

Code : Tout sélectionner

 MaterialFilteringMode(Material, #PB_Material_Anisotropic, 8)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: MoveEntity() ne fonctoonne pas dans une condition

Message par falsam »

Merci Comtois. J'ai choisi la solution de le réveiller :)
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: MoveEntity() ne fonctoonne pas quand l'entité c'est endo

Message par falsam »

Le Player s'endort sans qu'on lui demande. On peut le tester avec ce code. je pense que c'est un bug est je l'ai signalé sur le forum Anglais.

Code : Tout sélectionner

EnableExplicit

Enumeration
  #Mainform
EndEnumeration

Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered
Global Event.l

Global Camera, Mesh, Entity, Player, PlayerSpeed.f

Procedure GameStart()
  InitEngine3D()
  InitKeyboard()
  InitSprite()
      
  OpenWindow(#Mainform,0,0,1024,768, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  OpenWindowedScreen(WindowID(#Mainform),0,0,1024,768,0, 0, 0)

  KeyboardMode(#PB_Keyboard_International)

  ;Ground
  Mesh = CreatePlane(#PB_Any, 40, 40, 1, 1, 1, 1)
  Entity = CreateEntity(#PB_Any, MeshID(Mesh), #PB_Material_None, 0, 0, 0)
  EntityPhysicBody(Entity, #PB_Entity_StaticBody, 2, 0, 1)

  ;Player
  Mesh = CreateCube (#PB_Any, 1)
  Player = CreateEntity(#PB_Any, MeshID(Mesh), #PB_Material_None, 0, 1, 0)
  EntityPhysicBody(Player, #PB_Entity_BoxBody, 0.5, 0.5, 0.1)
  
  ;Ambience
  AmbientColor(RGB(127, 127, 127))
  CreateLight(#PB_Any,RGB(151, 251, 151), -1.8, 10, 5)
  WorldShadows(#PB_Shadow_Additive)

  ; Camera 
  Camera = CreateCamera(#PB_Any,0,0,100,100)
  CameraBackColor(Camera, RGB(145, 182, 201)) 

EndProcedure

GameStart()

Repeat
  Repeat
    Event  = WindowEvent()
    Select Event
      Case #PB_Event_CloseWindow
        End
        
    EndSelect
  Until Event = 0
  
  If ExamineKeyboard()    
    If KeyboardPushed (#PB_Key_Escape)
      Break
    EndIf
  EndIf
  
  If KeyboardPushed (#PB_Key_Up)
    PlayerSpeed = -  1
  ElseIf KeyboardPushed (#PB_Key_Down)
    PlayerSpeed  =  1
  Else
    PlayerSpeed = 0
  EndIf
    
  If KeyboardPushed (#PB_Key_Left)
    RotateEntity(Player, 0, 1.5, 0, #PB_Relative)
  ElseIf KeyboardPushed (#PB_Key_Right)
    RotateEntity(Player, 0, -1.5, 0, #PB_Relative)
  EndIf
  
  If PlayerSpeed <> 0
    Debug GetEntityAttribute(Player, #PB_Entity_IsActive)
    MoveEntity(Player, 0, 0, PlayerSpeed, #PB_Absolute|#PB_Local)
  EndIf
  
  CameraFollow(Camera, EntityID(Player), 0, EntityY(Player) + 2, 6, 0.08, 0.08, #True)
  
  ClearScreen(RGB(0, 0, 0))
  RenderWorld(80)
  FlipBuffers()  
ForEver
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre