Blender Game Engine : Python

Pour créer des comportements, des actions, des interactions dans le moteur de jeu de Blender, on a vu qu'on pouvait utiliser les briques logiques. Nous pouvons également accéder à certaines fonctionnalités par des scripts écrits en langage Python. Le langage Python apporte à Blender modularité et extensibilité : on peut créer des extensions pour Blender (add-ons), des scripts pour les jeux et les animations, et utiliser les multiples bibliothèques qui existent pour Python.

La principale difficulté sera de savoir quand utiliser les briques logiques et quand utiliser les scripts Python. Certaines choses sont simples à faire en briques logiques, d'autres pourront être déléguées à des scripts.

Blender Python API : documentation de l'interface de programmation avec Python.

Il faut savoir que toutes les propriétés visibles dans le logiciel ne sont pas accessibles en mode bge (Blender Game). Elles sont accessibles en mode bpy (Application Module) qui est le mode pour créer des add-ons. C'est assez déroutant. Nous avons néanmoins deux moyens de savoir ce qu'il est possible de faire en mode jeu, utiliser la fonction dir() et consulter la documentation de l'API.

Premiers pas

Pour commencer, il faut configurer son environnement de travail et le tester avec un premier script.

Configuration

Afin de débugger et d'afficher des informations utiles, il faut pouvoir les afficher dans une console. Pour Windows, il suffit de cliquer sur Window > Toggle Python Console, pour Mac et Linux, il faut ouvrir Blender par le terminal.

Il faut tout d'abord faire apparaître l'éditeur de texte (Text Editor) et créer un fichier texte avec l'icône “+”, puis nommer ces fichiers avec l'extension .py. Au lieu de partir de zéro, vous pouvez aussi vous servir de trois modèles de scripts, en parcourant le menu Templates > Python > Game Logic.

L'appel des scripts se fait par une brique logique contrôleur de type Python, qu'il faut associer à un capteur. Il existe deux façons d'appeler un script : soit en appelant le script entier, soit en l'appelant par module.

Attention à la position des lignes en python, on appelle ça l'indentation. Il faut une indentation équivalente à 4 espaces pour délimiter les blocs.

Exemple correct :

def test():
    print("test")
 
test()

Exemple incorrect :

def test():
print("test")
 
test()

Premier script

Exemple d'interface avec un premier script python. Le script est actionné par un capteur “Always”. Lorsque le jeu démarre (touche “P”), il affiche simplement le nom de l'objet Cube dans la console.

script00.py

# Premier script en Python !
 
# Importation de la bibliothèque du moteur de jeu (Blender Game Engine ou bge)
# Elle nous permet de manipuler les objets et les briques logiques
import bge
 
# Premier module : afficher le nom de l'objet
def afficherNomObjet():
    # Attention à l'indentation des lignes !
 
    # On récupère le contrôleur
    cont = bge.logic.getCurrentController()
 
    # Et ensuite l'objet auquel il appartient
    obj = cont.owner
 
    # On affiche le nom de cet objet
    print(obj.name)
 
 
# Appel du module "afficherNomObjet" dès l'appel du script
afficherNomObjet()

Game Object

Les objets du jeu sont tous les objets que vous avez créé sur vos scènes, ils héritent tous de la classe bge.types.KX_GameObject.

Paramètres et fonctions d'un objet

Rendu

Toutes les 10 images, grâce au capteur Always “Tic10”, le contrôleur Python lance un module du script “script01.py”, qui a pour effet de faire tourner, grossir, avancer le cube “MonJoliCube”, ainsi que de changer sa couleur. La touche espace agrandit l'objet en largeur et la flèche du haut active un actionneur qui change d'état et donc arrête ces comportements.

Réglages

script01.py

Voir le script

Les scènes

Quand on commence à écrire des scripts, il est parfois compliqué de savoir à partir de quelle scène le script est appelé et comment accéder à un objet sur une autre scène. Pour cet exemple, nous allons prendre le principe d'un jeu, avec une scène de référence, toujours présente, la “Scène0”, et nous allons changer de scènes avec la touche “Flèche du haut”. La touche “Espace” permet de changer la couleur tous les objets qui ont la propriété “objColor”. La touche “Suppr” supprime l'objet Text de la scène courante.

Les scènes sont des objets qui héritent de la classe : bge.types.KX_Scene

Paramètres et fonctions pour les scènes

Architecture des scènes

Pour créer les scènes, nous allons nommer les objets et les scènes de façon à pouvoir les manipuler de façon dynamique. En terminant leurs noms par un chiffre, on peut grâce au Python, retirer ce chiffre et atteindre les objets. Comme les noms des objets doivent être uniques dans tout le projet Blender, cela peut être une bonne pratique de nommer ses objets avec l'identifiant de la scène.

Scène 0

Sur la scène 0, nous allons placer un objet “Text” pour bien visualiser que la scène est toujours présente en tâche de fond, même si on change de scène. Au démarrage, il ajoute la scène 1 au dessus (Overlay). Le module “randColors” est donc toujours accessible par la touche espace, sur toutes les scènes.

script02.py

Voir le script

Trouver un objet

Le nom des objets doit être unique dans tout le fichier Blender, et les objets avec le BGE ne peuvent être trouver qu'en passant par la scène qui le contient. Une façon concise de retrouver un objet dans une scène :

# Liste de toutes les scènes
scenes = bge.logic.getSceneList()
# Trouver la scène "Scene0"
my_scene = [scene for scene in scenes if scene.name=="Scene0"][0]
# Trouver l'objet "MonJoliCube0" de cette scène
my_object = my_scene.objects['MonJoliCube0']

Ouïe !

Manipulation des collisions, des messages et des fréquences des boîtes capteurs. Les collisions font parti du groupe bge.types.KX_TouchSensor.

Objets

Contrôler la fréquence des pulses

Avec sensor.skippedTicks.

script03.py

Voir le script

Autres exemples

Jouer une animation et changer d'images au hasard dans une texture.

Objets

script04.py

Voir le script

Voir aussi

Des variables peuvent être accessibles depuis toutes les scènes avec bge.logic.globalDict.

Manipuler un actionneur “Motion” : move.dLoc = [0.0, speed, 0.0]

Pour les notions de distances entre objet et d'alignement : getDistance, rayCast, actionneur “TrackTo”, alignTo…

Pour communiquer avec d'autres logiciels, on peut utiliser la bibliothèque OSC : exemple avec Pure Data et blenderOSC