Que serait un jeu sans les systèmes de comptage ou les scores ? Il s'agit là d'éléments importants dans les mécaniques de jeu, le joueur pouvant même décider de jouer en valorisant plus tel ou tel aspect. Globalement, l'affichage d'informations textuelles sur l'écran sera essentiel, et le cas échéant, ces informations devront être calculées. Dans ce chapitre nous verrons comment ajouter un score à notre jeu et l'afficher.
Nous allons commencer par créer un objet de type Text, qui servira à la fois à stocker la valeur du score et à l'afficher à l'écran.
Dans la vue 3D, créons un objet de type Text (Maj + A > Text). Dans les propriétés de l'objet en bas à gauche, cochons Align to View.
Nommons l'objet score (dans l'onglet Object). N'oublions pas de le placer dans une zone visible par la caméra, et de lui donner les dimensions de notre choix.
Pour l'instant, le texte est statique, il ne pourra jamais afficher autre chose que 0. Nous allons le rendre accessible depuis le BGE.
Vérifions que l'objet texte est bien sélectionné et, dans le Logic Editor, cliquons sur le champ Add Text Game Property. Notre score sera un nombre entier, choisissons Integer à la place de String.Lorsque nous déclenchons le jeu, le texte change pour0quand on lance le jeu avec P.
Les Properties permettent de stocker différents types d'informations que vous pourrez manipuler plus tard dans votre jeu. (Quel est le score du joueur ? Quel est son nom ? etc.). À ce titre, elles ressemblent beaucoup à des variables existant dans de nombreux langages de programmation. Elles peuvent être de différents types :
Dans le chapitre précédent, nous avons vu comment détecter une collision entre le joueur et un bonus. Cette collision déclenche la disparition du bonus. Nous aimerions qu'elle déclenche également l'augmentation du score.
1. Ajoutons à l'objet score un actuator de type Property, associé à la property Text.
2. Sélectionnons à la fois notre objet Score et notre objet Bonusen maintenant enfoncée la touche Maj durant la sélection.
3. Dans le Logic Editor, nous voyons à présent à la fois les briques appartenant aux deux objets, nous pouvons donc relier le controller And(déclenché par la collision détectée parBonus), à l'actuatorProperty de l'objet Score.
L'actuator Propertypermet d'agir sur la valeur de Text :
4. Dans notre cas, nous voulons ajouter des points au score, donc choisissons Add, et pour Value, le nombre de points que nous souhaitons attribuer au joueur pour cette réussite.
À présent, lorsque le personnage ramasse le bonus, le score est bien augmenté ! Il est maintenant aisé de dupliquer le bonus paramétré à l'aide de la combinaison de touche Maj+D afin d'en proposer plusieurs dans la même scène.
Lorsque vos projets deviendront plus complexes, utiliser le menuObject et le sous-menu Game vous permettra de copier facilement briques logiques et propriétés de l'objet actif à des objets d'aspect différent.
Agir sur le texte sera une action courante dans le jeu. Les objets de type texte (KX_FontObject
) ont un attribut text
(qui correspond à leur Game Property Text). Il est possible d'utiliser cet attribut pour modifier à la volée ses valeurs sous la forme owner.text
(ou owner["Text"]
).
from bge import logic
cont = logic.getCurrentController()
own = cont.owner own.text = "10"
Remarquez que même si la propriété est définie comme Integer, il faudra respecter le fait que Python gère la valeur comme une chaîne et faire les conversions qui s'imposent.
from bge import logic cont = logic.getCurrentController() own = cont.owner
own.text = str(int(own.text)+10)
Nous pourrions tout d'abord vouloir changer la valeur d'une Game Property, voici un exemple de code pour le faire :
from bge import logic
cont = logic.getCurrentController()
own = cont.owner
own["Text"] = "Hello World!"
Nous pourrions aussi vouloir récupérer la valeur d'une Game Property. Dans ce cas-là, une façon évidente de faire est d'utiliser la même syntaxe.
from bge import logic
cont = logic.getCurrentController()
own = cont.owner
# Affiche en console la valeur de la property "Text"
print(own["Text"])
Cette manière de faire fonctionne parfaitement sauf dans un cas, celui où la Game Property n'existe pas. Dans ce cas-là, Python va nous renvoyer une erreur sous la forme d'une exception de type KeyError
. Dans le cas où vous n'êtes pas sûr de l'existence de votre Game Property, il faut donc utiliser la fonction get()
qui permet en plus de définir une valeur à renvoyer si justement la Game Property n'existe pas.
Notre code devient alors :
from bge import logic
cont = logic.getCurrentController()
own = cont.owner
print(own.get("Text", "Sans Game Property"))
Le print
affichera soit la valeur de la Game Property appelée "Text"
, soit "Sans Game Property"
.
Il y a une erreur de communication avec le serveur Booktype. Nous ne savons pas actuellement où est le problème.
Vous devriez rafraîchir la page.