Transcription
1. Intro: Bienvenue dans mon cours
sur les bases du développement
de jeux et de Gado Ce cours est la suite de l'introduction au
développement de jeux en trois dimensions et à Gado, mais il peut être suivi et appliqué
à tout projet contenant
un personnage que le joueur peut contrôler pour passer d'un niveau à l'
autre Vous pouvez rejoindre
notre serveur Discord pour travailler sur ce cours
aux côtés de vos pairs Dans ce cours, nous
aborderons les éléments essentiels communs à presque
tous les jeux, quel
que soit leur genre. Création d'une scène de titre, menus, transition fluide
entre les scènes, déplacement d'un personnage entre les différents niveaux de votre
jeu, musique de fond, paramètres et
persistance des données entre les scènes, niveaux et les sessions de jeu Lorsque vous aurez terminé,
vous aurez une bonne structure de
base d'
un jeu que vous pourrez développer pour en quelque chose de votre propre
design, quel que soit son genre. Vous acquerrez également des compétences utiles pour travailler avec le moteur de jeu
Gada, organiser et concevoir vos projets de manière à ce qu'ils
soient plus évolutifs Vous
apprendrez à coder avec le script
GD avec tout
expliqué en détail Nous appliquerons les principes de conception
orientée objet dans nos scripts, à savoir l'héritage, l'encapsulation et l'abstraction,
afin de les organiser, personnaliser et de les
réutiliser pour un projet de toute taille Tous les fichiers du projet seront également disponibles sur GitHub, si vous devez revoir
le projet tel qu' il était après avoir terminé
chaque leçon Ces vidéos ont été enregistrées
avec la version 4.2 0.2 de Gadot. Le projet commence
avec des éléments issus des personnages et de donjons de
Ka Kit packs
remasterisés de personnages et de donjons de
Ka Kit
créés par Dans ce cours, j'ajouterai
également des éléments du Basic Guy Bundle
créé par Penzilla et de la musique dans le pack
Barns Music créé par Eric the Tous sont disponibles en
téléchargement gratuit sur H point IO.
2. Pause: Bonjour, mes amis.
Avant de commencer, votre projet doit comporter une
scène de jeu contenant un personnage
que le joueur peut
contrôler et un niveau dans
lequel il
peut se déplacer. Vous devez avoir au moins deux ou trois scènes de niveau différentes prêtes à être connectées lorsque le joueur
franchit un seuil. Tout au long de ce cours, nous
ajouterons des éléments
essentiels à tout type de jeu auquel vous pouvez
penser, notamment les menus, les transitions entre les
scènes et les niveaux, décoloration visuelle et audio, les
paramètres, les crédits
et la persistance des données Vous pouvez utiliser votre propre projet pour suivre ce
cours ou télécharger un projet de démarrage sur mon
Github intitulé Godot Essentials course Main branch Votre projet peut être en
deux ou trois D et presque tous les
genres de jeu impliquant déplacement d'un personnage
entre différentes scènes. Commençons par autoriser le
joueur à mettre le jeu en pause. En ouvrant les paramètres du projet et en
passant à l'onglet Carte d'entrée, nous pouvons ajouter une nouvelle action de pause et cliquer sur
le bouton Ajouter. faisant défiler la page vers le bas, en trouvant
notre nouvelle action de pause, nous pouvons ajouter des événements
qui déclencheront cette action de pause
en cliquant sur le bouton Plus J'utiliserai la touche Escape et le bouton de démarrage
de ma manette. Nous avons utilisé le nœud
joueur pour gérer entrées de
notre jeu par
le biais du script ci-joint et pour transmettre les informations
appropriées pour déplacer le personnage ou le bras à
ressort et la caméra Comme nous l'avons fait avec les boutons de
course et de saut, nous pouvons vérifier si le
bouton pause a été enfoncé. Mais nous ne voulons pas mettre
le personnage ou la caméra en pause. Nous voulons suspendre toute
la scène. Nous pouvons récupérer une référence
au nœud
racine des scènes en exportant
une autre variable. Appelons cela Underscore GM, abréviation de Game Manager Mais la valeur de cette variable ne devrait jamais vraiment
avoir besoin d'être modifiée. Il doit toujours être le
nœud racine de la scène de jeu. Plutôt que lors de l'exportation, nous pourrions utiliser at on ready pour définir la valeur de notre variable
GM afin d'obtenir le parent, puisque le nœud joueur est
un enfant du nœud de jeu. Mais il se peut que nous ne voulions pas nous fier à
cette structure exacte pour que notre script
fonctionne correctement. Nous pouvons, par exemple,
vouloir que le nœud joueur soit un enfant du
nœud personnage pour d'autres raisons. Donc, pour que cette référence
pointe toujours directement vers le nœud racine de
Scenes, nous pouvons utiliser l'annotation du
signe dollar. En commençant le chemin du nœud par
une barre oblique,
nous allons commencer par la racine des arbres de
scène Mais il est important de noter que ce n'est pas encore le nœud de la scène de
jeu. Nous devons également ajouter le
nom du nœud racine à ce chemin de nœud. Si nous exécutons notre scène actuelle, puis que nous passons à la
vue à distance dans le panneau de scène, nous pouvons voir que le nœud racine
des arbres de scène est nommé racine, et qu'actuellement le seul nœud
enfant racine est le nœud de jeu. Maintenant que notre nœud joueur fait directement référence
au nœud racine des scènes, appelons une
fonction que nous
n'avons pas
encore écrite, Toggle pause Joindre un nouveau script
à notre nœud de jeu. Ce script sera
chargé de gérer la
scène dans son ensemble. Nous l'appellerons Game Manager. Tout comme un manager
sur son lieu de travail, cette tâche de script consistera à ouvrir la scène
dès son lancement. Assurez-vous que tous les
employés ou les nœuds enfants disposent de tout ce dont ils ont besoin pour effectuer leur travail individuel, puis fermez la scène une
fois l'opération terminée. Comme notre jeu simple ne
comporte qu'un seul mode de jeu, nous n'avons besoin que d'un seul gestionnaire de jeu. Mais un jeu plus complexe avec plusieurs scènes de jeu peut
avoir un gestionnaire d'exploration, gestionnaire de
combat, un gestionnaire de puzzles , etc., pour différentes scènes de
jeu. Dans notre nouveau script de gestionnaire de jeu, nous pouvons ajouter la fonction de bascule et de
pause que nous avons appelée depuis le script du
joueur Mettre le jeu en pause est
en fait assez simple. Nous allons commencer par
obtenir une référence à l'ensemble de l'arbre des scènes avec une fonction
intégrée, get tree. Le type de retour de cette
méthode est un arbre de scènes, qui contient une variable nommée
paused à laquelle nous pouvons accéder avec p. Le type de la variable
suspendue est un booléen, dont la valeur par défaut
est false Régler la valeur sur
true fait des pauses pour gagner. Nous pouvons changer la valeur entre vrai et faux chaque fois que
cette fonction de bascule
et de pause est appelée à l'aide de l'opérateur
logique zéro, représenté par un point d'
exclamation Régler la valeur de
pause sur zéro sur « faux »
la première fois, puis sur « non vrai » la seconde fois et Si nous le testons, nous
pouvons suspendre le jeu, mais nous ne pouvons pas encore le remettre en pause. Cela est dû au fait que le nœud joueur, qui essaie de recevoir les
entrées pour mettre le jeu en pause, est également suspendu et ne peut ni
recevoir ni traiter se peut que nous ne
souhaitions pas suspendre certains nœuds pendant que
le jeu est en pause. En sélectionnant le
nœud du joueur dans l'arborescence de la scène, regardez dans l'inspecteur situé sous nœud et développez la section des
processus. La propriété mode est
actuellement définie pour hériter, ce qui signifie qu'elle héritera du même mode de processus que
son parent, le nœud de jeu Puisque le nœud de jeu est suspendu, le nœud joueur sera également suspendu. Nous pouvons changer cette
valeur en always, afin que le nœud joueur fonctionne toujours même lorsque
le jeu est en pause. Notez que nous pouvons également faire en sorte que certains
nœuds ne
soient que lorsque le jeu est pause ou désactiver complètement le traitement à partir de certains nœuds Désormais, lorsque nous lançons la scène, nous pouvons suspendre ou remettre
le jeu en pause, car le nœud joueur
fonctionne toujours malgré Mais cela pose un nouveau problème. Si nous interrompons le jeu et
appuyons sur le bouton de saut, puis que nous relâchons la pause, le
personnage saute Si nous ne voulons pas ce comportement, nous devons revenir
au script du joueur. Déplaçons d'abord la case correspondant au bouton de pause
en haut de la fonction de saisie. Ensuite, si l'arbre est suspendu, ignorez toute autre entrée en revenant et faites de
même dans la fonction de traitement pour ignorer également le mouvement et les commandes de la
caméra Désormais, lorsque le jeu est en pause, la seule chose que le joueur peut donner est de le remettre en pause Tout le reste sera ignoré. Enfin, j'aimerais afficher un menu
à
l'écran avec quelques boutons
pendant que le jeu est en pause. Mais avant de faire quoi que ce soit
concernant l'interface utilisateur, nous devons configurer la taille de la fenêtre du
jeu. Ouvrez les paramètres du projet et
passez à l'onglet général. En sélectionnant la fenêtre, nous pouvons définir la propriété de taille pour définir la taille de la
fenêtre de notre jeu. La taille de fenêtre optimale
dépend de votre plateforme cible. Je vais utiliser 12 pixels de 80 x 720 pixels. Jusqu'à présent, tout ce qui se trouve dans
notre arbre de scènes observé par la caméra pour
produire une image en deux
dimensions, est
observé par la caméra pour
produire une image en deux
dimensions, ce que nous voyons dans notre
fenêtre lorsque nous jouons au jeu. Cette image
en deux D rendue par notre caméra est la couche zéro
de l'écran en deux D. Nous pouvons ajouter des
couches supplémentaires à l'écran de nos jeux fois que la caméra a terminé son rendu en utilisant
un nouveau type de nœud, un nœud de couche Canvas. La couche par défaut d'un nœud de couche
Canvas est une, elle sera
donc dessinée
au-dessus de la couche zéro. Si nous le voulons, nous pouvons
ajouter autant de couches que vous le souhaitez pour dessiner
devant ou derrière notre jeu. Renommons le nœud de la
couche Canvas en UY, abréviation de interface utilisateur le bouton droit sur le nœud de l'interface utilisateur et sélectionnez Ajouter un nœud enfant. Ajoutons un
nœud d'étiquette au Canvass. Cela fait passer notre point de vue à deux
D. Jusqu'à présent, nous n'avons travaillé qu'avec des nœuds par défaut tels que le nœud joueur et trois
nœuds D pour tout le reste. Notre Canvas utilisera
une famille différente de nœuds appelés nœuds de contrôle
, dotés d'icônes vertes. Je vais renommer ce nœud en titre
et définir sa propriété
pour qu'elle soit « pause » Ensuite, répétons le
processus pour ajouter un bouton. Et nommez le bouton « continuer ». Modifiez ensuite le
texte du bouton pour qu'il en soit de même. Zoomez et effectuez un panoramique pour voir le rectangle bleu
à droite de l'axe vert y et en
dessous de l'axe X rouge. Il s'agit de la fenêtre
d'affichage de la fenêtre de jeu. Nos nœuds ont été ajoutés
à l'origine de la scène Ils seront
donc affichés dans le coin supérieur gauche de l'
écran si nous jouons au jeu, mais ils se chevauchent Organisons ces nœuds à
l'aide d'un autre nœud de contrôle, un conteneur à boîte verticale. Un conteneur vertical
ne dessine rien, mais nous organiserons ses
enfants de manière à les aligner verticalement, ce qui accélérera l'organisation rapport au
positionnement manuel de chaque nœud. En sélectionnant à la fois les nœuds de titre
et les nœuds continus, nous pouvons cliquer et
faire glisser pour les relier au nœud de
la boîte verticale et voir à ce qu'ils soient
automatiquement réorganisés Dupliquons également le bouton
continu pour créer un autre bouton et
nommons celui-ci exit. Modifiez ensuite la
propriété du texte en conséquence. Le cadre vertical s'est automatiquement ajusté pour
accueillir le bouton supplémentaire. Renommons le cadre vertical
en menu pause. Une fois le
nœud du menu de pause sélectionné, développez la section de mise en page. La valeur prédéfinie des ancres est
actuellement définie en haut à gauche. Nous pouvons facilement ancrer
le menu de pause à n'importe quel coin ou au
centre de l'écran. Les ancres sont représentées dans l'aperçu par ces
quatre épingles vertes, lesquelles nous pouvons
cliquer et faire
glisser individuellement sur l'écran Les ancres déterminent la position ou la taille des
notes, par rapport
à la taille de
fenêtre définie dans les paramètres du projet, exprimée en pourcentage Nous pouvons également utiliser des ancres personnalisées si nous voulons, par exemple, utiliser uniquement les 10 % supérieurs de
l'écran pour une barre de menu, ou peut-être utiliser le tiers central de l'écran pour
afficher un tableau Je vais ancrer mon menu de pause
au centre de l'écran et configurer l'alignement
horizontal des titres pour qu'il soit centré
sur les boutons. Une fois le menu de pause créé, définissons sa
propriété visible sur false par défaut en
cliquant sur l'icône située
à côté dans l'arbre de scène. Ensuite, dans le script du gestionnaire de jeu, nous pouvons utiliser une
référence prête à obtenir au menu Pause. En utilisant le signe $1 pour
spécifier le chemin d'un nœud, en utilisant des guillemets parce que
le nom contient un espace, en passant par le nœud de l'interface utilisateur pour
accéder au nœud du menu de pause. Lorsque le jeu est en
pause ou non, nous pouvons définir la propriété
visible du menu de pause pour qu'elle corresponde à
la valeur de pause de l'
arbre Nous avons maintenant un
menu de pause avec des boutons, mais comment savoir quand
les boutons sont enfoncés et que faisons-nous lorsqu'
ils sont appuyés ? Si nous sélectionnons le
bouton de sortie dans l'arborescence de la scène, nous pouvons passer de
l'onglet inspecteur à l'onglet nœud, qui affichera
les signaux par défaut. Si des groupes sont affichés, vous pouvez passer aux signaux en
cliquant ici. Ici, nous pouvons voir une
variété de signaux que ce nœud émettra dans
différentes conditions. Le nœud du bouton émet un
signal lorsqu'il est enfoncé. Il suffit de connecter
ce signal à une fonction,
soit en double-cliquant dessus, soit en cliquant avec le bouton droit de la souris et en
sélectionnant connecter. Dans la fenêtre, nous pouvons sélectionner
n'importe quel nœud de notre arbre de scènes, pour
lequel nous écouterons
le signal à émettre. Si nous sélectionnons le nœud du gestionnaire de
jeu, le champ de la méthode du récepteur
indiquera que vous appuyez sur Exit, c'est le nom de la
fonction qui sera créée pour nous lorsque
nous cliquerons sur Connecter. Notre affichage passe
automatiquement script et affiche le script du gestionnaire de
jeu, qui contient désormais la fonction lorsque vous appuyez sur la touche de
sortie. Cette fonction sera désormais appelée automatiquement lorsque le joueur appuiera sur le
bouton de sortie . Une icône de connexion verte
est affichée à côté la
définition de la fonction pour nous indiquer que cette fonction est appelée
par un signal, et le bouton de sortie l'arbre de scène comporte
une icône de signal pour nous
indiquer que ce nœud peut émettre un signal
connecté à un récepteur. Pour l'instant,
imprimons simplement sur la sortie un message disant «
retournez à la scène du titre ». À la fois pour savoir que cela fonctionne et pour nous
rappeler d'implémenter
cette fonctionnalité ultérieurement. En sélectionnant le bouton Continuer, nous pouvons également connecter
le signal pressé au nœud du gestionnaire de jeu. Mais cette fois, cliquez
sur le bouton de sélection
et choisissez la fonction de bascule et de pause que nous avons écrite plus tôt Enfin, nous avons besoin de ce nœud pour fonctionner pendant que
le jeu est en pause. Passons donc à son mode de
traitement en mode pause. Essayons-le. Nous pouvons mettre le jeu en pause, cliquer sur
le bouton de sortie pour afficher notre message et appuyer sur le bouton Continuer pour mettre le jeu en
pause. Une fois que les
boutons du menu sont
focalisés, nous pouvons également utiliser les touches
fléchées pour naviguer entre les boutons et la barre d'
espace pour les appuyer. Faisons en sorte
que cela fonctionne également
avec notre manette de jeu en
quelques étapes simples. Ouvrez les paramètres du projet, l'onglet Carte d'entrée, dans l'onglet Carte d'entrée,
cliquez sur le bouton Afficher
les actions
intégrées pour voir les
actions utilisées Le Controllers DP est déjà
répertorié sous l'interface utilisateur gauche,
droite, haut et bas pour les menus
de navigation Mais nous devons ajouter une entrée de
contrôleur à l'action d'acceptation de l'interface utilisateur pour
pouvoir appuyer sur les boutons. Je vais utiliser le bouton
d'action inférieur, qui est A sur ma manette. Maintenant, nous avons juste besoin du menu
pour nous concentrer lorsqu'il est ouvert. En ajoutant un script au nœud
du menu de pause, nous le nommerons simplement menu. Nous allons exporter une variable
pour contenir l'élément de menu, qui devrait attirer l'
attention par défaut lorsque le menu est ouvert en mode contrôle
de type. Je vais attribuer le bouton de
poursuite comme élément
de focus par défaut dans l'inspecteur en cliquant dessus et en le
faisant glisser dans le champ Pour créer une fonction publique,
appelons-la ouverte. Nous pouvons définir la
propriété visible sur true et
également indiquer à l'élément de
focus par défaut de capter le focus. Et une autre fonction, close, remettra à la
propriété visible les chutes. De retour dans le script du gestionnaire de jeu. Au lieu de définir directement
la propriété visible de la pause many, nous pouvons appeler open ou
closed en fonction de la valeur de paused, en utilisant
une instruction if exécutant la scène, en utilisant
uniquement une manette, nous pouvons mettre le jeu en pause, naviguer dans le menu et
appuyer sur les boutons. Nous avons maintenant un menu de pause qui est présenté au joueur
lorsqu'il appuie sur la pause. Dans la leçon suivante, nous allons créer une scène de titre
pour notre jeu. Je te verrai dans la prochaine leçon.
3. Titre: Bonjour, mes amis. Dans
la leçon précédente, nous avons créé un menu de pause
pour notre scène de jeu. Dans cette leçon, nous allons créer une scène de titre connectée
à la scène de jeu. Pour cela, nous aurons besoin d'
une image d'arrière-plan et de quelques ressources d'interface utilisateur de base. J'utiliserai le bundle Guy de base créé par Penzila sur it shot IO Commençons par
créer une nouvelle scène. Vous pouvez sélectionner une scène
dans la barre de menu, puis une nouvelle scène. Utilisez le raccourci Ctrl
N ou Commande N ou
cliquez avec le bouton droit de la souris sur l'onglet Système de fichiers
et sélectionnez Créer une nouvelle scène. clic droit sur un dossier
spécifique créera la scène dans ce dossier et nous
permettra de lui donner
un nom immédiatement. Peu importe que cette
scène soit en deux ou trois D, puisque nous ne nous intéressons
à UY que pour cette leçon. Faisons du nœud racine de cette scène un nœud de contrôle en
sélectionnant Interface utilisateur. Et le nœud racine
est automatiquement renommé pour correspondre au
nom du titre de la scène. Si nous créons la scène
via le menu, il nous sera d'abord demandé de sélectionner
le type de nœud racine. Nommez-le ensuite et triez-le dans un dossier
lors de son premier enregistrement. En sélectionnant le nœud racine,
nous pouvons voir qu'il s'agit d'un nœud de contrôle dont
les préréglages d'ancrage sont réglés à fond, couvrant toute la fenêtre de jeu, mais ne
dessinant rien Comme dans la leçon précédente, ajoutons un nœud d'étiquette
et quelques boutons. Nommons le titre de la note d'étiquette et définissons la propriété
du texte sur le titre de notre jeu. De même, nommez
nos boutons et modifiez leurs
propriétés de texte dans un nouveau jeu. Continuez. Paramètres, crédits et boutons de sortie ou tout autre bouton que vous souhaiteriez voir apparaître sur l'écran titre de
votre jeu. Organisons également
ces boutons l'aide d'un conteneur vertical comme nous l'avons fait avec le menu Pause et renommons-le en boutons de menu Nous pouvons organiser rapidement et
facilement ces éléments sur notre
écran à l'aide d'ancres. Par exemple, j'aimerais que
le titre soit centré horizontalement sur l'écran et un tiers vers le bas à partir
du haut de l'écran. Une fois la
note d'étiquette de titre sélectionnée, en élargissant la section de mise en page, je vais modifier les
préréglages d'ancrage en paramètres personnalisés ancres sont définies par
des nombres de 0 à 1, représentant le pourcentage de la largeur ou de la hauteur des parents positionner le titre au
milieu de l'écran Vous pouvez positionner le titre au
milieu de l'écran
horizontalement en
réglant l'
ancre gauche sur 0,5, et l'ancre droite sera
automatiquement mise à jour pour correspondre, car l'ancre droite ne
peut pas être inférieure à la gauche. De même, positionner le titre à
un tiers du haut de l'écran signifierait régler
l'ancre supérieure sur 0,333 Ce n'est pas encore tout à fait
la position que je souhaite car les ancres se trouvent dans le coin supérieur
gauche de l'étiquette Le texte est simplement joué vers la droite et en dessous
du point d'ancrage. En élargissant la sous-section
direction de croissance, nous pouvons définir les
directions de croissance horizontale et verticale pour les deux. En fonction de la sous-section sur le
décalage des ancres, nous pouvons toutes les remettre à zéro, et les ancres sont désormais
centrées dans l'étiquette Je vais également positionner le
conteneur de boutons de la même manière. Mais avec son
ancre verticale aux deux tiers plus bas, il apparaît
donc en dessous
du titre du jeu. Vous pouvez également positionner n'importe lequel de
vos nœuds de contrôle manuellement, mais n'oubliez pas que l'utilisation d'
ancres rendra vos mises en page plus flexibles et s'adaptera à
différentes résolutions d'écran Ajoutons un manuscrit au nœud
des mini-boutons et attribuons un
élément de focus par défaut dans l'inspecteur. Tout comme notre scène de jeu possède
un script de gestionnaire de jeu attaché à son nœud racine, nous avons également besoin d'un script de gestionnaire de
titres attaché au nœud racine
des scènes de titre. Et ici, nous pouvons
récupérer une référence au script
des boutons de menu pendant la phase de préparation
en utilisant add on ready. Dites ensuite aux boutons du menu de s'
ouvrir dans la fonction « Prêt ». Le menu était déjà visible, mais en lui demandant de s'
ouvrir, nous indiquerons également l'
élément de focus par défaut de capter le focus. En sélectionnant chacun
des nœuds de boutons, nous pouvons ajouter un appel de
fonction pressé à notre
script de gestionnaire de titres pour chacun d'entre eux. Pour l'instant, nous ne nous
intéresserons qu' au
nouveau bouton de jeu. Le reste peut simplement
imprimer des chaînes pour nous
indiquer d'implémenter
ces fonctionnalités ultérieurement. Le but du nouveau
bouton de jeu sera de faire passer notre jeu de la
scène du titre à la scène du jeu. Nous pouvons y parvenir en obtenant une référence
à l'arbre des scènes, puis en accédant à une méthode
appelée change scene to file. Cette méthode prend
un argument de chaîne, qui est un chemin de fichier vers
la scène que nous voulons charger. Les suggestions contiennent une liste de toutes les scènes
de notre projet, afin que nous puissions sélectionner la scène de
jeu à partir d'ici. Sinon,
en regardant dans l'onglet du système de fichiers, nous pouvons trouver la
scène du jeu et cliquer avec le bouton droit de la souris, puis sélectionner Copier le chemin et le coller sous forme de texte. Mais n'oubliez pas que les chaînes doivent être placées
entre guillemets. Jusqu'à présent, nous avons utilisé le bouton Exécuter la scène
actuelle
pour tester notre jeu. Mais vous avez probablement déjà appuyé
accidentellement le bouton Exécuter le projet
au moins une fois, ce qui vous permettra
de configurer la scène principale de notre projet. C'est la première
scène qui
sera chargée lorsque nous
démarrerons le jeu, qui devrait être cette
scène, la scène titre. Si vous ne l'avez pas encore défini, vous pouvez cliquer sur le bouton
Sélectionner le moment pour définir la scène
du titre comme scène principale du jeu. Le nouveau bouton de jeu permet de se
concentrer lorsque le jeu commence. En cliquant sur chacun des boutons
, nos déclarations s'affichent, et en cliquant sur le
nouveau bouton de jeu vous passez
immédiatement à la scène de jeu. Nous pouvons également modifier la scène
principale du projet à tout moment à partir des paramètres
du projet
dans l'onglet général sous Exécuter la scène minimale de l'application. Notre scène de titre est
désormais fonctionnelle, mais elle n'est pas très belle. Tout d'abord, nous pouvons ajouter un
fond d'écran à l'aide d'un nœud de texte. Appelons-le arrière-plan. Dans la section de mise en page, si vous réglez les
ancrages sur Full Wreck, vous garantissez que l'arrière-plan
couvre toute la fenêtre Nous pouvons modifier la propriété de texture pour afficher l'image en
deux D que nous voulons. À l'aide des propriétés
de l'inspecteur, nous pouvons modifier le mode d'affichage de l'image
, en conservant sa taille d'origine
ou en
l'adaptant aux points d'ancrage
en largeur ou en hauteur. Nous pouvons également spécifier que
l'image doit conserver son rapport hauteur/largeur pour éviter soit étirée
pour s'adapter à la fenêtre. Enfin, nous allons le classer en
haut des scènes (enfants), afin qu'il soit dessiné en premier, après
tout le reste. Examinons ensuite les propriétés des
nœuds de l'étiquette de titre. La plupart des
paramètres de l'étiquette concernent justification
et l'emballage, ce qui n'est pas vraiment
pertinent pour notre titre. Les paramètres que nous voulons modifier se
trouvent sous les propriétés héritées du contrôle dans
la section de remplacement du thème Ici, nous pouvons ajuster
la couleur de police. Ajoutez une ombre ou un contour qui peut également être ajusté dans la sous-section
des constantes. Nous pouvons modifier la taille de la police, ainsi que la police elle-même. J'ai téléchargé quelques polices
gratuites sur dafont.com. Assurez-vous que toutes les polices que vous utilisez
dans vos jeux sont gratuites. Da font affiche la licence de ses polices au-dessus
du bouton de téléchargement. Cela fonctionne bien pour le titre de
notre jeu, qui est censé se démarquer, mais modifier les
propriétés individuelles de
cette manière pour tous les éléments de
notre projet serait fastidieux Pour modifier nos boutons de menu, nous devrions plutôt
créer un thème commun à utiliser tout au long
du projet de jeu. Sélection du nœud
conteneur de boutons. Cette fois, élargissez
la section thématique. Le champ du thème est vide. En cliquant dessus, nous pouvons sélectionner nouveau thème pour créer une nouvelle
ressource thématique pour notre projet. En cliquant sur la ressource thématique, un nouvel onglet
sera ajouté
au panneau inférieur de notre
fenêtre, un éditeur de thème. L'éditeur de thème
contient un aperçu d'une variété
de nœuds de contrôle
différents, d'
un panneau jouable, de
différents types de boutons, de
boutons, d' une liste déroulante, d'un sélecteur de
couleurs, de champs de texte, de barres de
défilement, de séparateurs, d'
onglets Le tout en utilisant le thème
par défaut fourni par Gadot. En repensant à notre
ressource thématique dans le panneau de l'inspecteur, nous pouvons modifier la police et la taille de
police par défaut pour tous
les éléments de notre thème. Changeons la police
et ajustons la taille. Nous pouvons voir les effets à la fois dans l'aperçu et dans
les boutons de notre menu titre. Cela n'affecte pas
le titre du jeu puisque le thème n'a pas
été appliqué à ce nœud. Il n'a été appliqué qu'
au conteneur de boutons de menu. Même si le thème était
appliqué au nœud de titre,
les remplacements de thème
que nous venons d'appliquer
seraient utilisés à la place Les boutons héritent de leur thème de leur parent
dans l'arborescence des scènes Dans l'éditeur de thème, nous
pouvons ajouter de nouveaux paramètres pour n'importe quel nœud de contrôle
en cliquant sur le bouton Plus. Comme notre menu
ne contient que des nœuds de boutons, ajoutons des paramètres
pour les nœuds de boutons. Il existe de nombreux
paramètres permettant de régler la police et les couleurs des
icônes selon l'
état du bouton. Par défaut, désactivé,
focalisé, surligné, surligné, pressé et enfoncé, ainsi qu'une couleur de contour Avant de pouvoir ajuster
l'un de ces paramètres, nous devons les ajouter au thème en
cliquant sur le
bouton plus à côté d'eux. En ajustant l'un de ces paramètres,
nous pouvons voir leurs
effets dans l'aperçu,
notamment les nous pouvons voir leurs
effets dans l'aperçu, états du survol, de la mise au point
et de la pression
en cliquant sur les boutons Des
paramètres supplémentaires et d'autres onglets permettent de
régler les constantes, les polices et la taille de police. La police et la
taille de police ont déjà été définies par la
ressource thématique elle-même. Nous n'avons pas besoin de les
ajuster ici. Nous pouvons également modifier l'apparence du bouton lui-même à
l'
aide de boîtes de style. Chacun des états des boutons peut être attribué à une boîte de style
différente. Commençons par le normal.
En cliquant sur le bouton plus, nous pouvons utiliser une boîte de
style plate pour simplement créer un
rectangle plat coloré pour le bouton, ou nous pouvons utiliser une boîte de style de
texture pour utiliser une image bidimensionnelle importée. Cliquez sur la
ressource de la boîte de style pour l'ouvrir dans le panneau de l'inspecteur
où nous pouvons remplir le champ de texture avec
un fichier image en deux D. Vous souhaiterez peut-être ajouter un peu de rembourrage sur les
bords du bouton afin que le texte du bouton ne
chevauche pas les
bords de l'image En élargissant la section des
marges de contenu, nous pouvons ajuster la
taille des marges pour mieux s'adapter au texte
à l'intérieur de l'image. En ajoutant une boîte de style enfoncée, nous pouvons changer la texture utilisée pour dessiner le bouton. vous copiez les mêmes paramètres, vous
n'utilisez pas la zone de style normale, mais augmentez le rembourrage supérieur pour que le texte se déplace vers le
bas lorsque vous appuyez dessus Ajout de zones de style pour les états de survol
désactivés et de
focalisation Il se peut que les textures ne soient pas
différentes pour les différents états de vos
boutons. Mais nous pouvons toujours créer de nouvelles boîtes de
style pour ces états. Utilisez la même
texture et les mêmes paramètres normaux, mais ajoutez une
modulation de couleur pour créer une apparence différente pour
le bouton dans cet état. Nous pouvons multiplier les
couleurs des textures par quelque chose comme jaune pour leur donner
un aspect sensiblement différent lorsqu'elles sont recouvertes Ou nous pouvons simplement utiliser
une autre image d' une couleur différente
pour mettre l'accent. Lorsque cette option est désactivée, nous pouvons multiplier les couleurs Alpha pour
ajouter de la transparence. Nous pouvons
facilement tester toutes ces
différentes boîtes de style depuis l'aperçu
dans l'éditeur de thème. Maintenant que le
menu Remain est plus beau, modifions également le menu Pause la scène de jeu
en conséquence. Au lieu d'ajouter un nouveau thème
au menu Pause et de
refaire toutes les modifications, nous pouvons revenir
à la scène titre, rechercher la ressource et
cliquer sur le Sélectionnez Enregistrer et enregistrez le thème dans le dossier de
ressources de nos projets. Maintenant, dans la scène de jeu, nous pouvons attribuer ce thème
au menu de pause, et les boutons
seront automatiquement mis à jour pour correspondre
au nouveau thème. Ouverture du script du gestionnaire de jeu. Lorsque le joueur appuie sur
le bouton de sortie, nous pouvons également passer
à la scène titre. En lançant notre jeu, nous
commençons par la scène du titre. Le nouveau bouton de jeu permet
de passer à la scène de jeu. mettez le jeu en pause et que vous sélectionnez Quitter, vous revenez à la scène titre Nous avons maintenant une
scène titre et pouvons passer d'une scène à l'autre
. Dans la leçon suivante, nous allons faciliter la transition entre les scènes
en passant au noir Je te verrai dans la prochaine leçon.
4. Transition: Bonjour, mes amis. Dans
la leçon précédente, nous avons créé une scène de titre et nous l'avons
connectée à la scène de jeu. Dans cette leçon, nous
simplifierons la
transition grâce à un fondu visuel. La plupart des jeux
commencent par un écran noir. Ajoutons un nouveau nœud
à notre scène de titre, un nœud détruit par des couleurs Appelons-le Fade.
Dans l'inspecteur, nous pouvons définir la
propriété de couleur sur le noir. Réglez ensuite les préceptes de l'ancre sur une épave complète pour couvrir toute
la fenêtre Lorsque le jeu démarre,
nous pouvons légèrement estomper cet
objet pour le rendre totalement transparent, révélant ainsi la
scène du titre qui se cache derrière celui-ci. Même lorsqu'un objet de
notre scène est transparent, événements
liés à la souris ne sont
déclenchés qu'au
premier contact, ce qui signifie que le fait de déplacer la
souris ou de cliquer sur nos boutons est
bloqué par le fondu. Dans les propriétés héritées du contrôle, dans la section souris, nous pouvons modifier les
paramètres de filtrage de notre fondu pour qu'il soit ignoré, ce qui permettra aux événements de
la souris passer par le fondu aux
objets situés derrière celui-ci. Maintenant, les boutons fonctionnent
à nouveau avec la souris. Pendant que nous travaillons sur
notre scène dans le montage, il serait préférable de
pouvoir voir tout le reste. J'aimerais que le fondu
soit visible par défaut. Avant de joindre un script, commençons à organiser
nos scripts dans des dossiers
plus spécifiques en
créant un sous-dossier nommé UI Nous pouvons déplacer le manuscrit dans le sous-dossier puisqu'il est
utilisé pour contrôler les éléments de l'interface utilisateur Mais lorsque vous
déplacez des ressources de cette manière, assurez-vous que les scènes qui les
utilisent sont ouvertes en premier. Dans le cas contraire, les fichiers de scène
risquent d'en perdre la trace. ce cas, replacez simplement la ressource
là où elle était à l'origine et assurez-vous que
les scènes utilisant la ressource sont ouvertes
avant de la déplacer. Nous pouvons maintenant joindre un script
au nœud Fad et utiliser le navigateur pour le trier
dans le dossier des scripts de l'interface utilisateur Contrairement à notre manuscrit, qui pouvait être pertinent pour
n'importe quel nœud de contrôle, puisqu'il n'affectait que
la propriété visible
, héritée du contrôle. Ce script FAD modifiera propriété de couleur
du nœud endommagé par
la couleur, de sorte qu'il ne sera utilisable que par nœuds de
couleur ou ses Commençons par la fonction «
prêt ». Définir la propriété visible de fa true lorsque la
scène démarre pour la première fois, rendant la fenêtre
complètement noire. Ensuite, nous pouvons déclarer une
fonction publique appelée à être effacée. Contrairement à la plupart des fonctions
de la plupart des scripts, cela
devra se produire progressivement au fil du temps,
sur plusieurs images. Nous pouvons y parvenir avec un
nouveau type de variable, un tween. Il peut s'agir d'une variable privée, applicable
uniquement à
ce script localement, et je vais simplement la nommer
tween pour plus de simplicité Le nom de cette
classe vient mots anglais entre les deux, car elle est le plus
souvent utilisée pour trouver des points entre un
point de départ et un point d'arrivée. Nous pouvons créer un tween à tout moment en appelant une
méthode intégrée, create tween Cette méthode renvoie
un objet tween, que nous pouvons affecter à
notre variable pour le stocker Un tween est une classe complexe
avec une variété de méthodes, mais celle que nous voulons utiliser s'
appelle la propriété tween, qui nécessite
plusieurs arguments Le premier argument est le nœud que cette
interpolation affectera, qui est le même nœud auquel
ce script est attaché Nous pouvons obtenir une référence à ce nœud en utilisant
le mot clé self. La suivante est la
propriété du nœud que nous voulons modifier, un chemin de propriété sous forme de chaîne. Nous allons modifier la propriété de
couleur de ce nœud. Si vous n'êtes pas sûr
du chemin de la propriété, nous pouvons consulter l'inspecteur. survol d'une propriété nous
indiquera le
chemin de la propriété pour y accéder, ou nous pouvons cliquer avec le bouton droit de la souris pour copier le chemin de la propriété et le
coller sous forme de texte L'argument suivant est
la valeur finale à laquelle nous voulons que cette propriété soit définie une
fois l'interpolation terminée Comme la propriété est une couleur, nous lui attribuerons une couleur
personnalisée que nous définirons. Disons que c'est clair. Et la dernière propriété est la durée de
l'interpolation,
mesurée en secondes, exprimée sous forme de valeur flottante Réglons-le sur 1
seconde pour le moment. La valeur de clear sera quelque chose que nous pourrons
définir mais que nous ne modifierons jamais. Au lieu de déclarer une variable, nous pouvons définir une constante
en utilisant le mot-clé constant. Nommez-le sans couleur typographique. Il est classique de nommer les
constantes en majuscules. Attribuez ensuite la valeur de
cette constante sous forme de couleur. L'écriture du nom de classe
suivi de crochets accéder à une méthode de constructeur, ce qui nous permet de
construire la couleur en spécifiant toutes les propriétés
requises Une couleur est définie
par quatre flottants :
rouge, vert, bleu et
Alpha pour la transparence A sous forme de chiffres de 0 à 1. Notre couleur claire sera
simplement zéro, rouge, zéro, vert, zéro, bleu
et zéro Alpha, ce qui la rendra noire, mais aussi complètement transparente. appel de notre méthode à deux
effacements fera passer la propriété
de couleur de sa valeur actuelle, qui est le noir, à
la valeur claire pendant une seconde. Nous pouvons également écrire
une autre fonction en noir pour faire le contraire. Cependant, il n'est pas nécessaire
de définir une constante pour noir puisque la
classe de couleur en possède déjà une. Nous pouvons y accéder via le nom de
classe en utilisant un point, et nous pouvons voir qu'il existe un grand nombre de couleurs
prédéfinies. Celui que nous voulons en
ce moment est noir. Le noir est défini comme zéro, rouge, zéro, vert, zéro,
bleu, sauf un Alpha. Passons au script du
gestionnaire de titres pendant un moment et saisissons une référence au FAD Noe pendant la
phase de préparation en utilisant at ready Lorsque la scène commence, nous pouvons dire
à Fate de s'effacer. Ensuite, avant de passer
à la scène de jeu, nous pouvons lui dire de passer au noir. Mais le processus de passage
au noir prend du temps, et cette fonction s'exécute en une seule image pour
passer immédiatement à la scène de jeu Nous ne verrons
donc pas cela se produire Nous pouvons indiquer à cette
fonction de faire une pause et d'attendre un signal
avant de continuer, en utilisant un nouveau mot-clé, un poids. Un poids nécessite un
signal d'attente, que nous pouvons faire revenir de
la fonction Fade to Black. De retour dans le script FAD, nous pouvons spécifier un type de retour pour nos fonctions
avant les deux points en ajoutant un tiret, une flèche,
puis un Dans ce cas, nous
voulons renvoyer un signal. La classe d'interpolation contient
un signal qui est émis automatiquement lorsque
l'interpolation est terminée Nous pouvons
donc le renvoyer Le gestionnaire de titres
attendra maintenant le nœud FAD passe au noir
avant de changer de scène Butt copie également ce format
dans la fonction two clear. Même s'il
renvoie un signal, le gestionnaire de titres n'
a pas besoin d'
accepter ce retour ni d'en
faire quoi que ce soit. Dans ce cas, l'interpolation
sera lancée et le reste de la fonction
sera exécuté immédiatement Nous pouvons copier ce nœud FAD
dans la scène de jeu. Modifiez ensuite le script du
gestionnaire de jeu pour obtenir une référence au nœud FAD
pendant la phase de préparation Passez au clair lorsque la
scène démarre pour la première fois, et attendez que le fondu passe au noir avant de passer à
la scène titre. Mais cette fonction, lorsque vous appuyez
sur la touche de sortie, est appelée pendant que
le jeu est en pause. Par conséquent, le nœud F est également suspendu et ne changera pas de couleur
en conséquence Nous pouvons autoriser le nœud FAD à toujours traiter pour se déplacer Mais ce
serait aussi une bonne idée de
mettre le jeu en pause avant de
changer de scène Essayons-le. Maintenant, le jeu commence à partir d'un écran
noir qui passe à notre écran titre, pression sur le nouveau
bouton de jeu passe au noir,
passe à la scène de jeu,
qui s'estompe vous faites une pause et que vous appuyez sur le bouton de
sortie, vous passez au
noir, puis passez à la scène titre, qui s'estompe également Cependant, il y a un scintillement entre les scènes
de changement de scène. Nous pouvons modifier les paramètres du projet dans l'environnement de rendu et changer la
couleur par défaut en noir. Il s'agit d'une transition beaucoup plus
douce que de
changer immédiatement de scène, et si notre jeu
devient suffisamment volumineux pour nécessiter des temps de chargement plus longs, nous pouvons le remplacer par un écran de chargement. Cependant, il peut être
difficile de
commencer un préadolescent avant la fin du
précédent De retour dans le script FAD, nous pouvons vérifier si le tween
existe en le comparant à null Dans le script Godo, nous pouvons le faire implicitement avec just if S'il existe,
vérifiez également s'il fonctionne. Dans ce cas, nous devons tuer le préadolescent avant d'
en créer un nouveau Cela empêchera toute possibilité plusieurs préadolescents existent et
interfèrent les uns avec les autres, puisque le plus récent
prendra simplement le Nos deux fonctions claires et deux fonctions
noires sont très similaires, seule la
valeur de couleur étant différente entre elles. Ce serait une bonne pratique de déclarer
plutôt une fonction
privée ici. Appelons-le bicolore et acceptons une couleur
comme paramètre. Nous ne pouvons alors faire tout
cela qu'une seule fois. En passant la couleur à la méthode des propriétés
jumelles, et en utilisant les deux fonctions claires
et les deux fonctions noires on appelle plutôt cette
fonction bicolore. Faire passer le
signal de retour à travers la chaîne ou les gestionnaires
peuvent l'attendre. De cette façon, toute modification de ce comportement
ne nécessitera de modifier qu'un seul bloc de code. Vous souhaiterez peut-être que le
script soit plus adaptable. Exportons une variable
pendant la durée de l'interpolation et attribuons-lui une valeur
par défaut de 1 seconde Remplacez ensuite l'
argument de 1 seconde par notre variable, et maintenant le timing du peut être facilement ajusté
dans l'inspecteur. Voyons à quoi ressemble le FAD avec une durée de 2 secondes. Nous pouvons rendre cela encore
plus flexible en autorisant les deux fonctions claires et les deux fonctions
noires à accepter un paramètre facultatif pour
remplacer la durée spécifiée Appelons le paramètre
duration sans trait de soulignement, pour le
différencier de la variable qui possède un trait de soulignement Et attribuez-lui une valeur par défaut
de notre durée de soulignement. Nous devons ensuite transmettre cette valeur à la fonction bicolore. Et ajoutez-le à la
liste des paramètres. Utilisez ensuite le paramètre dans la méthode de propriété tween
au lieu de notre variable Nos scripts de gestion
peuvent toujours utiliser ces fonctions sans
spécifier de durée. Dans ce cas, la valeur
exportée sera. Mais ils peuvent également spécifier une durée différente
et l'utiliser à la place. Faisons en sorte que la durée exportée soit
de 1 seconde, mais autorisons le
gestionnaire de titres à la remplacer et à s'estomper sur une durée
de 2 secondes à la place. Nous avons maintenant une transition
visuelle plus douce entre nos deux scènes. Dans la leçon suivante, nous
transmettrons des informations entre les scènes. Je te verrai dans la prochaine leçon.
5. Autoload: Bonjour, mes amis. Dans
la leçon précédente, nous avons intégré et éteint nos scènes
pour une transition plus fluide Dans cette leçon, nous allons
ajouter à
l'arborescence des scènes des nœuds supplémentaires accessibles depuis n'importe quelle scène. Si nous lançons notre jeu et passons
à l'arborescence des scènes distantes. Nous pouvons voir que la racine de l'
arbre de scène n'a qu'un seul enfant, qui est la scène titre. Lorsque vous passez à
la scène de jeu, la scène de titre est supprimée de l'arborescence et
remplacée par la scène de jeu. Si nous voulons transmettre des
informations entre les scènes, nous pouvons ajouter des enfants supplémentaires au nœud racine
de l'arbre des scènes, qui y resteront
tant que le jeu est en cours d'exécution. C'est ce qu'on appelle des chargements automatiques, et nous pouvons les créer
en écrivant des scripts. Ajoutons d'abord un dossier
spécial dans
le dossier des scripts pour contenir
nos scripts de chargement automatique. Cliquez ensuite avec le bouton droit sur ce
dossier pour créer un nouveau script. Le but du script
sera d'économiser de la charge et de fournir un accès aux données. J'aimerais nommer
ce fichier de script. Comme cela ne représente rien qui doit être dessiné, il peut hériter du nœud Ce script
comportera deux variables contenant des
ensembles d'informations distincts, les paramètres actuels du jeu et la
progression actuelle du joueur dans le jeu. Vous souhaiterez peut-être avoir une
troisième variable pour stocker les informations de
progression
associées à un compte utilisateur, mais non liées à un emplacement de sauvegarde
spécifique, comme le déverrouillage de
niveaux de difficulté ou de succès Ces variables
seront accessibles au public pour tout autre script de
notre jeu, quelle que soit la scène. Ouvrez les paramètres du projet, passez à l'onglet de chargement automatique. Cliquez sur l'icône du dossier à côté du champ de chemin pour
ouvrir un navigateur, puis accédez
au script du fichier. Le champ du nom du nœud
sera automatiquement renseigné pour correspondre
au nom du script. Cliquez sur le bouton Ajouter pour ajouter ce script à la
liste des chargements automatiques. Maintenant, lorsque nous lançons le jeu, nous pouvons voir dans l'arborescence de la scène
distante que le nœud racine possède un autre nœud
enfant nommé file. En cliquant sur ce nœud,
nous pouvons voir qu'il contient deux variables nommées
paramètres et progression. En passant à la scène de jeu, la scène de titre est supprimée et remplacée par
la scène de jeu, mais le nœud de fichier reste, ce qui signifie que nous pouvons l'utiliser pour transmettre
des informations entre les scènes. Mais je n'ai pas
spécifié de type pour les variables,
car nous souhaiterons créer nos propres types pour contenir des ensembles
complexes d'informations. Créons un autre
sous-dossier dans
le dossier des scripts et
nommons-le ressources personnalisées. Cliquez ensuite avec le bouton droit de la souris pour
créer un nouveau script. Appelons-le paramètres. Au lieu d'hériter
d'un type de nœud, le script
héritera
cette fois d' Ensuite, nous pouvons en créer un autre. Appelons cela un progrès. Dans les scripts de ressources, nous pouvons ajouter n'importe quel nombre de
variables de types différents, mais elles doivent être des types intégrés non des références à d'autres éléments. Par exemple, nous pouvons stocker
une variable booléenne, vraie
ou fausse, pour définir si les
commandes de caméra sur l'axe X sont inversées et une autre
pour l' Les nombres peuvent être stockés sous forme de nombres flottants, qui autorisent les décimales Vous pouvez l'utiliser pour enregistrer le réglage du volume du jeu
sous la forme d'un nombre compris entre zéro, muet ou un volume complet Les nombres peuvent également être
stockés sous forme d'entiers, un nombre qui ne
contient pas de décimales, mais qui peut être positif ou négatif Nous pouvons l'utiliser dans
le script de progression pour stocker l'argent des joueurs ou. Nous pouvons également utiliser des chaînes pour
stocker des séquences de caractères, donnant par
exemple un nom au joueur, à l'
emplacement de sauvegarde ou au protagoniste. D'autres types intégrés tels que vecteurs ou les couleurs
peuvent-ils également être utilisés ? Les collections de n'importe lequel de
ces types peuvent également être stockées dans un
tableau ou un dictionnaire, tel qu'un tableau de booléens indiquant si le joueur
a terminé chaque niveau
ou non a terminé chaque Chacun de ces
types de variables possède une valeur par défaut. Les booléens sont faux, les entiers
et les nombres sont nuls. Les chaînes, les tableaux et les
dictionnaires sont tous vides. Lorsqu'une ressource est créée, elle appelle automatiquement une fonction
intégrée qui y est nommée. Absence d'initialize. En remplaçant cette
fonction, nous pouvons spécifier valeurs
par défaut que nous
voulons pour nos variables Peut-être en commençant notre
réglage de volume à 0,5 pour un, ou en donnant au protagoniste
un nom par défaut. Pour créer notre ressource, nous
devons spécifier un nom de classe, ce qui se fait
en haut du script. Généralement dans la même ligne
que le mot clé extends. Avec le mot clé class name, nous pouvons donner à cette
classe de ressources un nom qui sera utilisé par d'autres scripts pour
désigner cette classe en tant que type. Nous pouvons nommer les paramètres de cette
classe avec un S majuscule, et celui-ci, progresser avec un P.
Par convention, les classes sont nommées en cas de Pascal avec la première lettre de
chaque mot en majuscule De retour dans le script de fichier, nous
pouvons maintenant spécifier les types de nos variables sous forme de
paramètres et de progression. Pour l'instant, nous pouvons simplement créer ces ressources dans
la fonction ready. En utilisant leur nom de classe
suivi du point Neu. Cela déclenchera également
la fonction d'initialisation, initialisant les variables
à l'intérieur de la ressource cours de jeu, nous pouvons voir ces variables dans l'arbre des scènes
distantes. Cliquez dessus, consultez et modifiez les valeurs de
leurs propriétés. Modifions leurs
valeurs. Passez à la
scène de jeu et vérifiez que les modifications sont maintenues pendant
la transition de scène. N'importe quel script de notre jeu
peut facilement accéder ces ressources grâce
au chargement automatique des fichiers. Ouvrons le script
Spring Arm responsable de la
rotation de la caméra. Son comportement actuel consiste
à utiliser des axes x et y inversés. Mais maintenant, nous avons des variables dans notre ressource de paramètres qui
devraient activer ou désactiver cette option Notez que
la rotation de la caméra autour l'axe X est une rotation
verticale, que les joueurs interpréteront
comme la rotation Y, et que la rotation autour de l'axe Y est la rotation horizontale
ou rotation X. Nous pouvons écrire une
instruction if avant chacun de ces
calculs pour vérifier paramètres de point de
notre fichier afin de voir si la
variable d'inversion appropriée est vraie ou fausse Multipliez ensuite la
formule par moins un, si elle est fausse, pour que le comportement inversé
devienne non inversé Cela signifie que presque la même formule est copiée deux fois avec seulement une petite différence entre le
fait d' être multipliée
par moins un ou non. Nous pouvons le faire plus efficacement
en utilisant une déclaration re. Revenez d'abord au format
d'origine, puis multipliez par entre crochets,
un, si les paramètres du fichier s' inversent sinon, moins un. Et en répétant cette opération avec
la rotation horizontale, remplacer y par x.
Les instructions
Turnary sont efficaces chaque fois que
vous souhaitez modifier une valeur sur la base d'une
simple condition d'intimidation Essayons-le. En inclinant
le stick analogique droit, la rotation x de la caméra n'est
plus inversée par défaut, mais la rotation y est En ouvrant l'arborescence des scènes distantes, nous pouvons accéder aux paramètres et les
modifier. Et pour en revenir à la simulation, les commandes de la caméra
sont désormais opposées. Nous avons maintenant créé
certains de nos scripts qui héritent de
différents types de notes ainsi que de ressources Mais nous pouvons également écrire des scripts qui héritent de nos
propres classes personnalisées En jetant un coup d'
œil au script FAD, nous avons combiné le comportement de
deux couleurs claires et de deux couleurs noires
en une seule fonction combinée Nous pouvons combiner des comportements similaires issus de différents scripts de la même manière,
en créant une super classe
et en utilisant l'héritage pour permettre
à différents scripts d'accéder au même comportement. Prenons l'exemple de nos
scripts de gestion, puisqu'ils utilisent tous deux désormais
la transition FAD Ce serait une bonne idée de
les placer dans un dossier de
scripts séparé. Appelons ça des managers. Déplacer le gestionnaire de jeu et le gestionnaire de titres
dans ce dossier. Nous pouvons également créer
un nouveau troisième script, appelons-le Scene Manager. Dans le script Scene Manager, nous allons donner au script un
nom de classe dans le cas d'une cloche de passe. Chaque fois que vous attribuez un nom de classe à un
script, vous devez l'enregistrer avant que
le moteur ne le reconnaisse. Ensuite, dans les scripts Game Manager
et Title Manager, nous pouvons leur demander d'étendre le comportement de la classe
Scene Manager. Désormais, tout ce que nous mettons dans le script
Scene Manager
sera utilisé à la fois par le
gestionnaire de jeu et par le gestionnaire de titres. Déplaçons la variable FAD dans le script Scene Manager Ensuite, dans le jeu
et les gestionnaires de titres, puisqu'ils héritent de
la variable Fad de la classe Scene Manager, ils ne sont pas autorisés à déclarer une autre variable
du même Nous pouvons supprimer la variable, puisqu'elle est désormais héritée
de la classe Scene Manager. Mais le chemin du nœud est différent entre la scène de jeu
et la scène de titre. Nous pouvons facilement contourner ce problème en exportant la variable
au lieu d'utiliser at on ready. Nous devrons attribuer
la valeur du fondu deux scènes dans
le panneau d'inspection. Si la variable
n'apparaît pas, vous devrez peut-être fermer et rouvrir Godot pour que l'
héritage de classe fonctionne Les fonctions sont également héritées, mais les sous-classes peuvent redéfinir des fonctions
héritées qui remplacent leur comportement. C'est pourquoi chaque classe que
nous avons écrite avec une fonction re ou une fonction process
a une icône bleue à côté, car elle remplace
la définition héritée qui existe
déjà dans
la classe de nœud Si notre classe de gestionnaire de scène dispose d'une fonction prête à
l'emploi qui indique au fondu de disparaître, ce comportement
sera hérité à la
fois par le gestionnaire de jeu
et par le gestionnaire de titres. Nous pouvons supprimer cette fonction
du gestionnaire de jeu, mais le gestionnaire de titres ouvre
également le menu. En permettant au
gestionnaire de titres de remplacer la définition de fonction prête héritée de Scene Manager, n'est pas nécessaire de la
remplacer dans son intégralité Nos sous-classes peuvent accéder à la définition héritée d' une fonction à l'aide
du mot-clé super Puisque le gestionnaire de titres hérite
de Scene Manager, Scene Manager est une superclasse En appelant Super Dot Ready, nous disons au
Fade de passer à clair. Mais ensuite, nous demandons également au
menu de s'ouvrir également. La structure des
superclasses et l'héritage
deviendra plus utile si nous avons plus de gestionnaires de scène ou si nous avons
des comportements plus communs à tous nos gestionnaires de scène Nous n'avons pas besoin de
réécrire le même code dans plusieurs scripts Nous avons maintenant un
nœud chargé automatiquement dans notre essai de scène qui peut stocker des informations sur les paramètres et la progression
du jeu. Dans la leçon suivante, nous allons ajouter une
musique de fond à notre jeu. Je te verrai dans la prochaine leçon.
6. MUSIQUE: Bonjour, mes amis. Dans
la leçon précédente, nous avons créé des nœuds
chargés automatiquement qui peuvent être utilisés pour transmettre des informations
entre différentes scènes. Dans cette leçon, nous allons ajouter musique de
fond qui peut changer à chaque scène du jeu. Pour cette leçon, j'utiliserai pack de musique de
Barn créé par Eric the Funny Barn
sur Itch point IO. Quelle que soit la musique de fond que vous choisissez d'utiliser pour votre jeu, assurez-vous qu'elle est
conçue pour fonctionner en boucle. Les fichiers audio étant
généralement très volumineux, je vous recommande de ne les
importer dans votre projet que lorsque vous
décidez de les implémenter. Une fois que vous les avez importés et triés dans un dossier musical, sélectionnez-en un et passez du
panneau d'arnaque au panneau d'importation. Il se peut que vous deviez modifier
les paramètres d'importation de
vos fichiers audio pour qu'ils puissent démarrer en boucle. Selon le type de fichier, le paramètre de boucle
peut être une case à cocher ou une liste déroulante contenant
plusieurs options Dans ce cas, vous souhaiterez le
remplacer par une boucle linéaire. Commençons par ouvrir la scène de titre et
y ajouter un nouveau nœud. Sur le nœud du lecteur de flux audio. Assurez-vous de ne pas utiliser les variantes à
deux ou trois D, car elles sont destinées à simuler sons
auditifs dans un espace à deux
ou trois D. Le nœud normal du
lecteur de flux audio ne sera pas affecté par la proximité ou par
tout autre élément de la scène, et diffusez simplement le son tel quel. Nous pouvons définir la propriété du
flux audio dans l'inspecteur sur l'une
de nos chansons importées. Si vous examinez les propriétés des
notes du lecteur de flux
audio dans l'inspecteur, vous remarquerez que le volume
est mesuré en décibels, à flot avec une valeur par défaut de zéro comprise entre moins 80 et 24
. Il est important de
noter que ce chiffre n'est pas exagéré. Augmenter de 1 décibels à 2 décibels n'est pas deux fois plus fort Mais ne vous inquiétez pas si vous
ne comprenez pas comment fonctionnent
les décibels, car nous
ne les utiliserons pas Nous pouvons indiquer au nœud du lecteur de
flux audio de se lancer automatiquement lorsque
le jeu démarre lancez le jeu, la musique
démarre à plein volume, et lorsque nous passons à la scène du jeu, elle
s'arrête soudainement. En combinant ce que nous avons appris
dans les deux leçons précédentes, nous pouvons créer un lecteur audio
persistant pour écouter de la musique de fond,
et également faire disparaître la musique
de manière fluide. Comme la musique de fond est souvent présente dans chaque scène dans les jeux
, il serait logique qu'il y
ait un nœud chargé automatiquement qui puisse rester
en
permanence dans l'arborescence des scènes pour la gérer. Nous pouvons donc supprimer le nœud du
lecteur audiotrem dans notre arborescence de scènes Et créez un nouveau script
dans le dossier Auto Lodes. Appelons ça de la musique. Ce nœud
chargé automatiquement peut hériter du lecteur
de flux audio, donnant au nœud musical l'accès à toutes les propriétés
et méthodes d'
un nœud de lecteur de flux audio Comme nous ne pouvons pas accéder
aux propriétés d' un nœud chargé automatiquement
dans l'inspecteur, nous devrons définir ses valeurs de propriétés
par défaut dans la fonction de préparation des scripts. J'aimerais que le volume commence
à sa valeur la plus basse possible, soit moins 80 décibels Mais nous pouvons également utiliser le
volume linéaire si nous le voulons, ce qui est plus facile à comprendre pour la plupart des
gens. À l'aide d'une fonction intégrée,
linéaire en dB,
abréviation de décibels, qui convertira une
échelle linéaire en échelle de décibels, nous
permettant de régler le volume
à zéro en termes linéaires, ce qui signifie qu' Si vous souhaitez que la musique soit également jouée pendant que le jeu est en pause, nous devrons modifier le mode de
traitement de ce nœud En utilisant les suggestions,
nous pouvons toujours le
définir sur node, point, process. Merci D'accord. En réfléchissant d'abord à la manière dont nous voudrions que
ce nœud soit utilisé, nous n'avons probablement besoin que de
deux fonctions publiques. Un pour écouter un morceau de musique
et un autre pour le faire disparaître. piste de lecture prendra une piste comme paramètre de
type flux audio. Alors que le fondu ne
nécessite aucun paramètre. Dans la fonction Play track, nous pouvons accéder à toutes les propriétés héritées du nœud du lecteur de
flux audio, y compris le flux en cours de lecture,
dont
la valeur par défaut
est null. Nous pouvons définir la valeur du stream en fonction de la piste que
nous voulons jouer. Dites ensuite au lecteur de
flux audio de jouer. Mais le volume est
actuellement inaudible. Utilisons un tween
comme nous l'avons fait avec le fondu visuel pour
ajuster progressivement le volume au fil du temps, en déclarant une nouvelle variable d'interpolation en
haut du script Nous allons d'abord vérifier si le
préadolescent existe déjà, et s'il existe, vérifier s'il est déjà en cours d'exécution Et si c'est le cas, tuez-le. Nous pouvons ensuite créer un nouveau
tween. Et entre deux propriétés. Accès à ce nœud lui-même, la propriété du volume, en le
transformant progressivement en
point de fichier définissant
le volume des points sur une durée d'une seconde. Mais n'oubliez pas que le volume
n'évolue pas de façon linéaire, puisqu'il est mesuré
en décibels Au lieu d'interpoler directement la propriété
du volume, nous pouvons également interpoler une méthode La méthode Tween ne
nécessite pas de référence à un nœud, nous pouvons
donc supprimer
le premier argument Le chemin de propriété est
désormais une méthode appelable. Écrivons une fonction
appelée set linear volume, qui prend un paramètre flottant
du volume linéaire. Cette fonction définira la propriété
du volume après l'avoir convertie de
linéaire en décibels Nous pouvons l'utiliser dans notre
fonction prête à l'emploi pour des raisons de cohérence. Et utilisez-la également comme méthode appelable dans
l'appel de la méthode d'interpolation Notez que lorsque vous utilisez
une méthode en tant que câble, elle n'a pas de
crochets à son extrémité. La méthode a également besoin non
seulement d'une valeur finale, mais également d'une valeur de départ, car ce n'est plus une propriété
du nœud. Il n'a aucun moyen de
connaître la valeur actuelle. Les valeurs de début et de fin sont en fait un
argument qui
sera transmis à la
méthode appelable, le volume linéaire En utilisant la fonction
intégrée opposée, nous pouvons convertir les décibels en décibels linéaires
pour transformer le volume de décibels actuel en volume linéaire
comme valeur
de Nous pouvons spécifier que
le volume linéaire de notre musique sera
interpolé, quel que soit le volume actuel, jusqu'à que le
volume soit réglé sur une seconde Renvoyons également le signal de fin de l'
interpolation. Ensuite, la fonction Fade Out
voudra faire exactement le
contraire. Tweeter le volume linéaire à
partir de zéro. Attendre la fin
de l'interpolation, arrêter la lecture du nœud et remettre la
piste sur zéro Comme nous l'avons fait avec la couleur Fade, nous pouvons les combiner en
une seule fonction privée. Disons que c'est du volume. En prenant uniquement le
volume linéaire cible comme paramètre. Faire alterner le
volume de son emplacement actuel vers le volume cible pendant une seconde Et maintenant, les fonctions d'entrée et disparition utilisent la
même fonction Ouvrez les paramètres du projet, passez à l'onglet de chargement automatique. Nous pouvons ajouter le script musical à la liste des nœuds chargés
automatiquement. Dans le script du gestionnaire de scène, nous pouvons exporter une variable pour contenir la
piste de musique de fond de chaque scène, car chaque
gestionnaire de scène héritera la variable et pourra
lui attribuer sa propre valeur Notre
script Scene Manager peut désormais
accéder facilement au
nœud de chargement automatique de musique en utilisant son nom de nœud, indiquant au nœud musical jouer le
morceau souhaité pour cette scène. Attribuons une piste musicale
différente pour chaque titre
et chaque scène de jeu. Et assurez-vous également de faire disparaître la musique chaque fois que
nous changeons de scène. Essayons-le. La musique de la
scène titre s'estompe, l'
appui sur le nouveau
bouton de jeu fait disparaître la musique et la scène de jeu réintègre
sa propre musique faites une pause et que vous appuyez sur
exit, la musique s'éteint et la
musique du titre s'estompe Cela fonctionne bien tant que nous ne
jouons qu'
un seul morceau de musique par scène et que nous nous efforçons de toujours estomper avant de
demander un nouveau Mais que se passerait-il si nous
voulions demander au nœud musical de jouer un morceau différent alors qu'il joue
déjà ou
même le même morceau ? Ce serait une bonne idée d'ajouter des conditions supplémentaires à
la fonction Play Track. Commençons par vérifier si le nœud musical fonctionne
déjà. Ensuite, vérifiez également si
ce que le nœud
joue est le même que
ce à quoi nous voulons jouer. Si tel est le cas,
nous n'avons pas besoin de modifier le stream
ou de lui demander de jouer. Nous pouvons simplement renvoyer le signal de fin de l'
interpolation qui est renvoyé en diminuant le
volume Si une autre piste
est déjà en cours de lecture, nous devons effacer cette piste avant de passer à celle-ci. Attendez que le jumeau soit terminé, puis passez au
reste de cette fonction. Notez que cela va
désormais effectuer deux exécutions de fad volume, chacune d'une durée d'une seconde Il faudra donc 2 secondes pour
changer de piste. Rendons cela plus flexible en exportant la durée
comme nous l'avons fait avec le FAD et en lui attribuant une valeur
par défaut de 1 seconde Permettez ensuite aux fonctions play track et fade out
d'accepter un
paramètre de durée facultatif avec valeur par défaut de la variable
exportée. Transmission du paramètre de durée à la fonction de volume du fondu. Nous pouvons l'utiliser dans l'appel de la
méthode tween en tant qu'argument. on regarde les scripts du jeu
et du gestionnaire de titres, O sur le nouveau jeu et sur Si l'on regarde les scripts du jeu
et du gestionnaire de titres, les fonctions
O sur le nouveau jeu et sur
la touche de sortie sont assez similaires maintenant. Écrivons une méthode
héritée pour changer de
scène dans notre script Scene Manager. Scènes de changement nommées. Nous pouvons dire à la
musique de s'estomper. Attendez que le fondu
passe au noir,
remettez le jeu en pause
s'il est suspendu, puis changez la scène
de l'arbre en fichier Transmettre le
chemin du fichier en argument. Afin d'obtenir les
résultats escomptés, nous devrons nous assurer
que le signal attendu est celui dont la durée est
la plus longue. La déclaration d'attente doit également être la dernière si nous voulons que tous les préadolescents se
produisent en parallèle Si, pour une raison quelconque, vous
devez réorganiser l'ordre de ces instructions afin
que le signal
attendu ne soit pas celui renvoyé,
vous pouvez également le stocker dans une variable et l'attendre
sur une autre ligne Désormais, le gestionnaire de titres
peut faire tout cela en
appelant sa méthode de scène de
changement héritée, en passant le
chemin des scènes de jeu comme argument. De même, le gestionnaire de jeu peut également le
faire en modifiant la scène du titre. N'oubliez pas non plus que les
sous-classes peuvent toujours remplacer ces comportements si vous souhaitez qu' une scène spécifique se
comporte différemment Nous avons maintenant une
musique de fond qui s'
intègre et s'éteint en douceur à
chaque scène de notre jeu Dans la leçon suivante, nous ajouterons un menu de paramètres permettant de
modifier les paramètres du jeu. Je te verrai dans la prochaine leçon.
7. Paramètres: Bonjour, mes amis. Dans
la leçon précédente, nous avons ajouté une musique de fond
qui s'estompe doucement Dans cette leçon, nous allons ajouter un menu de
paramètres à notre jeu. Commençons par la scène titre. Contrairement aux boutons et aux
menus que nous avons créés jusqu'à présent, qui flottent juste
devant tout, je préférerais que les paramètres
du jeu soient intégrés dans un panneau. Il existe deux notes
de contrôle différentes que nous pouvons ajouter à notre scène, qui
se comportent différemment. Un panneau n'est qu'une
fenêtre de base que nous pouvons redimensionner à notre guise et réorganiser ses enfants de n'importe quelle
manière Un conteneur de panneaux se
redimensionnera automatiquement pour
encapsuler ses enfants, comme un conteneur horizontal ou
vertical. Les deux présentent des avantages
et des inconvénients. J'aime utiliser un conteneur de panneaux pour économiser le
temps et les efforts liés au
dimensionnement et à la réorganisation des nœuds
enfants pendant que je développe
mon interface utilisateur Mais je pourrais passer
à un panneau si je souhaite plus de flexibilité lorsqu'il s'agit peaufiner le projet final. Puisque notre classe de paramètres
contient des variables booléennes. Nous pouvons ajouter une case à cocher ou un bouton à cocher
pour chaque variable, permettant au joueur de définir sa valeur sur vrai
ou faux en conséquence. Ajoutons-en un pour l'inversion de caméra x et un autre pour l'inversion de caméra Je vais en ajouter un de chaque,
afin de voir à quoi ils ressemblent et de décider
lequel je préfère plus tard. Le réglage du volume
est une variable flottante, qui est souvent contrôlée
dans les menus par un curseur Étant donné qu'un curseur
impose intrinsèquement une valeur minimale
et maximale Chacun de ces paramètres
aura également besoin d' un nœud d'étiquette pour indiquer au
joueur à quoi il sert. Tout comme nous avons utilisé des conteneurs horizontaux et verticaux pour organiser automatiquement les nœuds. Nous pouvons également utiliser un conteneur de
grille pour organiser
automatiquement les
nœuds selon un schéma de grille. La seule propriété des nœuds de la grille est le nombre de
colonnes de la grille. Les lignes sont automatiquement
ajoutées et supprimées du conteneur de la grille
en fonction du nombre d'enfants qu'il contient. En réglant ce paramètre sur deux, nous
pouvons facilement organiser tous les nœuds d' étiquette dans
la colonne de gauche et les
nœuds de contrôle interactifs sur le côté droit Le conteneur quadrillé compressera tous ses enfants
autant que possible. Mais nous pouvons spécifier des
tailles minimales pour chacun d'entre eux. Je vais donner au curseur de volume une valeur x minimale de 100 pixels, ce qui force la colonne de droite du conteneur de la grille à s'étendre Maintenant, je pense que
les cases à cocher
seraient mieux centrées
dans la colonne. En élargissant la section de mise en page et la sous-section sur
le dimensionnement des conteneurs, je vais définir la
valeur horizontale pour réduire le centre La case à cocher est maintenant centrée horizontalement dans la colonne. Et je vais faire de même
pour le bouton de vérification. Maintenant que nous pouvons voir notre curseur, examinons ses
propriétés dans l'inspecteur Nous pouvons définir ses valeurs minimale
et maximale, ainsi que la valeur du pas, qui est une distance entre les valeurs sur lesquelles le
curseur peut être réglé En utilisant nos réglages de
volume linéaires, la valeur minimale
doit être zéro. Une valeur maximale de
un est acceptable, car une linéaire
équivaut à 0 décibels Mais nous pouvons également autoriser le
volume à dépasser ce seuil. Puisque nous savons que la valeur
maximale en décibels du
nœud
du lecteur de flux audio est de 24 décibels Nous pouvons en fait taper des
fonctions intégrées dans ce champ, utilisant db pour linéaire, passant 24, nous obtenons 15,849 est
la valeur maximale réelle Mais cela peut entraîner une
diminution de la qualité audio. Le réglage du volume
linéaire maximal à un convient dans la plupart des cas. Quelque chose d'aussi fluide que le volume peut généralement être ajusté
dans une très faible mesure. Comme mon curseur mesure 100 pixels, je vais régler sa valeur d'étape 0,01, chaque pixel représentant
une variation de volume de 1 % Nous aurons également besoin d'une
étiquette de titre pour ce menu. Et un bouton qui le ferme. Mais ils n'ont pas leur place
dans le réseau. Nous pouvons trier le conteneur de la
grille de titre et le bouton de
fermeture à l'intérieur d'un conteneur
vertical. L'étiquette de titre et le bouton
fermé sont étirés pour s'adapter à la même
largeur que le conteneur de la grille. Je vais centrer le titre en utilisant
sa propriété d'alignement. Le bouton peut être réglé pour rétrécir commencer à le placer dans le coin
inférieur gauche. Rétrécissez le centre pour le centrer ou rétrécissez l'extrémité pour le placer
dans le coin inférieur droit. Si vous ne voulez pas
utiliser ces conteneurs ou si vous les trouvez trop restrictifs, vous pouvez toujours utiliser un panneau
normal et un manuel nous
positionnons chacun des nœuds enfants pour obtenir la disposition que vous souhaitez. Nous pouvons réutiliser la ressource du thème pour notre
menu des paramètres si nous le voulons, mais vous pouvez utiliser
différents styles de boutons pour différentes parties
de votre jeu. Dans ce cas, vous pouvez facilement
créer une nouvelle ressource thématique. Je vais simplement ajouter un
paramètre de conteneur de panneaux aux paramètres existants. Remplacez sa
boîte de style par une texture. Et donnez-lui des
marges de contenu de 16 pixels. Les cases à cocher héritent de
leur style du bouton Nous pouvons
donc remplacer cela en
ajoutant une case à cocher au thème et en remplaçant
toutes ses cases de style Je vais juste utiliser des boîtes de style vides. Répétez ensuite le processus
pour le bouton de vérification. OK. Je pense que le titre devrait avoir une
taille de police plus grande que les autres étiquettes. Je vais modifier sa taille de police
dans la section de remplacement du thème. Maintenant que j'ai vu à
la fois la case à cocher et le bouton à cocher, je peux les comparer
dans le contexte du menu Je pense que je préfère
la case à cocher et je vais
inverser la caméra en y pour qu'elle corresponde. Une fois le menu créé,
ancrons-le au
centre de l'écran. Nous avons déjà écrit
un script de menu qui gère l'affichage et le masquage d'un nœud de contrôle et qui peut également permettre de se concentrer sur l'ouverture
d'un menu. Attachons-le au nœud
du menu des paramètres. Et réglez son
élément de mise au point par défaut sur le premier élément de menu, la case à cocher Camera Invert X Mais pour connecter les signaux de
commande à notre script, il faudra qu'il s'agisse
d'un script
différent de ceux utilisés
par les autres menus. Nous pouvons donner un nom de classe au
manuscrit , puis créer un nouveau script dans le dossier des scripts de l'interface utilisateur, en
héritant du menu Appelons-le menu des paramètres. En faisant glisser ce script vers
le nœud du menu des paramètres, il remplace le manuscrit Mais nous devrons remplir à nouveau l'élément
de focus par défaut. Dans notre nouveau script, nous
devrons initialiser chacun de
nos nœuds de contrôle pour
qu'
il corresponde aux valeurs déjà présentes dans
la ressource de paramètres Nous devrons donc récupérer les
références à chacun de nos nœuds de contrôle
en utilisant At on ready. Ensuite, dans la fonction Ready, nous pouvons définir les valeurs de la variable correspondante dans
la ressource de paramètres de fichier. Avec nos commandes de réglage triées dans le menu
et initialisées. Nous pouvons maintenant connecter les signaux de chaque nœud de contrôle au manuscrit des
paramètres. Appel d'une fonction chaque fois qu'un paramètre a été
modifié par le joueur. Les nœuds de case à cocher et de
bouton à cocher relieront
le signal activé et nous
indiqueront s'il est
défini sur vrai ou faux Et le curseur connectera
le signal à valeur modifiée, nous
donnant la nouvelle valeur sur laquelle
il vient d'être réglé Nous pouvons définir les valeurs
des variables dans les paramètres par points de
notre fichier
pour qu'elles correspondent à toutes les valeurs
modifiées à l'aide des nœuds de contrôle. Étant donné que les
commandes de l'appareil photo lisent directement les paramètres pour
déterminer son fonctionnement. Aucune autre action n' est nécessaire pour que ces
paramètres fonctionnent. Mais le réglage du volume
n'
affectera pas automatiquement le
nœud musical. Nous devrons régler
le volume manuellement. Lorsque le réglage du volume change, nous pouvons appeler volume linéaire transmettant une nouvelle valeur
comme argument. Exécutons cette scène
et essayons de régler le volume pour constater immédiatement
la différence lorsque vous écoutez de la musique. Une partie terminée comportera probablement
plus de nœuds audio, chacun ayant son propre réglage de
volume. Il se peut que nous ne
souhaitions pas tous les ajuster individuellement depuis
le menu des paramètres. Pour anticiper ce besoin, nous pouvons émettre un
signal ici pour indiquer à l'ensemble de la scène que le réglage du volume
a été modifié. Ensuite, tout nœud qui
écoute l' de
ce
signal peut y réagir. En haut du script, nous pouvons déclarer des signaux de la
même manière que nous déclarons des variables, en utilisant le mot clé signal. Passons au nom du volume. Il est courant de nommer
les signaux au passé, indiquant ce qui s'est passé auquel les autres scripts
devraient réagir. Comme pour une fonction,
nous pouvons ajouter des crochets à la fin de la déclaration du
signal pour y ajouter des paramètres. Nous pouvons non seulement indiquer que
le volume a été modifié, mais également émettre la nouvelle valeur de
volume sous forme de valeur flottante. Lors de la connexion de ce
signal à une fonction, la fonction réceptrice
doit accepter un paramètre flottant
correspondant au signal. Ensuite, connectons le signal appuyé sur les boutons
fermés à la
méthode fermée des classes de menu pour fermer le menu. La plupart des jeux permettent de modifier les paramètres du
titre et des scènes de jeu. Enregistrez la
branche du menu des paramètres en tant que scène à part entière. Copiez ensuite le
nœud du menu des paramètres et collez-le dans
les scènes de jeu. C'est toujours une bonne
idée de m'assurer que le nœud
de fondu se trouve avant tout le reste Je vais
donc trier le menu des
paramètres au-dessus celui-ci et définir sa
propriété visible de false. Nous pouvons facilement ajouter un
bouton de réglage au menu de pause. Comme les deux scènes disposent menu de paramètres, un
peu comme le Fade, nous pouvons exporter une variable depuis
le script du gestionnaire de scènes, afin que le gestionnaire de titres
et le gestionnaire de gain puissent l'utiliser. Et dans les deux scènes,
le menu des paramètres est accessible depuis un autre menu. Soit le menu
principal des scènes de titre , soit le menu de pause
des scènes de jeu. Nous pouvons créer une implémentation très simple de
Breadcrumbs dans notre manuscrit.
Ainsi, chaque fois qu'un menu est
ouvert à partir d'un autre menu, fermer revient automatiquement
au menu précédent Dans notre manuscrit, nous pouvons
déclarer une autre variable. Appelons-le underscore
Breadcrumb de type menu. Ajoutez ensuite un
paramètre facultatif à la fonction d'ouverture également
appelée Breadcrumb Si le fil de navigation est autre chose que nul lorsque le
menu est ouvert, nous devons l'
enregistrer dans la variable et fermer ce menu
avant d'ouvrir celui-ci Ensuite, lorsque le menu est fermé, si le fil de navigation n'est pas nul, ce menu doit être ouvert
après la fermeture de celui-ci, puis il peut être remis à Les scripts du gestionnaire de titres et du gestionnaire de jeu peuvent
désormais ouvrir le menu des paramètres, en passant les boutons du menu ou le menu
pause en guise de miette de pain Ouverture de la scène du menu des paramètres. Assurons-nous que l'élément de focus
par défaut est défini et que ces nœuds
fonctionneront toujours même
lorsque le jeu est en pause. Essayons de lancer le jeu. Modification des paramètres du jeu et passage à la scène de jeu. Les
commandes de volume et de caméra restent modifiées, et nous pouvons les modifier
à nouveau depuis le menu de pause. Nous avons maintenant un
menu de paramètres qui permet de modifier le volume et les
commandes de l'appareil photo en temps réel. Dans la leçon suivante, nous allons
ajouter des événements de transition pour déplacer notre personnage
entre les différents niveaux. Je te verrai dans la prochaine leçon.
8. Quitter: Bonjour, mes amis. Dans
la leçon précédente, nous avons ajouté un menu de paramètres. Dans cette leçon, nous allons détecter le
moment où le joueur franchit une porte et nous préparer à passer à un
autre niveau Commençons par le
niveau
actuellement chargé
dans la scène de jeu. Pour moi, c'est une chambre trois. Deux portes
mènent à la sortie de cette pièce. Lorsque le joueur franchit
l'une de ces portes, il doit passer à un
autre niveau de mon jeu la même manière que le corps
de
notre personnage entre en collision avec le corps statique du
sol, nous pouvons détecter les collisions avec un espace
vide pour déclencher
un événement. Le nœud qui effectue cette opération est
appelé nœud de zone 3 D. Et tout comme un corps physique, il a besoin d'une
forme de collision avant de pouvoir fonctionner. Ajoutons un nœud en forme de collision en trois D et
faisons-en une forme de boîte. Pour l'adapter à la
taille de mes carreaux de sol, je vais le faire 4 mètres de
long, de large et de haut. Renommons le nœud de la zone 3
D en transition. Créez ensuite sa propre scène en
cliquant dessus et en la faisant glisser dans
le dossier des scènes de l'
onglet système de fichiers Ouvrez ensuite la nouvelle
scène de transition pour la modifier. J'aimerais que l'
origine des transitions repose clairement
sur le sol. Nous allons déplacer la
forme de collision vers le haut le long de l'axe y, la
moitié de sa hauteur de 4
mètres, soit 2 mètres. Afin de réagir aux
collisions avec le joueur, le nœud de transition
aura besoin d'un script. Créons un nouveau
script en cliquant sur l'icône de défilement. OK. Assurez-vous qu'il est enregistré
dans le dossier des scripts. Le nom par défaut et
l'héritage sont corrects. Le
nœud de la zone 3 D émet un tas de signaux
différents pour
réagir aux collisions. Puisque
le corps de notre personnage est considéré comme un corps physique et que nous voulons
réagir lorsque le personnage
entre dans cette zone, le signal que nous voulons
est le corps saisi La connexion de ce signal
au nœud de transition lui-même crée la fonction saisie sur
le
corps, qui accepte le corps entré dans cette zone comme paramètre
du nœud trois D. Nous pouvons voir les types de paramètres
dans la liste des signaux. Pour l'instant, imprimons simplement le corps
pour voir notre collision fonctionner. cours de scène de jeu,
en entrant dans la zone de transition, le
nom du corps du personnage en
trois notes en D est imprimé, mais également les noms des nœuds
corporels statiques de notre scène. Nous ne voulons pas que n'
importe quel corps physique entre dans cette zone pour
déclencher une réaction, mais uniquement le personnage du joueur. Nous pouvons vérifier si le corps
appartient à une certaine classe. Ou vérifiez le nom du nœud pour voir s'il s'agit du personnage du
joueur. Mais ces solutions
ne sont pas très flexibles. Une
méthode plus simple et plus propre consiste à s'assurer que seul le
personnage du joueur peut réellement
entrer en collision avec cette zone en
utilisant le masquage des collisions Tout d'abord, ouvrons la scène du
personnage et sélectionnons le nœud en trois D
du corps du personnage. En regardant sous les propriétés héritées de
l'objet de collision en trois D, développez la section de collision. Il y a
ici deux séries de nombres allant jusqu'à 32. Ce sont des couches de collision, que nous pouvons utiliser pour
contrôler quels objets de
notre jeu peuvent entrer en collision les
uns avec les autres et lesquels ne le peuvent pas Jusqu'à présent, dans notre jeu, tout existe dans le calque 1 par défaut et masque ou entre en collision uniquement
avec le calque 1 Puisque la couche 1 est la couche par défaut et que tout entre en collision
avec elle par défaut Faisons en sorte que la première couche
soit le terrain du jeu. la façon dont ces couches sont
affichées par blocs de huit, j'aime considérer chaque bloc comme des couches
regroupées. Les huit premières couches
de mon jeu peuvent être réservées aux couches du monde
ou de l'environnement. Notre personnage peut exister sur
une couche unique différente. Utilisons la couche
neuf comme exemple. Ainsi, l'intégralité du
deuxième bloc de couches peut être réservée aux
couches de collision liées au joueur. ouvrant les paramètres du projet,
dans l'onglet général, sous les noms des couches, nous
pouvons modifier le nom de chacune de ces 32 couches qui existent pour la physique des trois D. Je nommerai la couche 1 terrain
et la couche 9 joueurs. Passez le curseur sur les couches dans l'inspecteur pour
afficher leur nom Dans la scène de transition, étant donné que rien n'a besoin
de
détecter ou d'entrer en collision avec notre zone, il n'est en fait pas
nécessaire qu'elle existe sur aucune couche N'hésitez pas à mettre de côté une couche de collision pour les transitions
si cela vous aide. La transition
n'a besoin que d' un masque de collision pour détecter
les collisions avec le joueur. Désactiver la première couche et masquer
uniquement la couche
neuf, le joueur Nous pouvons renforcer
cela en modifiant les propriétés du nœud en trois D de la
zone, lui demandant de surveiller pour
d'autres corps physiques, mais de ne pas être surveillable
par d'autres organismes physiques Maintenant, la seule façon dont cette zone
3D peut déclencher une collision est de détecter un corps physique sur la couche neuf. Il ne recherchera
aucune autre couche et sera invisible
pour tout le reste. La zone de transition
peut être positionnée de manière à couvrir l'espace vide
au-delà de la porte, empêchant ainsi le personnage
du joueur de sortir de
cette pièce sans
entrer en collision avec elle personnage
du joueur de sortir de cette pièce sans
entrer en collision avec J'ouvre toutes mes scènes de
différents niveaux. Je peux voir que cette transition est destinée à se connecter à la première chambre. Appelons-le donc deux pièces une. La duplication du nœud
renommera automatiquement le doublon
en deux pièces, et je pourrai le repositionner sur l'autre
porte T Bien que mes petits niveaux ne
comportent chacun que deux transitions. Vous pouvez imaginer comment un grand niveau complexe peut contenir de nombreux autres dont il
est difficile de suivre l'évolution. Nous devons donc regrouper ces nœuds pour les trier
dans l'arbre des scènes. Ajoutons un nouveau nœud, juste un nœud normal, et nommons-le transitions. Reliez-y ensuite les nœuds de
transition. Cela les rendra
plus faciles à trouver et utiliser, non seulement dans notre
arbre de scènes sous l'éditeur,
mais également dans nos scripts ultérieurement. Nous pouvons copier et coller
ces nœuds dans nos scènes de niveau et les repositionner pour couvrir toutes
les portes Renommez-les pour que nous
sachions où ils mènent. ouvrant le script de progression, nous pouvons modifier les variables
ou en ajouter de nouvelles pour enregistrer le nom du niveau se trouve actuellement
le joueur
sous forme de chaîne. Je vais l'initialiser
pour qu'il s'agisse de la première chambre. Pour que cette méthode
fonctionne,
la valeur de cette
variable doit correspondre l'orthographe exacte
du nom de scène du niveau
dans l'onglet du système de fichiers. Dans le script de transition. Nous pouvons ensuite définir cette variable au fur et à mesure que le joueur passe d'un niveau
à l'autre. Exportons une variable
pour contenir le nom
du niveau auquel cette transition
mène sous forme de chaîne. Ensuite, lorsque le
corps du personnage entre dans cette zone, nous pouvons définir la valeur du niveau du
point de progression des points du fichier. Ce sera le
nom du niveau. Ensuite, nous allons demander au game manager
de passer à ce niveau. Comme nous l'avons fait dans le script du
joueur, nous pouvons toujours accéder au nœud racine des
scènes en commençant
le chemin du nœud par le symbole
dollar, puis en accédant au
gestionnaire de jeu avec le jeu Disons simplement au
game manager d'appeler une fonction que nous n'avons pas
encore écrite, nommée Load level. Le nom du niveau étant déjà enregistré dans la ressource de
progression, il n'est pas nécessaire de le transmettre
en argument. Comme
nous essayons d'accéder
au gestionnaire de jeu uniquement dans cette instance
unique,
il n'est pas nécessaire de le stocker dans une variable ou d'utiliser Add on Ready. D'autant que logiquement, un
seul événement de transition peut éventuellement se produire par niveau
chargé dans le jeu Ainsi, chaque transition déclarant
la variable et accédant
au gestionnaire de jeu alors qu'une seule personne en a réellement besoin
serait plus inutile. Dans le script du gestionnaire de jeu, prenons d'abord une référence
au niveau qui
existe déjà dans la scène. Nous pouvons cliquer et
faire glisser le nœud dans le script pour
générer automatiquement son chemin de nœud, ou même maintenir la touche Ctrl
ou Commande enfoncée tout en relâchant le bouton de la souris pour
le stocker
automatiquement dans une variable. Je vais renommer la variable
au niveau actuel. Déclarez ensuite la fonction de niveau de
charge que nous avons appelée à partir du script de
transition. abord, nous devons savoir si un niveau est déjà chargé en vérifiant si cette variable contient une valeur
ou si elle est nulle. S'il contient une valeur, nous devons d'abord
attendre f to black. Nous pouvons ensuite décharger le niveau
actuel de notre scène de jeu à l'aide de la fonction
intégrée Q. Nous allons surcharger la
scène suivante dans la prochaine leçon Pour l'instant, attendons que
Fate s'en débarrasse et essayons-le. Si le joueur
franchit la porte, la scène passe au noir Le niveau actuel est supprimé
de l'arborescence des scènes, puis nous revenons
en arrière pour voir notre personnage et tomber en chute libre puisqu'il n'
y a plus de niveau. Notre panneau de débogage nous
donne deux avertissements. Nous avons déclaré une variable qui n'
a jamais été utilisée dans le script, et notre fonction de collision contient un paramètre
inutilisé . Nous pouvons préfixer les
paramètres inutilisés par
un trait de soulignement
pour les signaler au moteur afin
qu'ils puissent être ignorés Lorsque vous passez au script de
transition, le paramètre body n'
est plus utilisé. Nous pouvons ajouter le préfixe
au nom de
la variable pour
répondre à cet avertissement Dans le script Scene Manager. Nous avons déclaré la variable settings manu dans ce script, mais elle n'est pas utilisée
dans ce script Nous l'avons fait exprès car la variable settings
many est héritée et utilisée par tous les héritiers
de cette classe Nous n'avons aucune intention
d'
utiliser directement le
script du gestionnaire de scènes, mais nous l'utilisons pour contenir toutes les propriétés et
comportements similaires d'un groupe
de scripts connexes. Dans d'autres langages,
cela s'
appellerait une classe abstraite. Ce modèle d'utilisation de l'
héritage de cette manière est connu sous le nom d'abstraction dans
la programmation orientée objet. Nous pouvons choisir d'
ignorer un avertissement en ajoutant une autre ligne avant la ligne qui déclenche l'avertissement en utilisant
at warning ignore. Spécifiez ensuite l'avertissement
que vous souhaitez ignorer. Dans ce cas, nous avons déclaré une variable privée non utilisée. Les deux
avertissements de débogage ayant été
corrigés, le lancement du jeu ne présentera
plus aucun avertissement Nous avons maintenant le
niveau actuel qui se décharge lorsque le joueur
entre dans une porte Dans la leçon suivante, nous allons
charger le niveau suivant et positionner le joueur
dans la
porte correspondante de l'autre côté Je te verrai dans la prochaine leçon.
9. Entrer: Bonjour, mes amis. Dans
la leçon précédente, le joueur sortait
du niveau par une porte Dans cette leçon, nous allons charger le niveau suivant et y positionner
le joueur. Avant de charger le niveau suivant, nous avons d'abord
vérifié s'il existe un niveau actuel et, dans l'
affirmative, nous sommes en train de le décharger Nous pouvons ensuite attribuer
une nouvelle valeur à la variable de niveau actuelle
puisqu'elle est désormais vide. À l'aide d'une fonction intégrée de chargement, nous pouvons charger n'importe quelle ressource
depuis l'onglet de notre système de fichiers, y compris des scènes, en spécifiant
un chemin de fichier sous forme de chaîne. Pour
mieux organiser nos scènes, créons un sous-dossier dans
le dossier des scènes nommé levels. Placez ensuite chacun des
niveaux du jeu dans ce dossier. En sélectionnant
l'une des scènes de niveau, nous pouvons cliquer et faire glisser
le curseur dans les crochets des fonctions
de chargement pour y indiquer
le chemin du fichier Comme tous les niveaux de nos jeux se
trouvent dans le dossier des
niveaux et qu'ils se terminent tous par
l'extension TSCN point, nous pouvons séparer ces
parties de la chaîne à l' aide de l'
opérateur Ajouter, le Remplacez ensuite le nom
de la scène de niveau par ceux enregistrés dans
la ressource de progression. La fonction de chargement
renvoie une ressource. Mais la
variable de niveau actuelle est un nœud trois d. Nous devons d'abord appeler une fonction sur
la ressource pour la transformer en nœud, point instanciée Ajoutez-le ensuite à l'arbre
des scènes avec la fonction add child. Comme il s'agit du
script du gestionnaire jeu
attaché au nœud racine
des scènes de jeu, le nœud de niveau sera ajouté
en tant qu'enfant du nœud de jeu. Mais qu'en est-il lorsque
le jeu commence pour la première fois ? Ou si le joueur
charge un fichier sécurisé ? Nous pouvons commencer notre scène de jeu
sans nœud de niveau. En supprimant le nœud
de niveau de la scène de jeu, nous pouvons supprimer le module
prêt à être ajouté de la variable de
niveau actuelle. Remplaçons immédiatement la
fonction Ready héritée de Scene Manager et appelons le niveau de
charge Avant d'exécuter la
définition de superclasse depuis Scene Manager Cela nous permettra de charger
n'importe quel niveau de notre jeu,
simplement en définissant
son nom de fichier dans la ressource de progression
et en appelant le niveau de chargement. Il passera facilement d'un niveau à
l'autre en passant abord au noir et en
déchargeant la scène en cours, puis en chargeant le
niveau suivant et Si c'est la
première fois qu'un niveau est chargé et qu'il n'y a
aucun niveau en cours, il sautera cette étape et chargera
immédiatement le niveau. Mais nous devrons positionner le joueur dans
le nouveau niveau et assurer
que la position est liée au chemin par lequel il est
entré dans le niveau. Commençons par la scène de
transition, en ajoutant un nouveau nœud qui
ne fait que marquer une
position dans un espace en trois D, un nœud marqueur en trois D. La seule différence entre
un nœud en trois D et
un nœud en trois D est
que le marqueur
dessinera un Gizmo et que l'éditeur
indiquera où il se trouve Renommons l'entrée de ce nœud
et déplacons-la vers l'avant
le long de l'axe Z, manière à ce qu'elle se trouve en dehors du nœud de
zone et suffisamment
éloignée pour que le personnage
du joueur n'entre pas en collision avec la Dans le script de transition, nous pouvons le faire glisser
et maintenir la touche Ctrl ou Commande enfoncée pour l'ajouter en tant que
variable sans être prêt. C'est à cette
position que le joueur sera introduit dans le niveau lorsqu'il entrera par
cette transition Dans nos scènes de niveau, nous pouvons faire pivoter n'importe laquelle de nos
transitions pour pointer l'axe Z et le marqueur d'
entrée vers un endroit approprié
dans le niveau. Si, pour une raison quelconque,
vous devez déplacer un marqueur d'entrée individuel sans affecter les
autres transitions, vous pouvez toujours cliquer avec le bouton droit sur un nœud de transition et activer les
enfants modifiables Cela vous permettra de déplacer un marqueur d'entrée
spécifique pour tenir compte des obstacles ou des variations de
hauteur du sol, par exemple. Avant de savoir
comment positionner le joueur, nous aurons besoin des scènes de
niveau pour
suivre leurs transitions
avec le script. Ajoutons un nouveau script
au
nœud racine des niveaux nommé level dans
le dossier des scripts. Si nous faisons glisser le nœud de
transition, nous pouvons le stocker dans une
variable avec l'ajout prêt. Mais nous ne voulons pas de ce nœud. Nous voulons tous ses enfants. À l'aide d'une
fonction intégrée get children, nous allons stocker une liste
de tous les nœuds enfants de ce nœud de transition
dans un tableau de nœuds. L'ordre des nœuds
du tableau
sera le même que celui de l'arbre des scènes. Nous pouvons accéder au
contenu d'un tableau en
spécifiant un numéro d'index
commençant à zéro. Écrivons une fonction
dans notre script de niveau qui donne le numéro d'
index des transitions et renvoie les coordonnées où le
personnage du joueur doit être placé. Appelons-le get entry, en acceptant l'indice de transition
sous forme de paramètre entier. Et en renvoyant un vecteur trois, la position dans un espace
à trois D du caractère à placer. Nous pouvons accéder au tableau
des transitions en mettant le numéro d'
index entre crochets. Si le numéro d'index est zéro, cela
nous donnera le nœud supérieur, suivi de un, deux, etc. Ensuite, nous allons obtenir le marqueur
d'entrée à partir de la transition et obtenir la propriété
de position globale du
marqueur d'entrée à trois nœuds D. Puisque la position des notes
est relative à leur parent. Nous voulons connaître la position
globale telle qu'elle existe dans l'ensemble de la
scène, afin de pouvoir la restituer. Nous devrons joindre
le script de niveau à la note de base de
chaque niveau de notre jeu. Il est également
possible, cependant, peu probable que lorsque vous
chargez le niveau avant de
repositionner
le personnage, celui-ci se trouve déjà dans
une zone de transition Dans la scène de transition, nous devons désactiver la propriété
de surveillance par défaut. Ensuite, dans le script de niveau, lorsqu'un niveau est chargé et que le personnage est correctement
positionné, nous pouvons appeler une fonction pour
activer toutes les transitions. Une caractéristique très utile des
tableaux est notre capacité à itérer chacun de
leurs éléments à l'aide d'une boucle En commençant par le mot clé quatre, nous pouvons spécifier un alias que nous utiliserons dans la boucle pour faire référence à l'élément en cours. Suivi du mot clé in, puis du nom du
tableau et de deux points. Tout ce que nous mettons
dans le bloc de boucle s'
exécutera sur chaque
élément du tableau, et nous pouvons faire référence à l'
élément actuel en utilisant l'alias. Pour chaque transition
dans les transitions, nous pouvons définir sa propriété de
surveillance sur
true pour activer toutes les
transitions de ce niveau. Dans le script du gestionnaire de jeu, nous pouvons saisir une référence
au personnage du joueur. Ensuite, lorsqu'un niveau est chargé, nous pouvons positionner le joueur
à l'entrée du niveau. Utilisons zéro comme
argument pour le moment. Maintenant que le personnage
est positionné, nous pouvons activer toutes les
transitions du niveau, car nous savons que le personnage ne touche aucune d'entre elles. Enfin, nous devons
définir les valeurs de chaque transition dans chaque
niveau de l'inspecteur, afin que chaque transition sache à
quel niveau elle se connecte. cours de scène, le
jeu commence maintenant dans la première salle et le joueur est positionné
devant la porte L'enfant supérieur du nœud de
transition. En entrant par n'importe quelle porte, le niveau est déchargé et les scènes de jeu
sont au bon Mais quelle que soit la
porte que nous franchissons, le joueur est toujours placé devant la même porte Ajoutons une autre variable à la ressource de progression nommée
transition ID de type int. Ajoutez ensuite également cette variable au script
de transition exporté. Lorsque le personnage du joueur
entre dans cette transition, nous pouvons définir la valeur dans
la ressource de progression pour qu'elle
corresponde à la variable exportée. Et dans le script du gestionnaire de jeu, utilisez-le comme
argument pour sélectionner la transition dans laquelle le
joueur sera placé. En commençant par la salle 1, examinons la
transition vers la salle 2, qui possède désormais une variable d'ID de
transition avec une valeur de zéro. Il s'agira de l'indice
du nœud de transition qui revient sur la scène
depuis la salle deux. Nous pouvons voir que
la transition vers la première
chambre correspond au nœud enfant supérieur, dont l'indice est zéro. C'est donc correct. Je jette un coup d' œil à la transition de la
chambre deux à la chambre trois. Passons à la scène de la
chambre trois, et nous pouvons voir que
la transition de la salle trois à la salle
deux correspond à l'indice 1. Nous devrons donc changer
l'identifiant de transition de la salle
deux à la salle trois en un. Et les transitions quittant la salle trois devront également
être remplacées par une seule. Au cours de la scène de jeu, nous pouvons
désormais passer d'un niveau à l'
autre, dans le sens des aiguilles d'une montre ou dans le sens inverse des
aiguilles d'une montre,
et le joueur est
correctement positionné à chaque
fois et le joueur est
correctement positionné Si vos niveaux comportent
de nombreuses transitions, je vous recommande de définir
une convention pour votre jeu quant à la façon dont vous
organisez vos transitions, par exemple dans le sens des aiguilles d'une montre depuis le
nord Vous pouvez également remplacer le numéro d'index par une chaîne et organiser vos transitions dans un dictionnaire plutôt
que dans un tableau. J'aimerais également m'
assurer que le personnage
et la caméra sont
pointés à l' opposé de la transition laquelle le joueur
entre dans un niveau. Dans le script de niveau,
tout comme nous avons renvoyé la
position globale de l'entrée à partir d'une fonction, renvoyons également
la
rotation des transitions à partir d'une autre fonction. Désormais, le
script du gestionnaire de jeu peut accéder cette fonction pour déterminer dans
quelle direction ils
doivent se diriger. Nous pouvons transmettre ces informations
au script du joueur et utiliser pour faire pivoter à la
fois le personnage et le ressort qui
tient la caméra, appeler une fiction, transmettre la
rotation renvoyée comme argument. Collez la direction en acceptant
la rotation Y comme flottante. Vous pouvez facilement régler la rotation
des bras à ressort en conséquence. Mais le bras à ressort
doit être pivoté 180 degrés pour se trouver
derrière le personnage Puisque la rotation est
mesurée en radians, cela signifie
que nous pouvons
ajouter ou soustraire Pi cette valeur pour orienter la caméra dans la
bonne direction Nous pouvons ensuite transmettre
cette valeur de rotation le
long de la chaîne à
la classe de caractères. Et ajoutez une autre
fonction pour faire pivoter le plateau de personnages afin qu'il fasse immédiatement face à la direction souhaitée. Essayons-le. Même si nous positionnons le
personnage et la caméra à angles
étranges avant d'
entrer dans l'embrasure de la porte, ils seront tous deux orientés à la porte de l'autre
côté Cela aidera le joueur comprendre
d'où ils viennent. Le joueur peut désormais
passer d'un niveau à l'autre
de notre scène de jeu. Dans la leçon suivante, nous allons enregistrer et charger la progression
des joueurs. Je te verrai dans la prochaine leçon.
10. Enregistrer: Bonjour, mes amis. Dans
la leçon précédente, nous avons terminé notre processus de
transition de niveau. Dans cette leçon, nous allons enregistrer et charger la
progression des joueurs dans le jeu. Notre script de fichier comporte plusieurs
variables contenant des ressources
personnalisées que nous avons
utilisées pour suivre
les paramètres du jeu
ainsi que la progression des joueurs. Commençons par la ressource
de paramètres. Dans la fonction Ready, nous
créons une nouvelle ressource de
paramètres, mais nous ne devons le
faire que s'il
n'en existe pas déjà une que nous pouvons charger à la place. La condition I vérifiera d'abord si la ressource ceti existe, et si c'est le cas, chargez-la, sinon créez-en une nouvelle
et sauvegardez-la immédiatement. Cette ligne sera en fait le bloc else d'
une instruction IF. Godo nous permet de sauvegarder et de charger n'importe quelle ressource à l'aide des classes
Singleton Le chargeur de ressources
peut charger notre ressource appelant la méthode de chargement, en passant un
argument de chaîne, un chemin de fichier. Au lieu d'accéder à une
ressource de notre projet, nous voulons
cette fois charger quelque chose depuis le système de
l'utilisateur. Le chemin du fichier commence par
une barre oblique de deux points de l'utilisateur. Le moteur Godo utilisera
le raccourci pour trouver un
emplacement approprié sur n'importe quel système pour enregistrer et charger des fichiers
uniques à chaque utilisateur Nommons les
paramètres du fichier et donnons-lui une extension RS pour ressource. Cette fonction de chargement
renvoie une ressource que nous pouvons affecter à
notre variable de paramètres. Avant de charger les paramètres, nous pouvons exécuter une fonction
similaire pour vérifier d' abord si le fichier existe. Comme le chemin du fichier
est maintenant écrit deux fois, nous allons également
l'utiliser davantage, et c'est une valeur qui ne
devrait jamais changer. Je serais plus efficace de le
déclarer comme une constante. Si le
fichier de paramètres n'existe pas, nous pouvons le créer. Et enregistrez-le immédiatement à l'aide
de la classe d'économiseur de ressources, en appelant la méthode save La méthode de sauvegarde nécessite
une ressource à enregistrer, qui est notre ressource de paramètres, et le chemin du fichier dans lequel l'enregistrer, qui est le chemin des paramètres. Maintenant, lors de l'exécution du jeu, si les paramètres
existent pour l'utilisateur, ils seront chargés et sinon, ils seront créés. Mais nous devons également apporter quelques modifications au menu des paramètres. Tous nos paramètres doivent être définis sur les valeurs
qui ont été chargées, est-à-dire sur
la fonction « Prêt ». Nous avons défini la position initiale du
curseur du réglage
du volume à
l'aide des nombres enregistrés dans
la ressource de paramètres Mais nous devons également
régler le volume du nœud musical
et émettre le signal
ici, comme nous l' avons fait ci-dessous en réponse à la modification de la
valeur du curseur Lorsque le joueur ouvre
le menu des paramètres, ajuste certains paramètres,
il serait judicieux de
les enregistrer lorsque
le menu est fermé Nous pouvons remplacer notre méthode de fermeture
des classes de menu.
Ainsi, lorsque le
menu des paramètres sera fermé, nous indiquerons au fichier de se
charger automatiquement pour enregistrer les paramètres De retour dans le chargement automatique du fichier, nous pouvons ajouter la fonction
qui enregistre les paramètres. La ressource
de progression, en revanche, ne
sera pas gérée dans
la fonction Ready. Nous pouvons séparer chacune
de ces méthodes en fonctions publiques permettant d'accéder à la
ressource de progression de différentes manières. Vérifier s'il existe, démarrer un nouveau
jeu et le charger. En utilisant le même format
que nos paramètres, nous pouvons déclarer une constante de chemin de
sauvegarde. La fonction safe file exists
renverra un booléen renvoyant la même
valeur renvoyée
par le chargeur de ressources do Passer le
chemin de sauvegarde en tant qu'argument. Création d'une nouvelle ressource de progression
lorsqu'une nouvelle partie est appelée. Sauvegarde de la ressource
lorsque le jeu sauvegardé est appelé et chargement de la ressource lorsque Load Game est appelé. Dans la scène titre, nous
pouvons désormais facilement créer une nouvelle ressource de progression
lorsque vous appuyez sur Nouveau jeu. Et chargez le
fichier sécurisé existant si vous appuyez sur Continuer. Ce serait une bonne conception de l'interface utilisateur de désactiver le
bouton de poursuite b et de ne l'activer que s'il existe
un fichier sûr à charger. Faisons référence au bouton «
Continuer »
en utilisant « Ajouter prêt ». Dans la fonction Ready,
si un fichier sécurisé existe, nous pouvons activer le bouton
Continuer en définissant sa propriété
désactivée false, puis en
lui demandant également de se concentrer. De cette façon, l'option par défaut
sera « nouveau jeu » la première fois que le jeu sera joué et continuera à chaque fois par la suite. Il ne nous reste plus qu'à décider
quand sauvegarder le jeu. Comme ce script de fichier
est un nœud de chargement automatique, vous pouvez facilement appeler la
fonction de sauvegarde pour le faire depuis le menu de pause ou depuis l'
objet de sauvegarde de votre jeu. Je vais juste enregistrer
automatiquement mon jeu chaque fois que le game
manager décharge un niveau De retour dans le script du
gestionnaire de titres, complétons également
la fonction de sortie. Comme lorsque
le jeu commence, nous pouvons attendre de passer au
noir avant de sortir Quitter le jeu est une fonction intégrée de l'arbre des scènes, laquelle nous pouvons accéder
avec get tree, et il suffit d'appeler la fonction Q. Dans nos scripts de ressources personnalisés, nous devrons ajouter une
exportation au début de toutes les déclarations de variables
que nous voulons écrire dans le fichier sécurisé. Toutes les variables que nous ne voulons pas
enregistrer peuvent simplement omettre
la balise d'exportation Si, par exemple, vous utilisez la méthode du point sûr
commune aux JRPG, la variable enregistrée dans
le fichier sécurisé sera un numéro d'identification
associé au point sûr, qui sera
donc exporté Mais les variables contenant
le niveau actuel et ID de
transition n'auraient pas besoin d'être enregistrées
dans le fichier sécurisé, car elles ne sont pas
nécessaires pour charger le jeu, mais sont tout de même nécessaires pour
passer d'un niveau à l'autre. Ils n'auraient donc pas besoin d'
être exportés dans ce cas. Dans mon jeu, je dois
exporter ces variables, car je
sauvegarde automatiquement mon jeu à
chaque changement de niveau. Une dernière remarque concernant le script de chargement automatique des
fichiers. En utilisant l'extension point RES, nous allons écrire un
fichier sécurisé sous forme de fichier binaire, ce qui le rendra difficile pour
l'utilisateur d'y accéder. En ajoutant un T, en créant l'extension
TRes pour ressource de texte, nous écrirons le fichier sécurisé
sous la forme d'un fichier texte commun, qui pourra être consulté et édité dans n'importe quel logiciel d'édition de texte. Les deux formats sont acceptables. Je vais enregistrer les paramètres sous forme de
texte et la progression sous forme de fichier binaire. Essayons-le. En cours de jeu, le bouton
Continuer est désactivé, mais nous pouvons démarrer une nouvelle partie. Dans la scène du jeu, je vais
tomber sur un niveau différent, qui devrait sauver ma partie. En interrompant le jeu, je vais modifier
certains paramètres du jeu. Quittez ensuite le jeu en revenant à la scène titre. Le
bouton Continuer est maintenant actif, car le fichier sécurisé
existe pour être chargé. Mais quittons d'abord le jeu, qui passe au noir et
ferme la fenêtre de jeu Maintenant, je lance à nouveau le jeu. Cette fois, le
bouton Continuer est activé, car notre fichier sécurisé persistait
entre les sessions de jeu En continuant notre jeu actuel, nous commençons dans l'autre niveau, et les paramètres du jeu sont également
les mêmes que ceux que nous avons laissés. R. Maintenant, examinons les fichiers qui ont été
créés sur mon disque dur. Le fichier de paramètres peut
être ouvert dans le bloc-notes. Nous pouvons voir
clairement les
variables exportées et leurs valeurs et même
les modifier et enregistrer le fichier. Ensuite, ouvrons le fichier de sauvegarde contenant la progression des joueurs. La plupart de ces informations le sont. Même si nous devions modifier
quelque chose et enregistrer le fichier, tenter de charger le fichier
saf ferait planter le jeu car il n'est
plus correctement formaté Lancez le jeu une
fois de plus et vérifiez que
notre fichier de paramètres, que nous avons
modifié manuellement dans un bloc-notes, est chargé et que les
valeurs sont correctes sauvegarde des ressources au format
binaire est donc plus sûre et les ressources
textuelles sont très faciles à modifier. À mon avis, il est souvent plus avantageux pour
les développeurs de ND de pouvoir
résoudre les problèmes de modification des
fichiers de sauvegarde avec vos joueurs que
de masquer les
données de progression pour éviter de tricher Les joueurs progressent,
enregistrent et chargent maintenant entre les sessions de jeu. Dans la leçon suivante, nous allons
terminer par l'affichage
des crédits du jeu. Je te verrai dans la prochaine leçon.
11. Crédits: Bonjour, mes amis. Dans
la leçon précédente, nous avons enregistré et chargé
la progression des joueurs. Dans cette leçon, nous allons
afficher les crédits du jeu. Commençons par créer une
nouvelle scène, la scène du crédit. Comme il ne s'agit généralement que d'un arrière-plan
noir
avec du texte blanc, je pense qu'un nœud
d'
interface utilisateur le plus logique
en tant que nœud racine. Donnons
un script à la note racine et
appelons-le Credits Manager. Hériter de Scene Manager et le trier dans le dossier des scripts du
gestionnaire Nous pouvons copier la note F de n'importe quelle autre scène et la
coller dans la scène du crédit. Attribuez-le ensuite dans l'inspecteur, en ajoutant une
piste musicale pour la scène de crédit. Dans le script du gestionnaire de titres, nous pouvons désormais définir le comportement
du bouton des crédits dans le menu principal pour passer
à la scène des crédits. Nous devons également enregistrer la
scène de crédit dans le dossier des scènes. Ensuite, dans le script du
gestionnaire de crédits, ajoutons une fonction
qui
revient à la scène titre. Dans la fonction de saisie. Nous pouvons vérifier si le joueur a
appuyé sur un bouton spécifique. Je vais simplement réutiliser le bouton de saut, et si c'est le cas, revenir
à la scène titre. Nos scènes sont désormais connectées et peuvent faire des
allers-retours. La plupart des jeux encore en développement
auront les crédits accessibles depuis le menu
principal, car la fin du jeu
n'est pas encore terminée. y aura donc
aucun moyen d'accéder à la scène des crédits en
terminant le jeu. L'inclusion de votre
scène de crédit tout au long
du développement de votre jeu permet également de
suivre tous ceux qui contribué tout au long de
son cycle de vie. En parlant de cela,
les crédits ne sont généralement qu'une série d'étiquettes de texte organisées
verticalement et défilant lentement vers Donc, en ajoutant un
conteneur vertical à la scène, appelons-le scroll. Et ancrez-le
au bas de l'écran. Mais avec le réglage large. Maintenant, les ancres gauches se
trouvent en bas à gauche de l'écran et les ancres
droites sont toutes deux en bas à
droite de l' C'est généralement de là que proviendront les
crédits. Les crédits sont souvent
divisés en catégories ou en titres de poste, suivis d'une liste des noms des contributeurs
de cette catégorie. Ainsi, dans notre
boîte verticale contenant tous les crédits, nous pouvons ajouter d'autres cases verticales
pour contenir chaque catégorie. C'est ce que j'appellerai un game design. À l'intérieur de la catégorie,
il doit y avoir une étiquette pour le titre
de la catégorie. Et je vais
dire « game design ». Les crédits sont généralement
alignés sur le centre. Je vais faire en sorte que la police soit blanche. Taille 64, et utilisez la plus sophistiquée de mes deux
polices pour les titres des catégories Dupliquons cette étiquette non pour ajouter une autre
étiquette à notre nom. Réduisez ensuite la taille de police et remplacez-la par une police mettant davantage l'accent sur la lisibilité Nous sommes désormais répertoriés en tant
que game designer notre scène de crédit de jeux. Mais les crédits commencent
dans la fenêtre de jeu. Ils devraient commencer en
bas de l'écran. Revenons à
la zone de défilement vertical et changeons ses
préréglages d'ancrage en paramètres personnalisés Cela permettra de maintenir les
ancres là où elles se trouvent, mais nous permettra de modifier
chaque réglage individuellement Nous voulons que la direction de croissance de cet élément de contrôle descende, et
non vers le haut, en modifiant le
réglage de haut en bas. Réduisons et dupliquons la
catégorie game design pour créer notre prochaine catégorie,
le développement de jeux. Comme tous les
paramètres sont dupliqués, il suffit de
modifier les noms des nœuds et
les
propriétés de texte des nœuds d'étiquette, et d'ajouter des noms
supplémentaires à chaque catégorie selon les besoins Et répétez ce processus pour
continuer à ajouter
autant de catégories que nécessaire pour votre
jeu afin de
vous assurer que toutes les personnes impliquées soient créditées. Je vais également rendre hommage à l'artiste qui a créé les modèles de personnages,
les animations et les
modèles d'environnement, K Laberg Penzila, qui a créé les éléments de
l'interface utilisateur, et Eric the Funny Baron, qui a produit toute la musique Enfin, terminez par un message de
remerciement au joueur. Je vais également agrandir le message de
remerciement. Nos crédits sont tous là, mais ils sont tous
serrés et difficiles à lire Ajoutons une certaine séparation
au conteneur vertical
pour séparer les catégories. Je vais placer chaque catégorie à 256 pixels l'une de l'autre
pour leur donner beaucoup d'espace. Et nous pouvons constater que
le scroll des crédits deviendra très long très rapidement. La dernière chose que je veux
faire est de m'assurer que le message de
remerciement
s'affiche tout seul à la fin. Je vais donc lui donner une valeur
y de taille minimale
personnalisée correspondant au paramètre de
taille de fenêtre de mon jeu, 720 pixels, et centrer le texte verticalement dans
cet espace en utilisant la propriété d'
alignement vertical des étiquettes. De retour dans le script du
gestionnaire de crédits, exportons une variable pour la vitesse de défilement et donnons-lui une
valeur par défaut d'environ 32
pixels par seconde. Et saisissez une référence au
parchemin en utilisant Add on Ready. Ensuite, dans la fonction de traitement, qui prend Delta
comme paramètre flottant représentant les
secondes
écoulées depuis la dernière image, modifiez la position
y du défilement en
soustrayant la vitesse multipliée Car lorsque vous travaillez
en deux dimensions, zéro se trouve en haut
de l'écran, et déplacer quelque chose vers le haut se déplace dans le sens
négatif. Nous devons ensuite
arrêter le défilement une fois que le message de remerciement
atteint l' En regardant dans notre vue en deux D, en sélectionnant le
parchemin et en exposant la
valeur de la position de transformation dans l'inspecteur, nous pouvons déplacer le parchemin vers le haut jusqu'à ce qu'il atteigne la position
souhaitée, où seul le
message de remerciement est affiché. En regardant la transformation dans l'
inspecteur, nous pouvons constater que la
position y du parchemin est désormais égale à la
partie y de la taille, mais qu'il s'agit d'un nombre
négatif augmenté de la hauteur de
l'écran 720. De retour dans le script,
nous pouvons vérifier si la position y du parchemin
a dépassé cette valeur. Vérifiez si elle est
inférieure à la valeur négative du point y plus la
hauteur de la fenêtre de 720 pixels Nous pouvons être encore
plus précis avec ce calcul en accédant à la classe
singleton du serveur d'affichage et en lui demandant la taille de fenêtre
actuelle, puis en accédant à la valeur y. Si cela est vrai, la fin du parchemin
est atteinte et le message de remerciement est
au centre de l'écran. À ce stade, nous aimerions que le défilement cesse de défiler Créons une
variable booléenne appelée, qui sera définie par défaut Nous pouvons ensuite le définir sur true
lorsque le parchemin répond à cette condition et également définir la position y pour qu'elle corresponde
exactement
à cette valeur afin qu'il soit parfaitement centré au cas où il
dépasserait le repère Comme nous effectuons
ce calcul deux fois, changeons-le
en variable et calculons-le en utilisant Add on ready. Ensuite, en haut de
la fonction de traitement, nous pouvons vérifier si le
défilement est à la fin, et si c'est le cas, revenir, empêchant ainsi le
comportement de défilement de Cela fonctionne, mais au lieu de simplement sortir lorsque le joueur
appuie sur le bouton de saut, je préférerais avoir
la vitesse de défilement et ne revenir à l'écran
titre qu'à la fin du Dans la fonction de saisie, si le joueur appuie sur
le bouton de
saut, vérifie également si
la fin du parchemin est atteinte avant de
passer à la scène titre. exportant deux nouvelles variables, appelons-les
vitesse lente et rapide, toutes deux sous forme de flottants avec
des valeurs
par défaut de 32 et 512 pixels par seconde La vitesse de défilement réelle n'a plus besoin d'être exportée,
mais réglons-la sur la vitesse lente à l'
aide de la fonction Add-on Nous pouvons ensuite régler la
vitesse de défilement sur la vitesse rapide si le joueur appuie sur
le bouton de saut avant que le parchemin
n'ait atteint sa fin. Et réglez-le sur une vitesse lente s'
ils relâchent le bouton. R Essayons-le. En cliquant sur le bouton des crédits, vous passez à la scène des crédits. Les crédits commencent à défiler lentement vers le haut à partir du bas de
l'écran Mais nous pouvons l'accélérer en
maintenant le bouton de saut enfoncé. Une fois le
message de remerciement atteint, le jeu
attendra une nouvelle pression sur le bouton Jump pour
revenir à la scène titre. Et c'est tout pour l'
essentiel du développement de jeux. Vous avez maintenant un projet de squelette entièrement
fonctionnel qui pourrait être utilisé pour
développer un jeu de n'importe quel genre.
12. Quoi faire ensuite ?: Bienvenue dans mon cours sur les systèmes de dialogue et d'événements à Gado Ce cours est une suite des bases du développement de jeu
dans Gado, mais il peut être suivi et appliqué à tout projet
impliquant un personnage que le joueur peut contrôler pour interagir avec des PNJ ou des objets en appuyant sur un bouton et en
affichant un Vous pouvez rejoindre
notre serveur Discord pour travailler sur ce cours
aux côtés de vos pairs Dans ce cours, nous
aborderons la création de boîtes de dialogue, d'événements
et d'interactions. Associez-les ensuite à l'
aide d'indicateurs de progression, commandes de
caméra et d'animations de
personnages. Lorsque vous aurez terminé, vous disposerez d'un système
complet de dialogues
et d'événements pour votre jeu, qui pourra
être utilisé pour produire des cinématiques de
haute qualité et des récits
complexes qui réagissent aux choix des joueurs et leur
permettent de
progresser dans le Vous acquerrez également des compétences utiles pour travailler avec le moteur de jeu
Gada, organiser et concevoir vos projets de manière à ce qu'ils
soient plus évolutifs Vous
apprendrez à coder avec le script
GD avec tout
expliqué en détail Nous appliquerons les principes de conception
orientés objet dans nos scripts, héritage, l'encapsulation
et l'abstraction, ainsi que d'autres modèles de conception de
génie logiciel tels que le modèle Singleton et le modèle
composite, afin de les organiser, personnaliser et de les réutiliser
pour un projet de toute taille Tous les fichiers du projet sont
également disponibles sur Github, si vous devez revoir
le projet tel qu' il était après avoir terminé
chaque leçon Ces vidéos ont été enregistrées
avec la version 4.2 0.2 de Gadot. Le projet commence
avec des ressources provenant des packs remasterisés de personnages et de
donjons de
K Kits créés par K L auberg et du bundle
Guy de base Tous sont
téléchargeables gratuitement sur point IO.