PureBasic

Forums PureBasic
Nous sommes le Sam 14/Déc/2019 20:39

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 67 messages ]  Aller à la page Précédente  1, 2, 3, 4, 5  Suivante
Auteur Message
 Sujet du message: Re: Histoire d'un Cube
MessagePosté: Mar 02/Juil/2013 13:11 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6864
Localisation: IDF (Yvelines)
SPH a écrit:
Ha oui, j'oubliais : il serait bon de faire un code qui fasse tourner un cube et pas la camera
RotateEntity()

Touche PageUp et PageDown dans ce code pour la rotation de l'entité.
Code:
;Naissance d'un cube

; Coordonnées x,y,z de la caméra
Define.f CamX, CamY, CamZ, Y

Define.f

InitEngine3D()
Parse3DScripts()
InitKeyboard()
InitSprite()

window = OpenWindow(#PB_Any,0,0,1024,768,"Histoire d'un cube")
OpenWindowedScreen(WindowID(window),0,0,1024,768)

;
; Les axes
Red = RGB(255, 0, 0) ;Couleur de l'axe x
Green = RGB(0, 255, 0) ;Couleur de l'axe y
Blue = RGB(0, 255, 255) ;Coleur de l'axe z

AxeX = CreateLine3D(#PB_Any, -10,0,0, Red, 10, 0, 0, Red)
AxeY = CreateLine3D(#PB_Any, 0,-10,0, Green, 0, 10, 0, Green)
AxeZ = CreateLine3D(#PB_Any, 0,0,-10, Blue, 0, 0, 10, Blue)

;
; Naissance d'un cube

; Une forme : C'est notre MESH qui ici sera un cube
Mesh = CreateCube(#PB_Any, 2)

; Une texture (Cette texture peut être loader avec l'instruction LoadTexture()
Texture = CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(Texture))
Box(0,0,128,256,RGB(255, 68, 0))
Box(128,0,128,256,RGB(0, 255, 0))
StopDrawing()

; Un MATERIEL c'est la partie visible de notre cube qui sera constitué de notre texture
Material = CreateMaterial(#PB_Any,TextureID(texture))

; Création de notre entité : ENTITE = MESH + MATERIEL
; Par défaut il se positionne au point de coordonnée 0,0,0
Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material))

;
; Une camera
Camera = CreateCamera(#PB_Any,0,0,100,100)
CamX=2.0
CamY=1.0
CamZ=15

; La caméra regarde en dirextion d'un point au coordonnées x=0, y=0, z=0
CameraLookAt(camera,0,0,0)


While #True
 
  Event = WindowEvent()
 
  ExamineKeyboard()
 
  ; Touche Escape pour fermer l'application
  If Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
    Break
  EndIf
 
  If KeyboardPushed(#PB_Key_Left)
    CamX-0.2
  ElseIf KeyboardPushed(#PB_Key_Right)
    CamX+0.2
  EndIf
 
  If KeyboardPushed(#PB_Key_Up)
    CamY+0.2
  ElseIf KeyboardPushed(#PB_Key_Down)
    CamY-0.2
  EndIf
 
  If KeyboardPushed(#PB_Key_PageDown)
    Y=-0.5
  ElseIf KeyboardPushed(#PB_Key_PageUp)
    Y=0.5
  Else
    Y=0
  EndIf
 
  RotateEntity(Entity, X, Y, Z, #PB_Relative)
   
  MoveCamera(camera, CamX, CamY, CamZ, #PB_Absolute)
 
  ; Affiche le rendu de la scène
  ClearScreen(RGB(0, 0, 0))
  RenderWorld()
  FlipBuffers()
Wend

_________________

➽ 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


Dernière édition par falsam le Dim 22/Sep/2013 12:14, édité 2 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Histoire d'un Cube (Initiation à la 3D)
MessagePosté: Mar 02/Juil/2013 13:18 
En ligne
Avatar de l’utilisateur

Inscription: Mer 09/Nov/2005 9:53
Messages: 4071
Pour faire un cube ayant une texture differente sur chaque face, je suppose que l'on ne doit plus utiliser Mesh = CreateCube(#PB_Any, 1) ?

Tiens, en défi, je cherche a faire un cube qui tourne et qui, dans chaque face montre un cube qui tourne !
Mais je n'arrive pas a animer les faces :

Code:
;Naissance d'un cube

; Coordonnées x,y,z de la caméra
Define.f CamX, CamY, CamZ, Y

Define.f

InitEngine3D()
Parse3DScripts()
InitKeyboard()
InitSprite()

window = OpenWindow(#PB_Any,0,0,1024,768,"Histoire d'un cube")
OpenWindowedScreen(WindowID(window),0,0,1024,768)

;
; Les axes
Red = RGB(255, 0, 0) ;Couleur de l'axe x
Green = RGB(0, 255, 0) ;Couleur de l'axe y
Blue = RGB(0, 255, 255) ;Coleur de l'axe z

; AxeX = CreateLine3D(#PB_Any, -10,0,0, Red, 10, 0, 0, Red)
; AxeY = CreateLine3D(#PB_Any, 0,-10,0, Green, 0, 10, 0, Green)
; AxeZ = CreateLine3D(#PB_Any, 0,0,-10, Blue, 0, 0, 10, Blue)

;
; Naissance d'un cube

; Une forme : C'est notre MESH qui ici sera un cube
Mesh = CreateCube(#PB_Any, 6)

; Une texture (Cette texture peut être loader avec l'instruction LoadTexture()
Texture = CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(Texture))
Box(0,0,256,256,RGB(200, 100, 0))
Box(2,2,253,253,RGB(255, 200, 0))
StopDrawing()

; Un MATERIEL c'est la partie visible de notre cube qui sera constitué de notre texture
Material = CreateMaterial(#PB_Any,TextureID(texture))

; Création de notre entité : ENTITE = MESH + MATERIEL
; Par défaut il se positionne au point de coordonnée 0,0,0
Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material))

;
; Une camera
Camera = CreateCamera(#PB_Any,0,0,100,100)
CamX=0
CamY=0
CamZ=15

; La caméra regarde en dirextion d'un point au coordonnées x=0, y=0, z=0
CameraLookAt(camera,0,0,0)


While #True
 
  Event = WindowEvent()
 
  ExamineKeyboard()
 
  ; Touche Escape pour fermer l'application
  If Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
    Break
  EndIf
 
  X=-0.2
  Y=-0.5
  Z=-0.7
 
  RotateEntity(Entity, X, Y, Z, #PB_Relative)
   
  MoveCamera(camera, CamX, CamY, CamZ, #PB_Absolute)
 
  ; Affiche le rendu de la scène
  ClearScreen(RGB(0, 0, 0))
  RenderWorld()
  FlipBuffers()
Wend
End

_________________
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Portable LENOVO ideapad 110-17ACL 64 bits
Version de PB : 5.70LTS - 32 bits


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Histoire d'un Cube : Permis de conduire
MessagePosté: Mer 03/Juil/2013 13:21 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6864
Localisation: IDF (Yvelines)
Il est temps de compliquer un peu la vie de notre cube qui veut maintenant se déplacer.

Cet épisode intègre les tutos précédents auquel s'ajoute la notion de physique

Pour que les collisions soient gérées par le moteur physique, une entité doit avoir un corps. Dans le cas contraire il est en mode fantôme. On peut passer à travers l'entité.

Le moteur physique s'occupera de tous les calculs en fonction des paramètres de masse, frottement (friction) et restitution.

Vous allez voir comment poser des obstacles mobiles ainsi que des obstacles statics.

J'ai aussi introduit une notion d'inertie du joueur quand les touches de déplacement ne sont pas utilisées.

Touche de directions Gauche, Droit, Haut et Bas pour se diriger.
Touche PageHaut et PageBas pour le Jet-Pack
Touche Espace pour le freinage d'urgence.

Le code est largement documenté et n'hésitez pas à placer le curseur sur une des instructions et d'appuyer sur la touche F1.

Enjoy :)
Code:
; Naissance d'un cube : Permis de conduire (Gestion des collisions)

EnableExplicit

InitEngine3D()
InitKeyboard()
InitSprite()

Global Window, Event
Global Camera

Global Texture, Material ;Materiel (Texture) qui servira à toutes les entités
Global Player, PlayerSpeed.d
Global Ground_Mesh, Ground
Global Cube_Mesh, Cube
Global ObstacleMobile, ObstacleStatic

Global N, X.f, Y.f

Window = OpenWindow(#PB_Any,0,0,1024,768,"Cube Follow")
OpenWindowedScreen(WindowID(window),0,0,1024,768)

;
; Activation Physics et Collisions (A mon avis ça ne sert à rien)
EnableWorldPhysics(#True)
EnableWorldCollisions(#True)

;
; Ambience, Lumiére blanche et activation des ombres
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))

;
; Materiel (texture) qui servira pour le sol, le cube les obstacles
Texture = CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(Texture))
Box(0,0,256,256,RGB(0, 0, 0))
Box(1,1,252,252,RGB(255, 216, 0))
StopDrawing()
Material = CreateMaterial(#PB_Any, TextureID(Texture))

;
; Un cube qui servira pour le joueur et les obstacles
Cube_Mesh = CreateCube (#PB_Any, 1)

;
; Creation du sol (Obstacle static)
Ground_Mesh = CreatePlane(#PB_Any, 50, 50, 1, 1, 6, 6)
Ground = CreateEntity(#PB_Any, MeshID(Ground_Mesh), MaterialID(Material))
CreateEntityBody(Ground, #PB_Entity_StaticBody, 0,0,1)

;
; Le joueur
Player = CreateEntity(#PB_Any, MeshID(Cube_Mesh), #PB_Material_None, 0, 2, 0)
;ScaleEntity(Player, 1, 2, 0.5)
CreateEntityBody(Player, #PB_Entity_BoxBody, 1, 1, 0)

;
; Quelques obstacles mobile
Y=0.50

For N=1 To 20
  X+1
  If X=6
    X=1
    Y+1
  EndIf 
 
  ObstacleMobile = CreateEntity(#PB_Any, MeshID(Cube_Mesh), MaterialID(Material), X, Y, 10)
  CreateEntityBody(ObstacleMobile, #PB_Entity_BoxBody, 1, 1, 1)
Next

; Quelques obstacles static (Contour de la platform)
ObstacleStatic = CreateEntity(#PB_Any, MeshID(Cube_Mesh), #PB_Material_None, 0, 0.8, 24.6)
ScaleEntity(ObstacleStatic, 25, 1.5, 0.5)
CreateEntityBody(ObstacleStatic, #PB_Entity_StaticBody)

ObstacleStatic = CreateEntity(#PB_Any, MeshID(Cube_Mesh), #PB_Material_None, 0, 0.8, -24.6)
ScaleEntity(ObstacleStatic, 25, 1.5, 0.5)
CreateEntityBody(ObstacleStatic, #PB_Entity_StaticBody)

ObstacleStatic = CreateEntity(#PB_Any, MeshID(Cube_Mesh), #PB_Material_None, -24.6, 0.8, 0)
ScaleEntity(ObstacleStatic, 25, 1.5, 0.5)
RotateEntity(ObstacleStatic, 0, 90, 0)
CreateEntityBody(ObstacleStatic, #PB_Entity_StaticBody)

ObstacleStatic = CreateEntity(#PB_Any, MeshID(Cube_Mesh), #PB_Material_None, 24.6, 0.8, 0)
ScaleEntity(ObstacleStatic, 25, 1.5, 0.5)
RotateEntity(ObstacleStatic, 0, 90, 0)
CreateEntityBody(ObstacleStatic, #PB_Entity_StaticBody)

;Une platform
ObstacleStatic = CreateEntity(#PB_Any, MeshID(Cube_Mesh), MaterialID(Material), 10, 2.5, -15)
ScaleEntity(ObstacleStatic, 5, 5, 5)
RotateEntity(ObstacleStatic, 0, 90, 0)
CreateEntityBody(ObstacleStatic, #PB_Entity_StaticBody)

Repeat
  Event = WindowEvent()
 
  If ExamineKeyboard()
   
    ;Sortie du jeu
    If KeyboardPushed (#PB_Key_Escape)
     Break
    EndIf
   
    ;Inertie du joueur quand les touches de direction sont inactives
    If PlayerSpeed > 0
      ;Le joueur était en train d'avancer : on le ralenti
      PlayerSpeed - 0.05
    ElseIf PlayerSpeed < 0
      ;Le joueur était en train de reculer : on le ralenti
      PlayerSpeed + 0.05
    Else
      PlayerSpeed = 0
    EndIf
   
    ;En avant ou en arriére
    If KeyboardPushed (#PB_Key_Up)
      PlayerSpeed + 0.1
    ElseIf KeyboardPushed (#PB_Key_Down)
      PlayerSpeed - 0.1
    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
       
    MoveEntity(Player, 0, 0, PlayerSpeed, #PB_Absolute|#PB_Local)
   
    ;CamearaFollow (PB 5.20) permet de suivre l'entité
    CameraFollow(Camera, EntityID(Player), -180, EntityY(Player)+2, 6, 0.05, 0.05, #True)   
   
    ;Jet Pack une impulsion sur l'axe des y (hauteur)
    If KeyboardPushed(#PB_Key_PageUp)
      ApplyEntityImpulse(Player, 0, 5, 0)
    EndIf   
   
    If KeyboardPushed(#PB_Key_PageDown)
      ApplyEntityImpulse(Player, 0, -5, 0)
    EndIf   
   
    ;Freinage d'urgence
    If KeyboardPushed(#PB_Key_Space)
      PlayerSpeed = 0
    EndIf
   
  EndIf
 
  ; Affiche le rendu de la scène
  RenderWorld(40)
  FlipBuffers() 
ForEver


Comme d'habitude, toutes les remarques visant à améliorer ce code (Oui je ne suis pas un expert) sont les bienvenues.

_________________

➽ 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


Dernière édition par falsam le Dim 04/Jan/2015 0:42, édité 11 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Histoire d'un Cube (Initiation à la 3D)
MessagePosté: Mer 03/Juil/2013 13:30 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 09/Oct/2005 16:51
Messages: 8785
Excellent !

_________________
~~~~Règles du forum ~~~~
.: Ar-S :. Tour + portable W10 x64 PB 5.4x / 5.6x
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
RESIZER GOLD : Mon logiciel de redimensionnement par lot 100% PB


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Histoire d'un Cube (Initiation à la 3D)
MessagePosté: Mer 03/Juil/2013 13:46 
Hors ligne

Inscription: Dim 10/Jan/2010 5:29
Messages: 3426
il ne faut pas que tu forces l'entité à aller vers le bas :
Citation:
MoveEntity(Player, 0, -1, PlayerSpeed, #PB_Absolute|#PB_Local)

Car tu est sur le "mur cassable" , ton cube aura tendance a sautiller et détruire le mur , laisse la physique gérer la gravité.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Histoire d'un Cube
MessagePosté: Mer 03/Juil/2013 14:01 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6864
Localisation: IDF (Yvelines)
G-Rom a écrit:
il ne faut pas que tu forces l'entité à aller vers le bas
Tu as raison c'était idiot ce que j'ai fait ! Code corrigé.

_________________

➽ 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


Dernière édition par falsam le Dim 22/Sep/2013 12:15, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Histoire d'un Cube : Ramasser des piéce
MessagePosté: Dim 07/Juil/2013 17:42 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6864
Localisation: IDF (Yvelines)
Le code précédent était une première approche plutôt passive de la gestion des collisions.
Ce nouveau code a pour objectif d'implanter une dynamique des collisions.

L'objectif est de ramasser des pièces.
-Chaque pièce est une entité physique (sans masse ni friction, ni restitution)
-Chaque pièce est stockée dans une liste chainée.
-Avec un cube, vous percuterez chacune des pièces.
Mise en oeuvre de l'instruction EntityCollide(#Entity, #Entity2)
-Quand une pièce est percutée on l'élimine.

Code:
;Naissance d'un cube : Ramasser des pièces (Gestion des collisions)

; Coordonnées x,y,z du Cube Avatar
Define.f X, Y, Z

Structure Obstacle
  Id.i ;Identification entité
EndStructure

NewList Money.Obstacle()

InitEngine3D()
InitKeyboard()
InitSprite()

window = OpenWindow(#PB_Any,0,0,1024,768,"Affichage des coordonnées du cube")
OpenWindowedScreen(WindowID(window),0,0,1024,768)

;
; Une texture qui servira pour le sol, le cube et les piéces
Texture = CreateTexture(#PB_Any, 256, 256)
StartDrawing(TextureOutput(Texture))
Box(0,0,256,256,RGB(0, 0, 0))
Box(2,2,252,252,RGB(255, 216, 0))
StopDrawing()

;
; Le matériel qui servira pour le sol, le cube et les piéces
Material = CreateMaterial(#PB_Any,TextureID(texture))

;
; Le sol
Ground_Mesh = CreatePlane(#PB_Any, 20, 20, 3, 6, 6, 6)
Ground = CreateEntity(#PB_Any, MeshID(Ground_Mesh), MaterialID(Material), 0, 0, 0)
CreateEntityBody(Ground, #PB_Entity_StaticBody, 2, 0, 1)

;
; Le cube avatar
Cube_Mesh = CreateCube(#PB_Any, 1)
Cube_Entity = CreateEntity(#PB_Any, MeshID(Cube_Mesh), MaterialID(Material))
MoveEntity(Cube_Entity, 0, 2, 5)
CreateEntityBody(Cube_Entity, #PB_Entity_BoxBody, 2,0,0)

;
; Les pièces
Money_Mesh = CreateCylinder(#PB_Any, 1, 1)
X=-5
For N=-3 To 3
  X=N*2
 
  AddElement(Money())
  With Money()
    \Id = CreateEntity(#PB_Any, MeshID(Money_Mesh), MaterialID(Material), x,1,0)
    ScaleEntity(\Id, 0.5, 0.2, 0.5)
    RotateEntity(\Id, 0, 0, 90)
    CreateEntityBody(\Id, #PB_Entity_BoxBody, 0, 0, 0)
  EndWith
Next

;
;Lumière et ombre
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -1.8, 10, 5)
WorldShadows(#PB_Shadow_Additive)

;
; Une camera
Camera = CreateCamera(#PB_Any,0,0,100,100)
CameraBackColor(Camera, RGB(131, 204, 249))

While #True
 
  Event = WindowEvent()
   
  If ExamineKeyboard() 
 
    ; Touche Escape pour fermer l'application
    If Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
      Break
    EndIf 
 
    If KeyboardPushed(#PB_Key_Left)
      X=-1 
    ElseIf KeyboardPushed(#PB_Key_Right)
      X=1
    Else
      X=0
    EndIf
 
    If KeyboardPushed(#PB_Key_Up)
      Z=-1 
    ElseIf KeyboardPushed(#PB_Key_Down)
      Z=1
    Else
      Z=0
    EndIf
   
    ;Quel sont les piéces qui sont entrer en collision avec le cube
    ForEach(Money())
      If EntityCollide(Cube_Entity, Money()\Id)
        FreeEntity(Money()\Id) ;Destruction de la piéce
        DeleteElement(Money()) ;Supprime l'élément courant de la liste
      EndIf
    Next
  EndIf
 
  MoveEntity(Cube_Entity, X,0,Z, #PB_Absolute|#PB_Local)
  MoveCamera(Camera, 0, 5 , 15, #PB_Absolute)
  CameraLookAt(camera,EntityX(Cube_Entity),EntityY(Cube_Entity),EntityZ(Cube_Entity))
   
  ; Affiche le rendu de la scène
  RenderWorld(60)
  FlipBuffers()
Wend

_________________

➽ 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


Dernière édition par falsam le Dim 04/Jan/2015 0:42, édité 2 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Histoire d'un Cube (Initiation à la 3D)
MessagePosté: Dim 07/Juil/2013 19:52 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 29/Juil/2004 16:33
Messages: 2802
Localisation: Klyntar
Bravo, exelent tutos :P
Bonne continuation pour la suite 8)





@++

_________________
Windows 10 x64, PureBasic 5.71 Beta 1 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Histoire d'un Cube (Initiation à la 3D)
MessagePosté: Dim 07/Juil/2013 20:04 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6864
Localisation: IDF (Yvelines)
venom a écrit:
Bravo, exelent tutos :P
Merci pour tes encouragements :)

_________________

➽ 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: Histoire d'un Cube : Ajoutons un score
MessagePosté: Dim 07/Juil/2013 20:17 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6864
Localisation: IDF (Yvelines)
Dans notre code précédent nous avons vu comment gérer les collisions en ramassant des pièces. Nous allons maintenant ajouter un score qui correspond au nombre de pièces ramassées.

C'est l'occasion de voir comment intégrer des sprites 2D dans un monde 3D.

- Le calcul du score est fait au moment ou le cube percute une piéce (Ligne 98)
- S'agissant d'un sprite, l'affichage du score ne peut se faire qu'aprés l'instruction RenderWorld().

Touche de directions Gauche, Droit, Haut et Bas pour se diriger.
Code:
;Naissance d'un cube : Ramasser des pièces (Gestion des collisions)

; Coordonnées x,y,z du Cube Avatar
Define.f X, Y, Z

Structure Obstacle
  Id.i ;Identification entité
EndStructure

NewList Money.Obstacle()

InitEngine3D()
InitKeyboard()
InitSprite()

window = OpenWindow(#PB_Any,0,0,1024,768,"Affichage des coordonnées du cube")
OpenWindowedScreen(WindowID(window),0,0,1024,768)

;
; Une texture qui servira pour le sol, le cube et les piéces
Texture = CreateTexture(#PB_Any, 256, 256)
StartDrawing(TextureOutput(Texture))
Box(0,0,256,256,RGB(0, 0, 0))
Box(2,2,252,252,RGB(255, 216, 0))
StopDrawing()

;
; Le materiel qui servira pour le sol, le cube et les piéces
Material = CreateMaterial(#PB_Any,TextureID(texture))

;
; Le sol
Ground_Mesh = CreatePlane(#PB_Any, 20, 20, 3, 6, 6, 6)
Ground = CreateEntity(#PB_Any, MeshID(Ground_Mesh), MaterialID(Material), 0, 0, 0)
CreateEntityBody(Ground, #PB_Entity_StaticBody, 2, 0, 1)

;
; Le cube avatar
Cube_Mesh = CreateCube(#PB_Any, 1)
Cube_Entity = CreateEntity(#PB_Any, MeshID(Cube_Mesh), MaterialID(Material))
MoveEntity(Cube_Entity, 0, 2, 5)
CreateEntityBody(Cube_Entity, #PB_Entity_BoxBody, 2,0,0)

;
; Les pieces
Money_Mesh = CreateCylinder(#PB_Any, 1, 1)
X=-5
For N=-3 To 3
  X=N*2
 
  AddElement(Money())
  With Money()
    \Id = CreateEntity(#PB_Any, MeshID(Money_Mesh), MaterialID(Material), x,1,0)
    ScaleEntity(\Id, 0.5, 0.2, 0.5)
    RotateEntity(\Id, 0, 0, 90)
    CreateEntityBody(\Id, #PB_Entity_BoxBody, 0, 0, 0)
  EndWith
Next

;
;Lumiere et ombre
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -1.8, 10, 5)
WorldShadows(#PB_Shadow_Additive)

;
; Une camera
Camera = CreateCamera(#PB_Any,0,0,100,100)
CameraBackColor(Camera, RGB(131, 204, 249))

While #True
 
  Event = WindowEvent()
   
  If ExamineKeyboard() 
 
    ; Touche Escape pour fermer l'application
    If Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
      Break
    EndIf 
 
    If KeyboardPushed(#PB_Key_Left)
      X=-1 
    ElseIf KeyboardPushed(#PB_Key_Right)
      X=1
    Else
      X=0
    EndIf
 
    If KeyboardPushed(#PB_Key_Up)
      Z=-1 
    ElseIf KeyboardPushed(#PB_Key_Down)
      Z=1
    Else
      Z=0
    EndIf
   
    ;-Quel sont les piéces qui sont entrer en collision avec le cube
    ForEach(Money())
      If EntityCollide(Cube_Entity, Money()\Id)
        Score + 1              ; Ajout d'un point au score
        FreeEntity(Money()\Id) ;Destruction de la piéce
        DeleteElement(Money()) ;Supprime l'élément courant de la liste
      EndIf
    Next
  EndIf
 
  MoveEntity(Cube_Entity, X,0,Z, #PB_Absolute|#PB_Local)
  MoveCamera(Camera, 0, 5 , 15, #PB_Absolute)
  CameraLookAt(camera,EntityX(Cube_Entity),EntityY(Cube_Entity),EntityZ(Cube_Entity))
 

  ; Affiche le rendu de la scène
  RenderWorld(60)
 
  ;-Affichage des scores (Doit etre intégré après l'instruction RenderWorld()
  PanelScore = CreateSprite(#PB_Any,100,20)
  StartDrawing(SpriteOutput(PanelScore))
  Box(0,0,100,20, RGBA(178, 34, 34, 255))
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawText(5,2,"Piéces "+ Str(Score))
  StopDrawing() 
  DisplaySprite(PanelScore, 0, 0)
  FlipBuffers()
Wend

_________________

➽ 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


Dernière édition par falsam le Dim 04/Jan/2015 0:43, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Histoire d'un Cube (Initiation à la 3D)
MessagePosté: Lun 08/Juil/2013 10:00 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 02/Oct/2011 16:17
Messages: 2213
Localisation: 50200 Coutances
Merci Falsam pour tes cours de 3D que je suis avec enthousiasme et soif d'apprendre et je trouve super que tu ais commencé par les bases, ce qui permet d'évoluer en comprenant la syntaxe et le cheminement de la programmation en 3D.

_________________
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce GT 640 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.62, 5.70 LTS
Un homme doit être poli, mais il doit aussi être libre !


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Histoire d'un Cube (Initiation à la 3D)
MessagePosté: Lun 08/Juil/2013 10:37 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 06/Jan/2005 15:45
Messages: 222
merci falsam,je suis également tes tutos sur la 3d,c'est super ce que tu fait :wink:

_________________
Pb5.24 Lts/5.31 Windows 7 64 nvidia 560 ti E8500 8g ram


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Histoire d'un Cube : Un peu de relief
MessagePosté: Lun 08/Juil/2013 16:33 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6864
Localisation: IDF (Yvelines)
Ce code est réduit à son strict minimum. Nous allons voir de quel manière on va :
- Créer un ciel
- Ajouter du soleil
- Ajouter du brouillard
- Ajouter de l'eau
- Ajouter un terrain

Télécharger le fichier compressé suivant.
Mer et Ciel.zip (Source 4.31 Mo)

Le dossier que vous venez de télécharger contient trois sous dossiers
-Terrain Contient des textures de terrains ainsi que des textures en noir et blanc définissant le relief d'un terrain. Plus les points sont proches du blanc et plus on monte en altitude.

-Skybox Un (Une) skybox est une grande boîte texturée à l'intérieur qui permet d'afficher un ciel dans toutes les directions dans lesquelles vous regardez. Le dossier SkyBox contient des fichiers compressés contenant chacun les 6 faces internes d'un cube matérialisant un ciel.

-Water Vous l'avez compris, ce dossier contient les textures qui vont permettre de matérialiser l'eau.

Je poste le code complet et commenté, mais sans les textures il ne fonctionne pas.
Code:
;Histoire d'un cube - Un peu de relief

Define CamX.f, CamY.f

InitEngine3D()
InitSprite()
InitKeyboard()
InitMouse()
 
   
Window = OpenWindow(#PB_Any,0,0,1024,700,"3d",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(Window), 0, 0, 1024, 700, 0, 0,0)

;
;Nous utiliserons l'instruction Add3DArchive() pour ajouter les chemins absolus ou relatifs
;de ces trois dossiers dans la liste actuelle des répertoires disponibles pour les fonctions 3D.
Add3DArchive("Data/Terrain/", #PB_3DArchive_FileSystem)
Add3DArchive("Data/Skybox/Stormy.zip", #PB_3DArchive_Zip)
Add3DArchive("Data/Water", #PB_3DArchive_FileSystem)
   
WorldShadows(#PB_Shadow_TextureAdditive)
 
;
; Camera
Camera = CreateCamera(#PB_Any, 0, 0, 100, 100)
MoveCamera(Camera,  800, 200, 0)
 
;
; Lumiere (Obligatoire pour la création du terrain)
Light = CreateLight(#PB_Any ,RGB(190, 190, 190), 0, 100, 0, #PB_Light_Directional)
     
;
; Eau, Soleil, Brouillard
SkyBox("stormy.jpg")
CreateWater(Camera, 0, 100, 0, 0, #PB_World_WaterLowQuality | #PB_World_WaterCaustics | #PB_World_WaterSmooth | #PB_World_WaterFoam | #PB_World_WaterGodRays)
Sun(10000, 10000, -100000, RGB(238, 173, 148))
Fog(RGBA(253, 245, 230, 155), 100, 1, 2000)
 
;
; Terrain
SetupTerrains(LightID(Light), 3000, #PB_Terrain_NormalMapping)
 

; Initialisation du terrain
Terrain = CreateTerrain(#PB_Any, 512+1, 3000, 200, 1, "Terrain", "Dat")
 
; Ajout des differente textures, construction du terrain et sauvegarde
; Le premier parametre est le numéro de la couche (0 pour la premiere couche)
; le second parametre correspond à la taille que doit occuper la texture sur le terrain
; Corriger 256 par la taille du terrain défini lors de la création : 3000
; Et regarder la taille des fleurs et feuilles .
; Vous pouvez faire d'autres essais de texture en remplaçant grass1.png par grass2.png
AddTerrainTexture(Terrain,  0, 256, "grass1.png",  "grass1.png") ;
 
;Le relief est défini par une image composée de degradés noir et blanc
;Plus les points sont proche du blanc, plus nous montons en hauteur
;Vous pouvez faire d'autres essais de relief avec le fichier heightmap513.png par exemple
DefineTerrainTile(Terrain, 0, 0,  "heightmap514.jpg", 0, 0)
 
;Construction du terrain (ça peut prendre du temps)
BuildTerrain(Terrain)
 
;Sauvegarde du terrain (#False = Non mais en fait ça fonctionne quand meme)
SaveTerrain(Terrain, #False)
 
Repeat
   
  If ExamineMouse()
    CamY = -MouseDeltaX()/10
    CamX = -MouseDeltaY()/10 

  EndIf
   
  RotateCamera(Camera, CamX, CamY, 0, #PB_Relative)
   
  If ExamineKeyboard()      
    If KeyboardPushed(#PB_Key_Escape)
      End
    EndIf 
  EndIf
   
  RenderWorld()
  FlipBuffers()

ForEver
Attention si vous changez les paramètres de construction du terrain ou bien les textures, vous devez supprimer le fichier Terrain_00000000.Dat du dossier Terrain.

_________________

➽ 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


Dernière édition par falsam le Jeu 27/Mar/2014 9:14, édité 2 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Histoire d'un Cube - Les nodes
MessagePosté: Mar 09/Juil/2013 14:22 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6864
Localisation: IDF (Yvelines)
Les nodes (noeuds) sont des conteneurs qui peuvent être utilisés pour grouper des objets comme par exemple des entités.
Une fois qu'une entité est attaché à un node, sa position et ses mouvements sont relatifs à la position du node.

L'objectif est de :
-Créer un node sur lequel on attachera 5 cubes : 1 Cube central et les autres sur chaque points cardinaux.
-Exercer une rotation du node sur l'axe Y, chaque cube étant eux aussi en rotation.
-Déplacer le node avec les fléches de direction du clavier.
Code:
;Histoire d'un cube : Les nodes

Define.f X,Z

InitEngine3D()
InitKeyboard()
InitSprite()

window = OpenWindow(#PB_Any,0,0,1024,768,"Les nodes")
OpenWindowedScreen(WindowID(window),0,0,1024,768)

; Mesh
Cube_Mesh = CreateCube(#PB_Any, 1)
Ground_Mesh = CreatePlane(#PB_Any, 20, 20, 3, 6, 6, 6)

; Materiel
Texture1 = CreateTexture(#PB_Any,512,512)
StartDrawing(TextureOutput(Texture1))
Box(0,0,512,512,RGB(0, 0, 0))
Box(1,1,510,510,RGB(255, 216, 0))
StopDrawing()
Material1 = CreateMaterial(#PB_Any,TextureID(texture1))

; Création du sol
Ground_Entity = CreateEntity(#PB_Any, MeshID(Ground_Mesh), MaterialID(Material1), 0, 0, 0)
CreateEntityBody(Ground_Entity, #PB_Entity_StaticBody, 2, 0, 1)

;
; Lumiere et ombre
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -1.8, 10, 5)
WorldShadows(#PB_Shadow_Additive)

;
; Création d'un node sur lequel seront attaché les entités.
; Le cube 0 sera au meme emplacement que le node.
Node = CreateNode(#PB_Any, 0, 0, 0)

Cube0 = CreateEntity(#PB_Any, MeshID(Cube_Mesh), MaterialID(Material1), 0, 2, 0)
AttachNodeObject(Node, EntityID(Cube0))

Cube1 = CreateEntity(#PB_Any, MeshID(Cube_Mesh), MaterialID(Material1), 2, 2, 0)
AttachNodeObject(Node, EntityID(Cube1))

Cube2 = CreateEntity(#PB_Any, MeshID(Cube_Mesh), MaterialID(Material1), -2, 2, 0)
AttachNodeObject(Node, EntityID(Cube2))

Cube3 = CreateEntity(#PB_Any, MeshID(Cube_Mesh), MaterialID(Material1), 0, 2, 2)
AttachNodeObject(Node, EntityID(Cube3))

Cube4 = CreateEntity(#PB_Any, MeshID(Cube_Mesh), MaterialID(Material1), 0, 2, -2)
AttachNodeObject(Node, EntityID(Cube4))


;
; Une camera
Camera = CreateCamera(#PB_Any,0,0,100,100)

While #True
 
  Event = WindowEvent()
   
  If ExamineKeyboard()   
    If Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
      Break
    EndIf     
   
    If KeyboardPushed(#PB_Key_Left)
      X-0.1
    ElseIf KeyboardPushed(#PB_Key_Right)
      X+0.1
    EndIf
   
    If KeyboardPushed(#PB_Key_Up)
      Z-0.1
    ElseIf KeyboardPushed(#PB_Key_Down)
      Z+0.1
    EndIf
     
  EndIf
 
  ; Rotation du node et non plus de l'entité
  RotateNode(Node, 0, 1, 0, #PB_Relative) 
   
  ; Rotation de chacun des cubes
  ; Les deux premiers cubes étaient placés sur l'axe X
  ; Les deux suivant sur l'axe Z
  RotateEntity(cube1, -0.5, 0, 0, #PB_Relative)
  RotateEntity(cube2, 0.5, 0, 0, #PB_Relative)
 
  RotateEntity(cube3, 0, 0, -0.5, #PB_Relative)
  RotateEntity(cube4, 0, 0, 0.5, #PB_Relative)
 
  MoveCamera(Camera, 4, 4 , 15, #PB_Absolute)
  CameraLookAt(camera,0,0,0)
 
  MoveNode(Node, x, 0, z, #PB_Absolute)
   
  ; Affiche le rendu de la scène
  ClearScreen(RGB(0, 0, 0))
  RenderWorld()
  FlipBuffers()
Wend

_________________

➽ 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: Histoire d'un Cube : Texte 3D
MessagePosté: Sam 13/Juil/2013 0:35 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6864
Localisation: IDF (Yvelines)
Avec ce nouvel épisode de la vie de notre cube, nous allons voir comment créer un texte qui sera attaché à une entité.

La bibliothèque Text3D est destinée à faciliter l'affichage du texte dans le monde de la 3D.

Attention : La création d'un texte 3D ne fonctionne pas si vous n'indiquez pas le chemin d'installation de polices de caractères qui seront utilisés lors de la création du texte.

Vous devez copier le dossier fonts se trouvant dans les exemples 3D dans un dossier que vous nommerez par exemple Data qui se trouvera dans le dossier ou se trouve votre code devant afficher votre texte 3D.

Ajoutez
Code:
Add3DArchive("Data/fonts", #PB_3DArchive_FileSystem)
dans votre code.

Un exemple de code. Notre cube vous donnera l'heure. Utilisez les flèches de direction du clavier pour diriger le cube.
Code:
;Histoire d'un cube : Texte 3D

Define.f X,Z

InitEngine3D()
InitKeyboard()
InitSprite()

Add3DArchive("Data/fonts", #PB_3DArchive_FileSystem)
Parse3DScripts()

window = OpenWindow(#PB_Any,0,0,1024,768,"Texte 3D")
OpenWindowedScreen(WindowID(window),0,0,1024,768)

; Mesh
Cube_Mesh = CreateCube(#PB_Any, 1)
Ground_Mesh = CreatePlane(#PB_Any, 20, 20, 3, 6, 6, 6)

; Materiel
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))

; Création du sol
Ground = CreateEntity(#PB_Any, MeshID(Ground_Mesh), MaterialID(Material), 0, 0, 0)
EntityPhysicBody(Ground, #PB_Entity_StaticBody, 2, 0, 1)

;
; Un cube
Cube = CreateEntity(#PB_Any, MeshID(Cube_Mesh), MaterialID(Material), 0, 2, 0)

Text = CreateText3D(#PB_Any, "")
Text3DColor(Text, RGBA(255, 0, 0, 255))
ScaleText3D(Text, 0.4,0.4,0.4,#PB_Absolute)
Text3DAlignment(Text, #PB_Text3D_HorizontallyCentered)

AttachEntityObject(Cube, "", Text3DID(Text))
MoveText3D(Text, 0.2, 1, 0)

;
;Lumiere et ombre
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -1.8, 10, 5)
WorldShadows(#PB_Shadow_Additive)

;
; Une camera
Camera = CreateCamera(#PB_Any,0,0,100,100)

While #True
 
  Event = WindowEvent()
   
  If ExamineKeyboard()   
    If Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
      Break
    EndIf 
   
    If KeyboardPushed(#PB_Key_Left)
      X-0.1
    ElseIf KeyboardPushed(#PB_Key_Right)
      X+0.1
    EndIf
   
    If KeyboardPushed(#PB_Key_Up)
      Z-0.1
    ElseIf KeyboardPushed(#PB_Key_Down)
      Z+0.1
    EndIf
   
  EndIf
 
  MoveEntity(Cube, X, 2, Z, #PB_Absolute)
 
  Text3DCaption(Text, FormatDate("%hh:%ii:%ss", Date()))
 
  MoveCamera(Camera, 4, 4 , 15, #PB_Absolute)
 
  CameraLookAt(camera,0,0,0)
 
  ; Affiche le rendu de la scène
  ClearScreen(RGB(0, 0, 0))
  RenderWorld()
  FlipBuffers()
Wend

_________________

➽ 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


Dernière édition par falsam le Mar 22/Oct/2013 14:58, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 67 messages ]  Aller à la page Précédente  1, 2, 3, 4, 5  Suivante

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