Outils pour utilisateurs

Outils du site


dindomoteur_portail_du_moteur_de_metroidvania_orleanais

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
dindomoteur_portail_du_moteur_de_metroidvania_orleanais [2022/03/20 15:57] Simon Deplatdindomoteur_portail_du_moteur_de_metroidvania_orleanais [2022/03/27 13:42] (Version actuelle) Simon Deplat
Ligne 92: Ligne 92:
 Le moteur étant particulièrement chauvin, je commence par **utiliser l'interface d'association des entrées utilisateurs ( //Projet > Paramètres du projet... > Contrôles// ) pour associer les touches du clavier aux mots-clefs suivants** : Le moteur étant particulièrement chauvin, je commence par **utiliser l'interface d'association des entrées utilisateurs ( //Projet > Paramètres du projet... > Contrôles// ) pour associer les touches du clavier aux mots-clefs suivants** :
  
-  * q : "gauche" +  * "gauche" 
-  * d : "droite" +    * q 
-  * s : "bas" +    * Left Stick Left 
-  * z : "haut" +  * "droite" 
-  * espace "espace"+    * d 
 +    * Left Stick Right 
 +  * "bas" 
 +    * s 
 +    * Left Stick Down 
 +  * "haut" 
 +    * z 
 +    * Left Stick Up 
 +  * "espace" 
 +    * espace 
 +    * Xbox A 
 +  * "interagir" 
 +    * E 
 +    * Xbox X
  
 Même s'il est **conseillé d'associer des mot-clefs par action plutôt que par touche**, les différentes utilisations de la touche //espace// possibles m'amènent à garder une balise généraliste pour ce cas particulier. Même s'il est **conseillé d'associer des mot-clefs par action plutôt que par touche**, les différentes utilisations de la touche //espace// possibles m'amènent à garder une balise généraliste pour ce cas particulier.
Ligne 132: Ligne 145:
   * si la ressource externe est chargée également, celle-ci a la priorité sur les méthodes décrite ci-dessus.   * si la ressource externe est chargée également, celle-ci a la priorité sur les méthodes décrite ci-dessus.
  
-Pour mettre en place le nœud global, je créé un script global.gd situé dans le répertoire //src/Main/// puis utilise le menu //Projet > Paramètres du projet... > AutoLoad// pour lui assigner le nom //Global//.+Pour mettre en place le nœud global, je créé une nouvelle scène de type //Node// nommée //Global.tscn// et lui assigne un script //global.gd//, enregistrés dans le répertoire //src/Main/// . Puis j'utilise le menu //Projet > Paramètres du projet... > AutoLoad// pour assigner le nom //Global// à la scène.
  
 **Le mot //Global// permet maintenant d'y accéder depuis n'importe quelle scène** ( exemple : //print( Global.attribut )// ). **Le mot //Global// permet maintenant d'y accéder depuis n'importe quelle scène** ( exemple : //print( Global.attribut )// ).
 +
 +Cette scène permettra notamment de **mettre en place un //Affichage Tête Haute// (//ATH//)** à l'aide d'un noeud //CanvasLayer// .
 +
 +Pour éviter de rendre les nœuds qui utilisent cette scène dépendants de celle-ci, on pourra **vérifier au préalable qu'elle est bien chargée avant d'y accéder**, par exemple pour le //Joueur// qui accède à une variable de gravité stockée dans //global.gd// :
 +
 +<code>
 +_gravite = 50
 +
 +[...]
 +
 +func _ready():
 + if get_tree().root.has_node("Global"):
 + _gravite = Global.gravite
 +</code>
 +
 +Ci-dessus, vous pouvez voir qu'il y a déjà une valeur assignée par défaut à //_gravite// : il est important d'avoir des valeurs de sécurité pour ne pas casser le nœud si la dépendance est manquante. Cette méthodologie favorise [[https://fr.wikipedia.org/wiki/Couplage_(informatique)|le couplage faible]].
  
 ===Ajout du paramètre de gravité=== ===Ajout du paramètre de gravité===
  
-Au lieu d'utiliser l'API de Godot, nous centralisons la gravité via le noeud //Global// :+Au lieu d'utiliser l'API de Godot, nous centralisons la gravité via le nœud //Global// :
 <code> <code>
 ... ...
-var gravite = 100+var gravite = 50
 ... ...
 func _ready(): func _ready():
Ligne 150: Ligne 179:
  
  
-===Script actuel du nœud global ( global.gd )===+====Script actuel du nœud global ( global.gd )===
 <code> <code>
 extends Node extends Node
  
-var gravite = 100+var typeEntree = "clavier" 
 +var zoneMorte = 0.3 
 + 
 +var gravite = 50
  
 func _ready(): func _ready():
  ProjectSettings.set_setting( "physics/2d/default_gravity", gravite )  ProjectSettings.set_setting( "physics/2d/default_gravity", gravite )
 +
 </code> </code>
  
Ligne 178: Ligne 212:
  
 =====Sous-articles du moteur===== =====Sous-articles du moteur=====
-Cette section présente les différents sous-articles du projet, qui documentent indépendamment les différents sous-modules du moteur : +Cette section présente les sous-articles du projet, qui documentent indépendamment les différents sous-modules du moteur :
- +
-**[EN CONSTRUCTION & NETTOYAGE]** +
- +
-=====Mouvements latéraux===== +
-Après cela, **nous pouvons déplacer le personnage latéralement** grâce au clavier : +
- +
-//Personnage.gd// +
-<code> +
-class_name Personnage +
-extends KinematicBody2D +
- +
-var direction = Vector2.ZERO +
- +
-export var masse = 60 +
-export var vitesse = 300 +
- +
-onready var gravite = ProjectSettings.get( "physics/2d/default_gravity"+
- +
-const NORMAL_SOL = Vector2.UP +
- +
-var _velocite = Vector2.ZERO +
- +
-# la fonction _physics_process héritée est appelée +
-# après la fonction _physics_process parente +
-func _physics_process( delta ): +
- _velocite.y += gravite * masse * delta +
-</code> +
- +
-//Joueur.gd// +
-<code> +
-class_name Joueur +
-extends Personnage +
- +
-# Distance d'accrochage aux formes de collisions : +
-const DETECTION_DISTANCE_SOL = 20.0 +
- +
-func _physics_process( _delta ): +
- var accrocheVectorielle = Vector2.DOWN * DETECTION_DISTANCE_SOL +
-  +
- bouge() +
-  +
- _velocite.x = direction.x * vitesse +
-  +
- _velocite = move_and_slide_with_snap( +
- _velocite, +
- accrocheVectorielle, # Accroche au sol +
- NORMAL_SOL, # Direction du sol ( Vector2.UP ) +
- true, # Ne glisse pas sur le sol en cas d'inactivité ? +
- 4, # Nombre de collisions traitées par cycle +
- 0.9, # Angle maximum du sol ( en radians ) +
- false # Inertie infinie ? +
-+
- +
-func bouge(): +
- if Input.is_action_just_pressed("gauche"): +
- direction.x = -1 +
- elif Input.is_action_just_pressed("droite"): +
- direction.x = 1 +
-  +
- if Input.is_action_just_released("gauche"): +
- if not Input.is_action_pressed("droite"): +
- direction.x = 0 +
- else: +
- direction.x = 1 +
-  +
- if Input.is_action_just_released("droite"): +
- if not Input.is_action_pressed("gauche"): +
- direction.x = 0 +
- else: +
- direction.x = -1 +
-</code> +
- +
-**Il n'y a pas d'inertie pour l'instant**, le personnage commence à se mouvoir à sa vitesse maximale et s'arrête d'un coup. +
- +
-=====Système de saut===== +
-On peut maintenant **le faire sauter** de plate-forme en plate-forme grâce à la touche //espace// : +
- +
-//Personnage.gd// +
-<code> +
-class_name Personnage +
-extends KinematicBody2D +
- +
-var direction = Vector2.ZERO +
- +
-export var masse = 350 +
-export var vitesse = 300 +
-export var forceSaut = 200 +
- +
-var forceSautActuelle = 0 +
- +
-onready var gravite = ProjectSettings.get( "physics/2d/default_gravity"+
- +
-const NORMAL_SOL = Vector2.UP +
- +
-var _velocite = Vector2.ZERO +
- +
-# la fonction _physics_process héritée est appelée +
-# après la fonction _physics_process parente +
-func _physics_process( delta ): +
- _velocite.y += gravite * masse * delta +
-</code> +
- +
-//Joueur.gd// +
-<code> +
-class_name Joueur +
-extends Personnage +
- +
-# Distance d'accrochage aux formes de collisions : +
-const DETECTION_DISTANCE_SOL = 20.0 +
- +
-onready var detectionSol = $detectionSol +
- +
-func _ready(): +
- pass +
- +
-func _physics_process( _delta ): +
- var accrocheVectorielle = Vector2.DOWN * DETECTION_DISTANCE_SOL +
- var surLeSol = detectionSol.is_colliding() +
-  +
- bouge() +
-  +
- if surLeSol: +
- if Input.is_action_just_pressed("espace"): +
- forceSautActuelle = forceSaut +
-  +
- _velocite.y -= forceSautActuelle +
- if forceSautActuelle > 0: +
- forceSautActuelle = forceSautActuelle - gravite +
- if forceSautActuelle < 0: +
- forceSautActuelle = 0 +
-  +
- _velocite.x = direction.x * vitesse +
-  +
- _velocite = move_and_slide_with_snap( +
- _velocite, +
- Vector2.ZERO, # Accroche au sol +
- NORMAL_SOL, # Direction du sol ( Vector2.UP ) +
- true, # Ne glisse pas sur le sol en cas d'inactivité ? +
- 4, # Nombre de collisions traitées par cycle +
- 0.9, # Angle maximum du sol ( en radians ) +
- false # Inertie infinie ? +
-+
- +
-func bouge(): +
- if Input.is_action_just_pressed("gauche"): +
- direction.x = -1 +
- elif Input.is_action_just_pressed("droite"): +
- direction.x = 1 +
-  +
- if Input.is_action_just_released("gauche"): +
- if not Input.is_action_pressed("droite"): +
- direction.x = 0 +
- else: +
- direction.x = 1 +
-  +
- if Input.is_action_just_released("droite"): +
- if not Input.is_action_pressed("gauche"): +
- direction.x = 0 +
- else: +
- direction.x = -1 +
-</code>+
  
-Avec cette version, il est possible de modifier sa direction pendant le saut, ce qui n'est pas réaliste mais plutôt agréable à jouer ! Pour changer le dynamisme des sauts, il faut modifier intelligemment la masse du Joueur et sa force de saut.+[[https://ressources.labomedia.org/dindomoteur_creation_du_joueur|Création du Joueur]] : explication de l'implémentation du personnage principal.
  
 {{tag>godot dindomoteur jeu vidéo}} {{tag>godot dindomoteur jeu vidéo}}
dindomoteur_portail_du_moteur_de_metroidvania_orleanais.1647791849.txt.gz · Dernière modification : 2022/03/20 15:57 de Simon Deplat