Node et gestion des collisions.

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

Node et gestion des collisions.

Message par falsam »

Savoir quand il y a collision avec un node en mouvement n'est pas possible. J'ai bien pensé à attaché un prim invisible qui englobe le tout mais mon node perd des morceaux (Oui c'est possible :mrgreen:)

Je pense maigres tout qu'il faut attacher un prim invisible mais je ne sais pas quelle méthode employer.

Je suis preneur de vos idées. Merci :)
Dernière modification par falsam le dim. 13/avr./2014 17:09, modifié 1 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 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 : 7323
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Node et gesrtion des collisions.

Message par falsam »

En fait c'est le contraire. Il faut attacher le node à une entité et non pas une entité au node.

L'entité devra être invisible.

Exemple à suivre ......
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Node et gesrtion des collisions.

Message par comtois »

falsam a écrit :Exemple à suivre ......
ouais, parce que là je ne vois pas à quoi ça peut servir.
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 : 7323
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Node et gesrtion des collisions.

Message par falsam »

comtois a écrit :ouais, parce que là je ne vois pas à quoi ça peut servir.
Controler un node avec les touches du clavier et gérer les collisions.

j'attache une entité invisible (par exemple un cube natif) au node que je contrôle pour gérer les collisions avec cette entité : Le souci est que bien qu'étant invisible j'ai son ombre sur le sol !!

La seule solution que je vois pour le moment est de loader un mesh et ne pas activer son ombre.

Le code à l'arrache arrive :)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Node et gesrtion des collisions.

Message par comtois »

falsam a écrit :Le code à l'arrache arrive :)
La fameuse méthode à l'arrache ... j'ai lu récemment le commentaire d'un ingénieur développement logiciels
Dans mon précédent emploi, envoyé en mission chez un client, pour débuguer un code source fait par un stagiaire, j'ai eu droit à un préambule qui m'a tout de suite mis dans l'ambiance :

Code : Tout sélectionner

/*programme fait selon les normes de la methodologie "larache" certifiee iso 1664, 
suite a un cahier des charges, des specifications techniques et une documentation 
rediges selon la meme méthode*/
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 : 7323
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Node et gesrtion des collisions.

Message par falsam »

comtois a écrit :La fameuse méthode à l'arrache ... j'ai lu récemment le commentaire d'un ingénieur développement logiciels:

"Dans mon précédent emploi, envoyé en mission chez un client, pour débuguer un code source fait par un stagiaire, j'ai eu droit à un préambule qui m'a tout de suite mis dans l'ambiance :

/*programme fait selon les normes de la methodologie "larache" certifiee iso 1664,
suite a un cahier des charges, des specifications techniques et une documentation
rediges selon la meme méthode*/"
Moi c'est pire que ça. Je ne l'ai même pas imaginé sur papier.

Voila le fameux code. Un petit bonhomme qui marche, court, s'assoit, saute et leve les bras au ciel. Vous me pardonnerez les affreuses textures qui agrémentes ce code et la façon dont il est codé (je voulais créer un fichier xml pour les paramétres du bonhomme mais j'étais pressé de vous montrer quelque chose :)

L’exécution du code demande d'être connecter à internet pour charger les textures.

■ Flèches pour se déplacer
■ S : S'asseoir et se lever
■ R : Courir et marcher à nouveau
■ H : mains en l'air et baisser à nouveau
■ Espace : Sauter (Fonctionne à l'arrêt uniquement)

Code : Tout sélectionner

EnableExplicit

;-
;- // Skeleton Module
DeclareModule Skeleton
  Declare SkeletonCreate(Body.s, x, y, z)
  Declare SkeletonSetBounce(Entity, BounceY.f, BounceStep.f, StartY.f=#PB_Ignore)
  Declare.f SkeletonGetBounce(Entity)
  Declare SkeletonSetPosition(Entity, x.f, y.f, z.f)
  Declare SkeletonIsWait(Entity)
  Declare SkeletonIsSit(Entity)  
  Declare SkeletonIsRun(Entity)
  Declare SkeletonAnimationPlay(Entity, Animation.s, Flag = #PB_Default)
EndDeclareModule

Module Skeleton
  ;- Private 
  Structure Angle
    x.f
    y.f
    z.f 
  EndStructure
  
  Structure NodeParameter
    IdNode.i
    IdEntity.i
    
    x.f
    y.f
    z.f
    
    Width.i
    Height.i
    
    Rotation.Angle
    RotationMin.Angle
    RotationMax.Angle
    
    RotationSense.i
    RotationStep.f
  EndStructure
  
  Structure Node
    IdNode.i
    
    Head.NodeParameter
    Body.NodeParameter
    LShoulder.NodeParameter
    RShoulder.NodeParameter
    LHip.NodeParameter
    RHip.NodeParameter  
    
    Wait.b
    Run.b
    Fly.b
    Sit.b
    HandUp.b
    
    Jump.b
    JumpTimer.f
    JumpSens.i
    
    BounceY.f
    BounceStep.f
    BounceSense.i
    y.f
  EndStructure
  
  Global NewMap Skeleton.Node()
    
  Procedure SkeletonSetDefault(Entity)
    FindMapElement(Skeleton(), Str(Entity))
    Skeleton()\Head\Rotation\y = 0
  
    If Skeleton()\HandUp = #False
      Skeleton()\RShoulder\Rotation\x = 210
      Skeleton()\RShoulder\Rotation\z = -10

      Skeleton()\LShoulder\Rotation\x = 210
      Skeleton()\LShoulder\Rotation\z = 10
    EndIf 
            
    Skeleton()\Head\RotationSense = 1
    Skeleton()\RShoulder\RotationSense = 1
    Skeleton()\LShoulder\RotationSense = -1
    
    If SkeletonIsSit(Node) = #False
      Skeleton()\LHip\Rotation\x = 180
      Skeleton()\RHip\Rotation\x = 180

      Skeleton()\LHip\RotationSense = 1
      Skeleton()\RHip\RotationSense = -1
    EndIf
  EndProcedure

  ;-Public
  Procedure SkeletonCreate(Body.s, x, y, z)  
    Protected Node, Texture, Mesh, Entity
    
    ;Create Skeleton Container
    
    ;Texture manuel avec une couche alpha (Fond blanc)
    Texture = CreateTexture(#PB_Any,128,128)
    StartDrawing(TextureOutput(Texture))
    DrawingMode(#PB_2DDrawing_AllChannels)
    Box(0,0,128,128, RGBA(255, 255, 255, 0))
    StopDrawing()
    Material = CreateMaterial(#PB_Any, TextureID(Texture))
    MaterialBlendingMode(Material, #PB_Material_AlphaBlend)
    SetMaterialColor(Material, #PB_Material_DiffuseColor, RGBA(255, 2255, 255, 0))

    Mesh = LoadMesh(#PB_Any, Body)
    Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material), x, y, z)   
 
    AddMapElement(Skeleton(), Str(Entity))
    
    Node = CreateNode(#PB_Any, 0, 0, 0)
    Skeleton()\IdNode = Node
    
    ;General skeleton structure 
    Skeleton()\Head\IdNode      = CreateNode(#PB_Any, 0, 2.5, 0)
    Skeleton()\Body\IdNode      = CreateNode(#PB_Any, 0, 1.5, 0)
    Skeleton()\LShoulder\IdNode = CreateNode(#PB_Any, -0.7, 2, 0)
    Skeleton()\RShoulder\IdNode = CreateNode(#PB_Any, 0.7, 2, 0)
    Skeleton()\LHip\IdNode      = CreateNode(#PB_Any, -0.3, 1, 0)
    Skeleton()\RHip\IdNode      = CreateNode(#PB_Any, 0.3, 1, 0)

    AttachNodeObject(Node, NodeID(Skeleton()\Head\IdNode))
    AttachNodeObject(Node, NodeID(Skeleton()\Body\IdNode))
    AttachNodeObject(Node, NodeID(Skeleton()\LShoulder\IdNode))
    AttachNodeObject(Node, NodeID(Skeleton()\RShoulder\IdNode))
    AttachNodeObject(Node, NodeID(Skeleton()\LHip\IdNode))
    AttachNodeObject(Node, NodeID(Skeleton()\RHip\IdNode))
  
    ;Define Head
    Skeleton()\Head\IdEntity = CreateEntity(#PB_Any, MeshID(CreateCube(#PB_Any, 0.7)), #PB_Material_None)
    ScaleEntity(Skeleton()\Head\IdEntity, 1, 1, 1, #PB_Absolute)
    AttachNodeObject(Skeleton()\Head\IdNode, EntityID(Skeleton()\Head\IdEntity))
    Skeleton()\Head\RotationMax\y = 10
    Skeleton()\Head\RotationMin\y = -10
    Skeleton()\Head\RotationStep = 0.5
    Skeleton()\Head\RotationSense = 1
  
    ;Define Body
    Skeleton()\Body\IdEntity = CreateEntity(#PB_Any, MeshID(CreateCube(#PB_Any, 1)), #PB_Material_None)
    ScaleEntity(Skeleton()\Body\IdEntity, 1, 1.2, 0.5, #PB_Absolute)
    AttachNodeObject(Skeleton()\Body\IdNode, EntityID(Skeleton()\Body\IdEntity))
  
    ;Define Left Arm
    Skeleton()\LShoulder\IdEntity = CreateEntity(#PB_Any, MeshID(CreateCube(#PB_Any, 1)), #PB_Material_None, 0, 0.5, 0)
    ScaleEntity(Skeleton()\LShoulder\IdEntity, 0.3, 1.5, 0.3, #PB_Absolute)
    AttachNodeObject(Skeleton()\LShoulder\IdNode, EntityID(Skeleton()\LShoulder\IdEntity))
    Skeleton()\LShoulder\RotationMax\x = 260
    Skeleton()\LShoulder\RotationMin\x = 160
    Skeleton()\LShoulder\RotationStep = 2.0
    Skeleton()\LShoulder\RotationSense = -1
  
    ;Define Right Arm
    Skeleton()\RShoulder\IdEntity = CreateEntity(#PB_Any, MeshID(CreateCube(#PB_Any, 1)), #PB_Material_None, 0, 0.5, 0)
    ScaleEntity(Skeleton()\RShoulder\IdEntity, 0.3, 1.5, 0.3, #PB_Absolute)
    AttachNodeObject(Skeleton()\RShoulder\IdNode, EntityID(Skeleton()\RShoulder\IdEntity))
    Skeleton()\RShoulder\RotationMax\x = 260
    Skeleton()\RShoulder\RotationMin\x = 160
    Skeleton()\RShoulder\RotationStep = 2.0
    Skeleton()\RShoulder\RotationSense = 1
  
    ;Define Left Leg
    Skeleton()\LHip\IdEntity = CreateEntity(#PB_Any, MeshID(CreateCube(#PB_Any, 0.8)), #PB_Material_None, 0, 0.5, 0)
    ScaleEntity(Skeleton()\LHip\IdEntity, 0.4, 1.2, 0.6, #PB_Absolute)
    AttachNodeObject(Skeleton()\LHip\IdNode, EntityID(Skeleton()\LHip\IdEntity))
    Skeleton()\LHip\RotationMax\x = 230
    Skeleton()\LHip\RotationMin\x = 130
    Skeleton()\LHip\RotationStep = 2.0
    Skeleton()\LHip\RotationSense = 1

    ;Define Right Leg
    Skeleton()\RHip\IdEntity = CreateEntity(#PB_Any, MeshID(CreateCube(#PB_Any, 0.8)), #PB_Material_None, 0, 0.5, 0)
    ScaleEntity(Skeleton()\RHip\IdEntity, 0.4, 1.2, 0.6, #PB_Absolute)
    AttachNodeObject(Skeleton()\RHip\IdNode, EntityID(Skeleton()\RHip\IdEntity))
    Skeleton()\RHip\RotationMax\x = 230
    Skeleton()\RHip\RotationMin\x = 130
    Skeleton()\RHip\RotationStep = 2.0
    Skeleton()\RHip\RotationSense = -1    
    
    AttachEntityObject(Entity, "", NodeID(Node))
    
    ProcedureReturn Entity
  EndProcedure
  
  Procedure SkeletonSetBounce(Entity, BounceY.f, BounceStep.f, StartY.f=#PB_Ignore)
    FindMapElement(Skeleton(), Str(Entity))
    Skeleton()\BounceY = BounceY
    Skeleton()\BounceStep = BounceStep
    If StartY <> #PB_Ignore
      Skeleton()\y = StartY
    EndIf
  EndProcedure
  
  Procedure SkeletonSetPosition(Entity, x.f, y.f, z.f)
    FindMapElement(Skeleton(), Str(Entity))
    MoveNode(Skeleton()\IdNode, x, y, z, #PB_Relative)
  EndProcedure
    
  Procedure.f SkeletonGetBounce(Entity)
    FindMapElement(Skeleton(), Str(Entity))
    ProcedureReturn Skeleton()\BounceStep
  EndProcedure
  
  Procedure SkeletonIsWait(Entity)
    FindMapElement(Skeleton(), Str(Entity))
    ProcedureReturn Skeleton()\Wait
  EndProcedure
  
  Procedure SkeletonIsSit(Entity)
    FindMapElement(Skeleton(), Str(Entity))
    ProcedureReturn Skeleton()\Sit
  EndProcedure

  Procedure SkeletonIsRun(Entity)
    FindMapElement(Skeleton(), Str(Entity))
    ProcedureReturn Skeleton()\Run
  EndProcedure

  Procedure SkeletonAnimationPlay(Entity, Animation.s, Flag = #PB_Default)
    FindMapElement(Skeleton(), Str(Entity))
    If Skeleton()\Jump =#True
      If Skeleton()\JumpTimer > 0 And Skeleton()\JumpTimer < 20
        Skeleton()\JumpTimer + 0.1
        If Skeleton()\JumpTimer > 20
          Skeleton()\Jump = #False
          Skeleton()\LShoulder\Rotation\x = -10
          Skeleton()\RShoulder\Rotation\x = -10
          Skeleton()\LHip\Rotation\x = 120
          Skeleton()\RHip\Rotation\x = 130 
        EndIf
     EndIf  
    EndIf
    
    Select LCase(Animation)
      Case "wait" ;-Define Animation Wait
        Skeleton()\Wait = #True
        SkeletonSetDefault(Node)     
        
      Case "walk" ;-Define Animation Walk
        Skeleton()\Wait = #False
        
        If Skeleton()\Head\Rotation\y > Skeleton()\Head\RotationMax\y
          Skeleton()\Head\RotationSense = -1
        EndIf
      
        If Skeleton()\Head\Rotation\y < Skeleton()\Head\RotationMin\y
          Skeleton()\Head\RotationSense = 1
        EndIf
      
        If Skeleton()\RShoulder\Rotation\x > Skeleton()\RShoulder\RotationMax \x
         Skeleton()\RShoulder\RotationSense = -1
        EndIf
      
        If Skeleton()\RShoulder\Rotation\x < Skeleton()\RShoulder\RotationMin\x
         Skeleton()\RShoulder\RotationSense = 1
        EndIf
    
        If Skeleton()\LShoulder\Rotation\x > Skeleton()\LShoulder\RotationMax\x
          Skeleton()\LShoulder\RotationSense = -1
        EndIf
      
        If Skeleton()\LShoulder\Rotation\x < Skeleton()\LShoulder\RotationMin\x
          Skeleton()\LShoulder\RotationSense = 1
        EndIf
    
        If Skeleton()\RHip\Rotation\x > Skeleton()\RHip\RotationMax\x
          Skeleton()\RHip\RotationSense = -1
        EndIf
        
        If Skeleton()\RHip\Rotation\x  < Skeleton()\RHip\RotationMin\x 
          Skeleton()\RHip\RotationSense = 1
        EndIf
      
        If Skeleton()\LHip\Rotation\x > Skeleton()\LHip\RotationMax\x
          Skeleton()\LHip\RotationSense = -1
        EndIf
      
        If Skeleton()\LHip\Rotation\x < Skeleton()\LHip\RotationMin\x
          Skeleton()\LHip\RotationSense = 1
        EndIf
      
        Skeleton()\Head\Rotation\y + (Skeleton()\Head\RotationStep * Skeleton()\Head\RotationSense)
    
        If Skeleton()\HandUp = #False
         Skeleton()\RShoulder\Rotation\x + (Skeleton()\RShoulder\RotationStep * Skeleton()\RShoulder\RotationSense)
          Skeleton()\LShoulder\Rotation\x + (Skeleton()\LShoulder\RotationStep * Skeleton()\LShoulder\RotationSense)
        EndIf
            
        Skeleton()\RHip\Rotation\x + (Skeleton()\Rhip\RotationStep * Skeleton()\RHip\RotationSense)
        Skeleton()\LHip\Rotation\x + (Skeleton()\LHip\RotationStep * Skeleton()\LHip\RotationSense)
      
      Case "run" ;-Define Animation Run
        Skeleton()\Wait = #False
        If Skeleton()\Run = #False
          Skeleton()\Run = #True
          Skeleton()\LShoulder\RotationStep = 4
          Skeleton()\RShoulder\RotationStep = 4
          Skeleton()\LHip\RotationStep = 4
          Skeleton()\RHip\RotationStep = 4
        Else
          Skeleton()\Run = #False
          Skeleton()\LShoulder\RotationStep = 2
          Skeleton()\RShoulder\RotationStep = 2
          Skeleton()\LHip\RotationStep = 2
          Skeleton()\RHip\RotationStep = 2
        EndIf
            
      Case "jump" ;-Define Animation Jump
        Skeleton()\Wait = #False
        Skeleton()\Jump = #True
        SkeletonSetDefault(Node) 
        
      
      Case "fly" ;-Define Animation Fly
        Skeleton()\Wait = #False
        
      Case "sit"
        Skeleton()\Wait = #False
        
        ;-Deine Animation Sit
        SkeletonSetDefault(Node) 
        If Skeleton()\Sit = #False
          Skeleton()\Sit = #True
          Skeleton()\LHip\Rotation\x = -90
          Skeleton()\RHip\Rotation\x = -90
        Else
          SkeletonSetDefault(Node)
          Skeleton()\Sit = #False
        EndIf
      
      Case "handup" ;-Define Animation HandUp
        SkeletonSetDefault(Node) 
      
        If Skeleton()\HandUp = #False
          Skeleton()\HandUp = #True
          Skeleton()\LShoulder\Rotation\x = -10
          Skeleton()\RShoulder\Rotation\x = -10
        Else
          Skeleton()\RShoulder\Rotation\x = 210
          Skeleton()\RShoulder\Rotation\z = -10

          Skeleton()\LShoulder\Rotation\x = 210
          Skeleton()\LShoulder\Rotation\z = 10

          Skeleton()\HandUp = #False
        EndIf    
    EndSelect
  
    ;-Show animation (Head + Shoulder + Hip)
    RotateNode(Skeleton()\Head\IdNode, Skeleton()\Head\Rotation\x, Skeleton()\Head\Rotation\y, Skeleton()\Head\Rotation\z, #PB_Absolute)
  
    RotateNode(Skeleton()\LShoulder\IdNode, Skeleton()\LShoulder\Rotation\x, Skeleton()\LShoulder\Rotation\y, Skeleton()\LShoulder\Rotation\z, #PB_Absolute)
    RotateNode(Skeleton()\RShoulder\IdNode, Skeleton()\RShoulder\Rotation\x, Skeleton()\RShoulder\Rotation\y, Skeleton()\RShoulder\Rotation\z, #PB_Absolute)
  
    RotateNode(Skeleton()\LHip\IdNode, Skeleton()\LHip\Rotation\x, Skeleton()\LHip\Rotation\y, Skeleton()\LHip\Rotation\z, #PB_Absolute)
    RotateNode(Skeleton()\RHip\IdNode, Skeleton()\RHip\Rotation\x, Skeleton()\RHip\Rotation\y, Skeleton()\RHip\Rotation\z, #PB_Absolute) 
    
    ;-Update Bounce
    Skeleton()\y + Skeleton()\BounceStep
    If Skeleton()\y  > Skeleton()\BounceY
      Skeleton()\BounceStep * -1
    EndIf
    
    If Skeleton()\y  < 0
      Skeleton()\BounceStep * -1
    EndIf
    
  EndProcedure
EndModule

;-
;-// Test Area
Enumeration
  #Mainform
EndEnumeration

Global WWidth, WHeight, Event.f
Global Camera.i,Texture.i, Material.i, Mesh.i, Ground, Entity.i, TopBuilding, Radius, x, z, Width, Height, Help
Global Player.i, PlayerSpeed.f, n
Global Av1, Av2
UseModule Skeleton

InitEngine3D()
InitKeyboard()
InitSprite()
InitMouse()
InitNetwork()

ReceiveHTTPFile("http://s242132022.onlinehome.fr/Download/image/floor1.jpg", GetTemporaryDirectory()+"floor1.jpg")
ReceiveHTTPFile("http://s242132022.onlinehome.fr/Download/image/building1.jpg", GetTemporaryDirectory()+"building1.jpg")
ReceiveHTTPFile("http://s242132022.onlinehome.fr/Download/image/body2.mesh", GetTemporaryDirectory()+"body2.mesh")

Add3DArchive(GetTemporaryDirectory(), #PB_3DArchive_FileSystem) 

OpenWindow(#Mainform,0, 0, 0, 0, "", #PB_Window_SystemMenu | #PB_Window_Maximize)
WWidth = WindowWidth(#Mainform, #PB_Window_InnerCoordinate)
WHeight = WindowHeight(#Mainform, #PB_Window_InnerCoordinate)
OpenWindowedScreen(WindowID(#Mainform),0,0,WWIdth,WHeight,0, 0, 0)

EnableWorldPhysics(#True)
EnableWorldCollisions(#True)
KeyboardMode(#PB_Keyboard_International)
 
;Ambiance
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -5, 100, 20)
WorldShadows(#PB_Shadow_Additive)

;Ground
Texture = LoadTexture(#PB_Any, "floor1.jpg")
Material = CreateMaterial(#PB_Any,TextureID(Texture))
Ground = CreateEntity(#PB_Any, MeshID(CreatePlane(#PB_Any, 100, 100, 10, 10, 20, 20)), MaterialID(Material), 0, 0, 0)
EntityPhysicBody(Ground, #PB_Entity_StaticBody, 2, 0, 1)

;Building
Texture = LoadTexture(#PB_Any, "building1.jpg")
Material = CreateMaterial(#PB_Any, TextureID(Texture))
  
Mesh = CreateCube(#PB_Any, 1)
TopBuilding = CreateCube(#PB_Any, 1)
  
For Radius = 0 To 359 Step 10
  x = 50 * Cos(Radius * #PI / 180)
  z = 30 * Sin(Radius * #PI / 180)
    
  Width = Random(10, 5)
  Height = Random(20, 10)
    
  Entity = CreateEntity(#PB_Any, MeshID(TopBuilding), #PB_Material_None, x, Height, z)
  ScaleEntity(Entity, 7, 0.20, Width+1)
  EntityPhysicBody(Entity, #PB_Entity_StaticBody)
  RotateEntity(Entity, 0, 90+Radius, 0)
    
  Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material), x, Height/2, z)
  ScaleEntity(Entity, 6, Height, Width)
  EntityPhysicBody(Entity, #PB_Entity_StaticBody)
  RotateEntity(Entity, 0, 90+Radius, 0)
Next 

;Block
Mesh = CreateCube(#PB_Any, 8)
For n=1 To 3
  Entity = CreateEntity(#PB_Any, MeshID(Mesh), #PB_Material_None, n, 0.3*n, n*2)
  ScaleEntity(Entity, 1, 0.05, 1)
  EntityPhysicBody(Entity, #PB_Entity_StaticBody)
Next
;camera 
Camera = CreateCamera(#PB_Any,0,0,100,100)
CameraBackColor(Camera, RGB(145, 182, 201))
MoveCamera(Camera, 2, 50, 15, #PB_Absolute)  

;-Create Player
Player = SkeletonCreate("body2.mesh", 10, 2, 20)
EntityPhysicBody(Player, #PB_Entity_BoxBody, 0.5, 0.5, 0.2)
SkeletonSetPosition(Player, 0, -0.50, 0)
;SkeletonSetBounce(Player, 0.2, 0.01)

Av1 = SkeletonCreate("body2.mesh", 10, 2, 0)
EntityPhysicBody(Av1, #PB_Entity_BoxBody, 0.5, 0.5, 0.2)
SkeletonSetPosition(Av1, 0, -0.50, 0)
SkeletonAnimationPlay(Av1, "wait")
SkeletonAnimationPlay(Av1, "walk")

Av2 = SkeletonCreate("body2.mesh", 0, 2, 5)
RotateEntity(Av2, 0, 35, 0)
EntityPhysicBody(Av2, #PB_Entity_StaticBody, 0.5, 0.5, 0.2)
SkeletonAnimationPlay(Av2, "Sit")
SkeletonSetPosition(Av2, 0, -1.50, 0)


;Help
Help = CreateSprite(#PB_Any, WWidth, 20)

Repeat
  Repeat
    Event  = WindowEvent()
    Select Event
      Case #PB_Event_CloseWindow
        End
        
    EndSelect
  Until Event = 0
  
  If ExamineKeyboard()
    
    If KeyboardPushed (#PB_Key_Escape)
      Break
    EndIf
    
    ;En avant ou en arriére
    If Not SkeletonIsSit(Player)
      If KeyboardPushed (#PB_Key_Up)
        If SkeletonIsRun(Player) = #False
          PlayerSpeed = -2
        Else
          PlayerSpeed = -4
        EndIf 
        SkeletonAnimationPlay(Player, "walk")
      
      ElseIf KeyboardPushed (#PB_Key_Down)
        If SkeletonIsRun(Player) = #False
          PlayerSpeed = 2
        Else
          PlayerSpeed = 4
        EndIf 
        SkeletonAnimationPlay(Player, "walk")
      
      Else
        SkeletonAnimationPlay(Player, "wait")
        PlayerSpeed = 0
      EndIf
    
      ;A gauche ou à droite
      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
    
      ;Run
      If KeyboardReleased (#PB_Key_R)
        SkeletonAnimationPlay(Player, "run")
      EndIf    
            
      ;Jump
      If KeyboardReleased (#PB_Key_Space)
        ApplyEntityImpulse(Player, 0, 3, 0, 0, 1, 0)
      EndIf
    Else
      PlayerSpeed = 0
    EndIf 
    
    ;Sit
    If KeyboardReleased (#PB_Key_S)
      SkeletonAnimationPlay(Player, "sit")
      If SkeletonIsSit(Player) = #True
        SkeletonSetPosition(Player, 0, -0.80, 0)
      Else
        SkeletonSetPosition(Player, 0, 0.80, 0)
      EndIf
    EndIf    
    
    ;Hand Up
    If KeyboardReleased (#PB_Key_H)
      SkeletonAnimationPlay(Player, "handup")
    EndIf    

  EndIf  
  
  If Not SkeletonIsSit(Player)
    If PlayerSpeed <> 0
      DisableEntityBody(Player, 0) ;Bug Fix
      MoveEntity(Player, 0, 0, PlayerSpeed, #PB_Absolute|#PB_Local)
    EndIf

    CameraFollow(Camera, EntityID(Player), 45, EntityY(Player)+4, 6, 0.01, 0.01)   
  Else
    CameraFollow(Camera, EntityID(Player), 220, EntityY(Player)+1, 8, 0.01, 0.01)
  EndIf  
  
  
  EntityLookAt(Av1, EntityX(Player), EntityY(Av1), EntityZ(Player))
  MoveEntity(Av1, 0, 0, -1.5, #PB_Absolute|#PB_Local)
  SkeletonAnimationPlay(Av1, "walk")
  ;ClearScreen(RGB(0, 0, 0))
  RenderWorld(50)
  
  StartDrawing(SpriteOutput(Help))
  Box(0, 0, WWidth, 20, RGBA(178,34,34,255))
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawText(5,2,"S: Sit - R: Run - H:Hand Up - Space : Jump")
  StopDrawing()  
  DisplaySprite(Help, 0, WHeight-20)
  
  FlipBuffers()  
ForEver

;Delete files
DeleteFile(GetTemporaryDirectory()+"floor1.jpg")
DeleteFile(GetTemporaryDirectory()+"building1.jpg")
DeleteFile(GetTemporaryDirectory()+"body2.mesh")
Dernière modification par falsam le dim. 13/avr./2014 19:04, modifié 1 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 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 : 7323
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Node et gestion des collisions.

Message par falsam »

le code est un peu plus propre. Une gestion des entités (je dirais avatar maintenant) en mouvements à travers une map.

Pour illustrer cela, trois avatars : Le joueur, un assis et un dernier qui va vous suivre. La gestion des obstacles statics n'est pas encore prévu.

Le code est mis en jour.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Node et gestion des collisions.

Message par G-Rom »

La méthode à la rache est une institution : http://www.byatoo.com/la-rache/
La méthode est même normalisé & conforme à l'ISO-1664 !

cycle typique du développement à la rache :

Image
Avatar de l’utilisateur
falsam
Messages : 7323
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Node et gestion des collisions.

Message par falsam »

J'ai sauté la phase de rédaction du post-it pour sauter directement vers l’incongruité temporelle :mrgreen:
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Node et gestion des collisions.

Message par comtois »

falsam a écrit :Le code est mis en jour.
Bravo tu as mérité ton certificat :)

Image
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
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Node et gestion des collisions.

Message par Ar-S »

J'adore ce topic :mrgreen:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7323
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Node et gestion des collisions.

Message par falsam »

comtois a écrit :Bravo tu as mérité ton certificat :)
Sachant que la reconnaissance silencieuse ne sert à personne et qu'il faut remercier les hommes le moins possible parce que la reconnaissance qu'on leur témoigne les persuade aisément qu'ils en font trop !, tu te contenteras d'un simple merci :)
Configuration : Windows 11 Famille 64-bit - PB 6.20 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
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Node et gestion des collisions.

Message par Micoute »

J'adhère complètement avec ce principe, alors simplement, MERCI
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
falsam
Messages : 7323
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Node et gestion des collisions.

Message par falsam »

Sinon ..... Quelqu'un a testé le code ? :mrgreen:
Configuration : Windows 11 Famille 64-bit - PB 6.20 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
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Node et gestion des collisions.

Message par graph100 »

ben, j'ai bien essayé, mais comme toujours depuis que je suis passé sur win8, tout les code 3D plantent sur le renderworld(), et je ne sais pas pourquoi.
Au vu du nombre de jeu installé sur mon pc j'ai approximativement toutes les version de directX9, 10, et 11, donc je vois pas !!
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Répondre