dindomoteur_mise_en_place_un_moteur_de_jeu_video
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
dindomoteur_mise_en_place_un_moteur_de_jeu_video [2022/03/13 18:42] – Simon Deplat | dindomoteur_mise_en_place_un_moteur_de_jeu_video [2022/03/20 11:11] (Version actuelle) – supprimée Simon Deplat | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====== DindoMoteur : Mise en place d'un moteur de jeu vidéo ====== | ||
- | =====Contexte===== | ||
- | Cela fait maintenant 5 ans que j' | ||
- | |||
- | Celui-ci a accompagné ma découverte du développement informatique, | ||
- | |||
- | Au cours de mes recherches, j'ai fini par me rendre compte que **la plupart des jeux vidéos ayant eu un impact culturel ne s' | ||
- | |||
- | **Si ce sujet vous intéresse, vous devriez essayer de coder un petit jeu vidéo via la librairie python [[https:// | ||
- | |||
- | Ces moteurs généralistes, | ||
- | |||
- | Par exemple, **le jeu [[https:// | ||
- | |||
- | Or, ce qui fait le charme de nombreux jeux, c'est le caractère unique du // | ||
- | |||
- | À titre d' | ||
- | |||
- | En réalité, ces exemples sont des exemples assez avancés qui mettent facilement en valeur la nécessité de respécialiser un jeu par rapport à un concept généraliste. **L' | ||
- | |||
- | =====Objectif===== | ||
- | **Mon objectif est de construire, de manière incrémentale, | ||
- | |||
- | En prenant soin de documenter le projet, **le but est de pouvoir disposer d'un moteur intégrant déjà les paramètres classiques, modifiables aisément** (si possible via des interfaces graphiques). Une fois ce sous-moteur généraliste en place, le but est de **pouvoir facilement re-spécialiser le // | ||
- | |||
- | Une fois le moteur en place, il devient possible de **le mettre à disposition de // | ||
- | |||
- | |||
- | =====Godot : kézako ?===== | ||
- | **Godot est donc un moteur de jeu vidéo libre.** | ||
- | |||
- | Il intègre à la fois **une interface graphique de programmation et un langage nommé // | ||
- | |||
- | **Le langage manipulé est orienté objet**, et c'est ce qui fait la force de Godot : il intègre de nombreuses classes communément utilisées dans la programmation : // | ||
- | |||
- | Dans la philosophie du moteur, **une //scène// correspond en général à un objet (au sens humain) particulier**. Un exemple typique est l' | ||
- | |||
- | **Concernant la gestion des coordonnées, | ||
- | |||
- | **Les objets étant organisés selon un système d' | ||
- | |||
- | Pour plus d' | ||
- | |||
- | |||
- | =====Base de travail===== | ||
- | **Godot intègre une librairie de ressources (//Asset Library//) qui permet de voir comment utiliser le moteur de manière efficiente à l'aide de projets didactiques.** | ||
- | |||
- | Dans notre cas, c'est le //2D Platformer Demo (KinematicBody)// | ||
- | |||
- | **Celui-ci intègre déjà les fonctionnalités de base d'un // | ||
- | |||
- | Nous allons donc commencer par décortiquer cet exemple et en reconstruire les fonctionnalités principales dans un nouveau projet. | ||
- | |||
- | Mais avant ça... | ||
- | |||
- | =====Organisation du répertoire===== | ||
- | Dans sa documentation, | ||
- | |||
- | Un des problèmes inhérents à l' | ||
- | |||
- | Également, il devient difficile de se retrouver dans l' | ||
- | |||
- | Dans le cas du // | ||
- | |||
- | Comme évoqué précédemment, | ||
- | |||
- | **Nous garderons le même principe d' | ||
- | |||
- | =====Mise en place des systèmes globaux===== | ||
- | Avant même de créer la première scène, il s'agit de **mettre en place certains mécanismes généraux** pour le moteur de jeu. Cela concerne : | ||
- | * Le **nom des entrées utilisateurs et les boutons qui y sont associés**. | ||
- | * La **résolution de base** ( 1920 x 1080 ) et **le système de mise à l' | ||
- | * La **création d'un script global** pour centraliser un certain nombre de paramètres de jeu (en faisant attention au risque d' | ||
- | |||
- | =====Mise en place des entrées utilisateurs===== | ||
- | Le moteur étant particulièrement chauvin, je commence par **utiliser l' | ||
- | |||
- | * q : " | ||
- | * d : " | ||
- | * s : " | ||
- | * z : " | ||
- | * espace : " | ||
- | |||
- | Même s'il est **conseillé d' | ||
- | |||
- | {{ :: | ||
- | |||
- | =====Paramétrage de la fenêtre===== | ||
- | J' | ||
- | |||
- | **De manière générale, les jeux sont maintenant affichés en plein écran avec une résolution de 1920 par 1080 pixels.** Dans notre cas nous voulons néanmoins rester sur un affichage fenêtré afin de faciliter le développement (même si cela peut permettre de ne pas oublier d' | ||
- | |||
- | Pour **les questions de redimensionnement**, | ||
- | * Mode : 2d | ||
- | * Aspect : keep | ||
- | |||
- | Il faudra peut-être revoir ultérieurement ces réglages. | ||
- | |||
- | =====Création de la scène Main===== | ||
- | Afin de pouvoir tester les réglages graphiques, **il est nécessaire d' | ||
- | |||
- | Je créé donc une scène // | ||
- | |||
- | Afin de rester polyvalent, cette scène sera de type //Node//, qui est la //classe// maîtresse dans //Godot//. | ||
- | |||
- | =====Mise en place d'un nœud global===== | ||
- | Je vais maintenant **utiliser le système d'// | ||
- | |||
- | Il est possible dans //Godot// d' | ||
- | |||
- | **Ce nœud global sera chargé automatiquement à chaque lancement du programme** ce qui lui permettra de centraliser l' | ||
- | |||
- | Pour autant, **il serait préférable que chaque scène soit dotée d'un mécanisme tel que :** | ||
- | * si la scène est lancée seule, un mécanisme est mis-en-place pour bloquer les méthodes nécessitant l' | ||
- | * si le nœud global est activé, l' | ||
- | * 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 // | ||
- | |||
- | **Le mot //Global// permet maintenant d'y accéder depuis n' | ||
- | |||
- | |||
- | =====Création d'un joueur et d'une plate-forme===== | ||
- | Je souhaite dans un premier temps **avoir un simple joueur contrôlable ainsi qu'une plate-forme sur lequel celui-ci puisse se mouvoir**. | ||
- | |||
- | Dans un premier temps, **je créé deux répertoire dans //src/// : //Joueur/// et //Niveau/// **. | ||
- | |||
- | Je remarque que dans // | ||
- | |||
- | Pour l' | ||
- | |||
- | À ce stade, **il est important de choisir une unité de référence** pour plus tard : nous serons amenés à utiliser des // | ||
- | |||
- | Dans notre cas, **la plate-forme de test fera 512 x 64 pixels**. | ||
- | |||
- | Pour l' | ||
- | |||
- | Voici les deux //sprites// utilisés pour l' | ||
- | {{ : | ||
- | {{ : | ||
- | |||
- | Une fois les //sprites// réalisés, **je crée donc les scènes associées** : | ||
- | * pour le Joueur, un //Kinematic Body 2D// . | ||
- | * pour la plate-forme, | ||
- | |||
- | De manière intuitive, chacun d' | ||
- | |||
- | Ensuite, **je les ajoute au nœud Main en les instanciant**. Ils ne bougent pas, mais ils apparaissent à l' | ||
- | |||
- | {{ :: | ||
- | |||
- | =====Mise-en-place des collisions===== | ||
- | On commence par modifier les masques de collision pour faciliter le travail : | ||
- | * 1 : joueur | ||
- | * 2 : ennemis | ||
- | * 3 : objets | ||
- | * 4 : terrain | ||
- | * 5 : terrain2 | ||
- | |||
- | **On modifie les nœuds de collision afin qu'ils correspondent.** Pour l' | ||
- | |||
- | Dans les versions précédente de //Godot//, le // | ||
- | |||
- | Nous commençons par mettre en place un système similaire, en créant un répertoire // | ||
- | |||
- | Après quelques recherches, voici [[https:// | ||
- | |||
- | À ce stade, nous avons donc le script // | ||
- | |||
- | < | ||
- | class_name Personnage | ||
- | extends KinematicBody2D | ||
- | |||
- | export var masse = 60 | ||
- | onready var gravite = ProjectSettings.get( " | ||
- | |||
- | 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 héritée, parente | ||
- | func _physics_process( delta ): | ||
- | _velocite.y += gravite * masse * delta | ||
- | </ | ||
- | |||
- | Ainsi que le script // | ||
- | |||
- | < | ||
- | class_name Joueur | ||
- | extends Personnage | ||
- | |||
- | const DETECTION_DISTANCE_SOL = 20.0 | ||
- | |||
- | func _physics_process( _delta ): | ||
- | var accrocheVectorielle = Vector2.DOWN * DETECTION_DISTANCE_SOL | ||
- | |||
- | _velocite = move_and_slide_with_snap( | ||
- | _velocite, | ||
- | accrocheVectorielle, | ||
- | NORMAL_SOL, | ||
- | true, # Ne glisse pas sur le sol en cas d' | ||
- | 4, # Nombre de collisions traitées par cycle | ||
- | 0.9, # Angle maximum du sol ( en radians ) | ||
- | false # Inertie infinie ? | ||
- | ) | ||
- | </ | ||
- | |||
- | Le personnage, emporté par son propre poids, est attiré vers le sol et s'y accroche à son contact. |
dindomoteur_mise_en_place_un_moteur_de_jeu_video.1647196978.txt.gz · Dernière modification : 2022/03/13 18:42 de Simon Deplat