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 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.
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
) sont les bienvenues.