Programmer en Python sur le BGE

Répondre
Avatar du membre
Redstar
Super Modérateur
Messages : 21
Enregistré le : jeu. avr. 05, 2018 10:47 am

Programmer en Python sur le BGE

Message par Redstar » sam. avr. 14, 2018 12:04 pm

Dans ce tutoriel, vous allez apprendre à mieux appréhender l'API Blender. J'entends
beaucoup de petits nouveaux constater qu'il n'y a pas un bon explicatif pour l'API Blender
donc j'ai décidé de le faire moi-même.

Attention : Ce tutoriel s'adresse aux apprentis programmeurs python ! Vous pouvez
toujours suivre ce tutoriel sans connaissance de base python mais à vos risques et
périls !


Tout d'abord, API signifie Application Programming Interface (interface de
programmation). Cette interface contient toutes les commandes disponibles pour vos
projets. C'est votre Bible, en quelque sorte. Consultez-la à votre guise.

Étape 1 : Préparer un script
Installation des fondations :


Vous devez savoir à quoi servira votre futur script : A-t-il une influence directe ou
indirecte ? Par exemple, vous avez crée un personnage et vous souhaitez le contrôler avec
un script. Dans ce cas, c'est sur votre personnage qu'il faudra placer le script (dans l'idéal,
le mieux serait sur un cube qui subirait les déplacements et où l'armature et le mesh du
perso seraient liés au cube).

Si, par exemple, votre script influe la météo, vous le lierez à un empty. Ça permet de bien
répartir les scripts selon leurs rôles. Vous pouvez aussi faire un seul script et indiquer des
petites parties de rôle que vous avez préalablement définies dans votre script (je fais
allusion aux classes).

Avant de commencer, une petite mise au point :
https://drive.google.com/open?id=1d7xGH ... 8unITai9zb

Qu'est-ce qu'un sensor, un controller et un actuator ? Pour imager, le sensor est la
condition de l'action, le controller est l'intermédiaire et l'actuator est l 'action à faire, si
la condition est vraie.

Pour commencer, sélectionnez votre cube de départ et ouvrez la fenêtre logic. Créez un
sensor always et un controller python et liez-les.
https://drive.google.com/open?id=1Kh0xq ... EUk9crxZSf

Encore une fois, selon le rôle de votre script, il est possible que ce ne soit pas toujours un
always mais c'est en règle générale le sensor que l'on utilise. Vous devez aussi savoir si
votre script s'exécute une seule fois ou en boucle (et aussi à quelle fréquence). Dans
l'image ci-dessus, le script ne s’exécutera qu'une seule fois. Si vous voulez le faire en
boucle, vous devez cocher ceci : ''' (ça signifie que la condition est toujours vraie). La
fréquence permet de laisser un laps de temps entre la première impulsion positive et la
suivante.

C'est tout ce qu'il y a à faire pour préparer un simple script.

Le saviez-vous ?
Ici, vous exécutez le script en entier mais vous pouvez, comme dit plus haut, exécuter une
partie de ce script
si vous l'avez séparé en petit morceaux (les classes). Á ce moment là,
vous devez changer script par module, indiquer votrescript.la_classe (ou la fonction)

Étape 2 : un script simple
Construction de la « maison »


Avez-vous remarqué que vous avez un éditeur de texte dans Blender ? Ça ne sert pas
nécessairement à écrire du blabla, c'est pour aussi programmer ! Sélectionnez donc votre
éditeur de texte à la place de votre vue 3D et ajoutez un nouveau script.
https://drive.google.com/open?id=14Tdox ... YiJEyZXDjR

Bien, vous avez donc un script vierge. On va y aller doucement. Tout d'abord, vous avez 3
petites cases que l'on peut cocher à côté de votre script. Je vous conseille d'utiliser tout le
temps la première et la troisième case. La première vous indique le nombre de lignes que
contient votre script (ça vous aidera plus tard) et la troisième est un pointeur qui colorie
les nombres, conditions, boucles, etc. (ça vous aidera beaucoup aussi).

Pour commencer un script, on importe toujours le nécessaire qui est le module bge.
https://drive.google.com/open?id=1u4mSE ... jv7uZayt7O

Ligne 1 : On importe le module bge
Ligne 2 : Ici, on importe la classe logic du module bge et on le nomme « gl »

Remarque : J'utilise tout le temps ça, personnellement.

Ligne 3 : C'est un espace, ce n'est pas nécessaire de faire des espaces mais c'est plus
« propre ».
Ligne 4 : Si nécessaire, on capture la scène (et tout les objets présent) où l'on se trouve
actuellement (quand on est en jeu) dans une variable « scène ».

Remarque : Si vous voulez ajouter un objet à la scène ou si vous voulez influencer un
objet indirectement, on utilisera cette variable.

Ligne 5 : Capture le controller python actuel et tous les sensors/actuators reliés à
celui-ci, que ce soit l'objet lui-même ou les autres objets.
Ligne 6 : Capture le controller python actuel et tous les sensors/actuators reliés à
celui-ci appartenant à l'objet où se trouve le script, contrairement à la ligne 5.

Remarque : la ligne 6 peut vous paraître bizarre mais elle sera utile pour influencer les
propriétés de l'objet où se trouve le script.

Afin de voir nos erreurs ou résoudre des problèmes, on va ouvrir notre console :
https://drive.google.com/open?id=1T6urU ... intQ4BJH6S

Pour les utilisateurs Linux, vous devez lancer Blender depuis votre terminal pour avoir la
console.

On s'en servira plus tard, ne vous inquiétez pas.

Maintenant, vous avez tout ce qu'il faut pour faire un petit quelque choses. Ouvrez votre
« Bible » afin d'accéder à la classe logic.
https://drive.google.com/open?id=1Zkynk ... shERJltY4S

Vous allez arriver sur une page internet avec plusieurs choix. On va se contenter du
bge.logic.
https://drive.google.com/open?id=1d7xGH ... 8unITai9zb

Vous allez voir une liste et quelques explications de base pas très explicites pour les
nouveaux. Cette liste regroupe toutes les fonctions, variables et attributs se trouvant dans
bge.logic.

Game type : regroupe tout ce qui concerne les objets dans votre jeu, vous pouvez donc
modifier leurs propriétés ou les influencer sans passer par des briques.
Game logic : Fonctionne à peu près de la même manière que Game type mais avec les
briques.
Rasterizer : Ce module vous permet d'afficher par exemple un texte ou de dessiner une
« ligne virtuelle » dans votre jeu.
Video texture : Vous permet de faire une télévision avec de la publicité, par exemple.
Game keys : c'est la liste des touches clavier/souris et la façons d'activer la/les touches.
Physics Constraints : Permet de configurer une contrainte sur un objet ou en général
sur la physique. Par exemple, modifier l'apesanteur si vous faites un jeu d'astronaute (avec
un sas et tout).

Ceci est la liste des sensors :
https://drive.google.com/open?id=1um7Y3 ... XNZmOk-26a

Ceci est la liste des actuators :
https://drive.google.com/open?id=1u6xBo ... PXL295VfjC

Cliquer sur l'un d'eux vous mènera vers la fonction avec ses attributs, conditions et
actions.

Alors, que va-t-on vous faire faire ??? Je sais ! On va influencer la position et l’orientation
de notre cube !

Tout d'abord, il nous faut de quoi faire l'action , une condition. On va dire « si j'appuie sur
espace, changer la position et l'orientation du cube ». Mais comment faire ?
Démonstration :

Comme on va faire appel au clavier, il nous faut de quoi l'utiliser en python :

Code : Tout sélectionner

keyboard = gl.keyboard
Le clavier est prêt mais il faut signaler à python que l'on doit appuyer sur une touche
pour que ça fonctionne.

Allons cliquer sur SCA_KeyboardSensor et voyons ce que l'on peut faire :
https://drive.google.com/open?id=17A39w ... 3NM89P5wbV

Ah ! Events, c'est ce qui nous permet de presser une touche, utilisons cet attribut pour
notre condition :

Code : Tout sélectionner

if keyboard.events
Vous avez probablement remarqué qu'il est indiqué le type de l’attribut qui est une liste. Et
dans cette liste, il faut une touche clavier et un statut. Qu'est-ce que ça veut dire ? Ça
veut dire qu'il faut indiquer quelle touche je dois presser et comment je dois la presser. Si
je clique donc sur keycode et status, j'ai deux listes.

Code : Tout sélectionner

if keyboard.events[ev.SPACEBAR == just_activated]
Traduction : « si la touche espace est pressée brièvement (just_activated), la condition
est vraie
».

Notre condition est prête, passons à l 'action ! Revenez à la page où vous pouvez voir la
liste des actuators et sélectionnez KX_ObjectActuator. Cette classe vous permet
d’influencer directement ou indirectement un objet.

dLoc nous permet de déplacer le cube.
dRot nous permet d'orienter le cube.

Code : Tout sélectionner

obj.dLoc = [0, 1 ,0]
Remarquez que le obj concerne notre cube puisque le script y sera attaché. Les deux
attributs fonctionnent de la même manière.

Vous devriez arriver à ce résultat :
https://drive.google.com/open?id=1aogWI ... aNPXOAks7h

Notre condition est prête et notre action aussi, on va tester ça.

Terminez par renommer votre script sous un autre nom et évitez les espaces, remplacez-les
par des underscores ( _ ). Enfin, indiquez dans votre brique logique python votre
script. Récupérez votre vue 3D et lancez le jeu (touche « P »).

Le saviez-vous ?
Votre script est intégré à votre fichier blend mais vous pouvez aussi l'enregistrer de façon
externe. Si c'est le cas, n'oubliez pas de sauvegarder les changements avant de lancer le
jeu.

Étape 3 : résoudre des erreurs
Il y a une erreur dans mon script !


Déçu ? Pas pour longtemps. Ça a été fait exprès pour vous apprendre à résoudre des
erreurs de distractions , cause principale d'erreurs humaines.

Vous vous souvenez de votre console ? Ouvrez-la.

Code : Tout sélectionner

python script error - object 'Cube', controller 'python':
Traceback (most recent call last):
File "Text", line 9, in <module>
NameError: name 'ev' is not defined
Blender Game Engine Finished
Vous devriez avoir un joli stress de votre console comportant le même message. Il est dit
que « .ev » n'est pas défini. En effet, on a oublié d'appeler un élément qui permet le bon
fonctionnement du clavier.

Rajoutez donc juste après l'import de logic : « from bge import events as ev ». Testez à
nouveau.

Cette fois, c'est quelque chose en rapport avec just_activated. Allez donc revoir le statut
sensor keyboard. Si just_activated est une variable, quel est sont contenu ? Que
devez-vous faire ?

Si vous avez compris, vous devriez avoir un message concernant dLoc. Vous devez savoir
que presque tout ce qui se trouve dans bge.logic nécessite une brique logique selon
l'action à faire. Ici, il nous manque l'actuator motion. Rajoutez donc l'actuator et liez-le
au controller.

C'est pas fini, il faut le signaler à python comme ceci :

Code : Tout sélectionner

deplac = obj.actuator['Motion']
C'est de la même façon pour définir un sensor (remplacer « actuators » par
« sensors »). Si vous voulez influencer un autre objet dont l'actuator est relié au script,
c'est « cont » à la place de « obj ».

Pour finir, il faut activer cet actuator :

Code : Tout sélectionner

cont.activate(deplac)
Voici le script final :
https://drive.google.com/open?id=1t_8yj ... vNVc-K1WgQ

Le saviez-vous ?
Avec ou sans script, gardez en tête que les actuators activés le sont indéfiniment. Vous
pouvez les activer de nouveau mais ça n'aura aucun effet. Par contre, si vous les
désactivez, vous devrez évidemment les réactiver (activate/deactivate).

Voilà, vous savez maintenant comment faire un script de base, comment rechercher une
information et résoudre des problèmes de code.
"Celui qui ajoute de nouvelles connaissances aux anciennes est le véritable enseignant." - Confucius.