Page 2 sur 5

Re: Histoire d'un Cube

Publié : mar. 02/juil./2013 13:11
par falsam
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 : Tout sélectionner

;Naissance d'un cube

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

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

Re: Histoire d'un Cube (Initiation à la 3D)

Publié : mar. 02/juil./2013 13:18
par SPH
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 : Tout sélectionner

;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

Histoire d'un Cube : Permis de conduire

Publié : mer. 03/juil./2013 13:21
par falsam
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 : Tout sélectionner

; 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.

Re: Histoire d'un Cube (Initiation à la 3D)

Publié : mer. 03/juil./2013 13:30
par Ar-S
Excellent !

Re: Histoire d'un Cube (Initiation à la 3D)

Publié : mer. 03/juil./2013 13:46
par G-Rom
il ne faut pas que tu forces l'entité à aller vers le bas :
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é.

Re: Histoire d'un Cube

Publié : mer. 03/juil./2013 14:01
par falsam
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é.

Histoire d'un Cube : Ramasser des piéce

Publié : dim. 07/juil./2013 17:42
par falsam
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 : Tout sélectionner

;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

Re: Histoire d'un Cube (Initiation à la 3D)

Publié : dim. 07/juil./2013 19:52
par venom
Bravo, exelent tutos :P
Bonne continuation pour la suite 8)





@++

Re: Histoire d'un Cube (Initiation à la 3D)

Publié : dim. 07/juil./2013 20:04
par falsam
venom a écrit :Bravo, exelent tutos :P
Merci pour tes encouragements :)

Histoire d'un Cube : Ajoutons un score

Publié : dim. 07/juil./2013 20:17
par falsam
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 : Tout sélectionner

;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

Re: Histoire d'un Cube (Initiation à la 3D)

Publié : lun. 08/juil./2013 10:00
par Micoute
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.

Re: Histoire d'un Cube (Initiation à la 3D)

Publié : lun. 08/juil./2013 10:37
par raven
merci falsam,je suis également tes tutos sur la 3d,c'est super ce que tu fait :wink:

Histoire d'un Cube : Un peu de relief

Publié : lun. 08/juil./2013 16:33
par falsam
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 : Tout sélectionner

;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.

Histoire d'un Cube - Les nodes

Publié : mar. 09/juil./2013 14:22
par falsam
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 : Tout sélectionner

;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

Re: Histoire d'un Cube : Texte 3D

Publié : sam. 13/juil./2013 0:35
par falsam
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 : Tout sélectionner

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 : Tout sélectionner

;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