Page 1 sur 1

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

Publié : jeu. 03/avr./2014 21:42
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.

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

Publié : jeu. 03/avr./2014 21:56
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

Re: MoveEntity() ne fonctoonne pas dans une condition

Publié : jeu. 03/avr./2014 22:52
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

Re: MoveEntity() ne fonctoonne pas dans une condition

Publié : jeu. 03/avr./2014 22:57
par comtois
et pour un meilleur rendu du sol, tu peux ajouter cette ligne

Code : Tout sélectionner

 MaterialFilteringMode(Material, #PB_Material_Anisotropic, 8)

Re: MoveEntity() ne fonctoonne pas dans une condition

Publié : jeu. 03/avr./2014 23:01
par falsam
Merci Comtois. J'ai choisi la solution de le réveiller :)

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

Publié : ven. 04/avr./2014 13:53
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