top of page

TUTO -02c : Ebauche d'un jeu de plateforme (Partie 3).

Ce tutoriel permet d'aborder un peu plus les fonctionnalités des nœuds KinematicBody, StaticBody et Area2D; mais aussi de paramétrer la gestion des collisions de chacun d'entre eux. 

imprim_2ca.jpg

1°- Les collisions d'objets 2D

Godot propose 2 notions dans les systèmes de collision. La notion de zone (area) et la notion de corps (body):

-Area peut être considérer comme une zone fantôme (qui peut être traversée).

-Body peut être considérer comme une zone matérielle (qui ne peut pas être traversée).

​

Il vous faudra par la suite délimiter vos types de collisions par une surface et/ou une ligne:

-CollisionPolygon2D

-CollisionShape2D

imprim_2cb.jpg

2°- Créer son personnage - KinematicBody

Le nœud KinematicBody possède un ensemble de fonctions facilitant le déplacement et les interactions de vos personnages, vos ennemis et vos ''objets mobiles''. Pour notre exemple, nous allons compléter ce nœud avec les nœuds Sprite (pour l'image) et CollisionShape2D (pour gérer les collisions).

KinematicBody nous permet d'accéder à certaines fonctions (méthodes):

-Move_and_collide()

-Move_and_slide()

-Move_and_slide_and snap()

imprim_2bd.jpg

3°- Comprendre la méthode 'Move and Slide()'

Cette "méthode" prend en charge le déplacement et certaines interactions de vos objets, personnages, etc... Si ces derniers entrent en collision, ils contourneront ou glisseront le long de l'obstacle (l'obstacle doit être de type "body" pour que cela soit actif). Pour notre jeu de plateforme, les paramètres "linear_velocity" et "up_direction" seront utilisés.

​

Move_and_slide () doit être intégré dans la boucle "func _physics_process(delta):" de votre script.

​

move_and_slide ()

-linear_velocity: Vecteurs x,y,z de déplacement de l'entité.

-up_direction: Définir le point haut (permet d'utiliser les fonctions is_on_floor, is_on_wall et is_on_ceiling).

-stop_on_slope: L'entité arrête de se déplacer s'il y a une pente.

-max_slides: le glissement s'arrête jusqu'à une certaine valeur.

-floor_max_angle: Considérer comme "le sol" jusqu'à un certain angle.

-infinite_inertia: Interaction avec une entité de type RigidBody.

4°- Les collisions avec KinematicBody

Le nœud KinematicBody détecte les objets de type "Body", mais pas "Area". Il vous sera donc possible de récupérer des informations sur cette première. Pour notre exemple, nous allons lister nos collisions sous la forme d'une itération par la boucle "for" .

​

Le script:

​

for QuiJeCogne in get_slide_count():
       var collision = get_slide_collision(QuiJeCogne)
       print('Je cogne : ' + collision.collider.name)
       if collision.collider.name == "Caisse3_Body":
           print ('Aie, je perds de l energie')

​

imprim_2cd.jpg

5°- Créer un obstacle - StaticBody2D

Le nœud StaticBody va être utilisé principalement pour créer des objets immobiles (mur, plateforme, obstacle simple). 

​

Le nœud CollisionShape2D permettra de définir les contours de collisions.

Dans l'onglet "Inspecteur", sélectionner votre forme de collision dans"Shape" (pour notre cas, un rectangle).

​

Pour notre exemple, nous utilisons une caisse, un tapis roulant et un trampoline. Pour chaque objet, nous avons pu lui conférer des particularités physiques. Pour cela, nous avons modifié dans l'onglet "Inspecteur" les valeurs "Constant Linear Vel".

imprim_2aj.jpg
imprim_2al.jpg
imprim_2ak.jpg
imprim_2cc.jpg

6°- Le script

​

  1. extends KinematicBody2D

  2.  

  3. var au_sol = true

  4. const UP = Vector2(0,-1)                

  5. export var GRAVITY = 20                  

  6. export var MAXFALLSPEED = 400

  7. export var MAXSPEED = 200

  8. export var JUMPFORCE = 350               

  9. var jump_count = 0

  10. export var ACCEL = 200

  11. var mouvement = Vector2()

  12.  

  13.  

  14. func _ready():

  15.    pass

  16. ​

  17. ​

  18. func _physics_process(delta):

  19.  

  20.    

  21.    mouvement.y += GRAVITY

  22.    if mouvement.y > MAXFALLSPEED:

  23.        mouvement.y = MAXFALLSPEED

  24.  

  25.    

  26.    mouvement.x = clamp(mouvement.x,-MAXSPEED,MAXSPEED)

  27.  

  28.     if Input.is_action_pressed("ui_right"):

  29.        mouvement.x += ACCEL

  30.    elif Input.is_action_pressed("ui_left"):

  31.        mouvement.x += -ACCEL

  32.    else:

  33.        mouvement.x = lerp(mouvement.x,0,0.2)    

  34.  

  35.    

  36.    if Input.is_action_just_pressed("ui_up"):

  37.        if jump_count < 1:                       

  38.            jump_count += 1

  39.            mouvement.y = -JUMPFORCE

  40.            au_sol = false

  41.  

  42.    

  43.    if is_on_floor(): 

  44.        au_sol = true

  45.        jump_count = 0

  46.    else:

  47.        au_sol = false

  48.  

  49.    

  50. ​

  51.    mouvement = move_and_slide(mouvement, UP) 

  52.  

  53.    

  54.    for QuiJeCogne in get_slide_count():

  55.        var collision = get_slide_collision(QuiJeCogne)

  56.        print('Je cogne : ' + collision.collider.name)

  57.        if collision.collider.name == "Caisse3_Body":

  58.            print ('Aie, je perds de l energie')

  59.  

  60.  

  61. func Mon_body_touche_un_ITEM(body):

  62.    print ('Je gagne de l energie')

  63.    get_parent().get_node("Area2D").queue_free() 

Nous contacter

 Tél : 06 17 95 56 83

ionocraft@hotmail.fr

Visible sur :

  • Linkedin
  • Icône social Instagram

Donations :

ICARE © 2024 par ICARE

bottom of page