PureBasic

Forums PureBasic
Nous sommes le Ven 06/Déc/2019 4:44

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 5 messages ] 
Auteur Message
 Sujet du message: Déplacer une entité physique
MessagePosté: Dim 30/Aoû/2015 18:09 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6860
Localisation: IDF (Yvelines)
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:
DisableEntityBody(Player, #False)
pour le réveiller.

Code de test.
Code:
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

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Déplacer une entité physique
MessagePosté: Dim 30/Aoû/2015 19:31 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6860
Localisation: IDF (Yvelines)
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:
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

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Déplacer une entité physique
MessagePosté: Lun 31/Aoû/2015 12:46 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6659
Localisation: Isere
Marche niquel sur XP et 5.31
Merci pour le partage 8)

_________________
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Déplacer une entité physique
MessagePosté: Lun 31/Aoû/2015 14:55 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6860
Localisation: IDF (Yvelines)
@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 ?

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Déplacer une entité physique
MessagePosté: Lun 31/Aoû/2015 15:14 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6659
Localisation: Isere
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)

_________________
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 5 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye