Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
logiciels:blender:bge-python:accueil [2016/03/31 10:26] resonance [Game Object] |
logiciels:blender:bge-python:accueil [2018/04/06 16:27] resonance [Game Object] |
||
---|---|---|---|
Ligne 111: | Ligne 111: | ||
==== script01.py ==== | ==== script01.py ==== | ||
+ | ++++ Voir le script | | ||
<code python> | <code python> | ||
# Deuxième script : GameObject | # Deuxième script : GameObject | ||
Ligne 219: | Ligne 219: | ||
| | ||
</ | </ | ||
+ | ++++ | ||
+ | |||
+ | ===== Les scènes ===== | ||
+ | * Fichier Blender : {{: | ||
+ | |||
+ | {{: | ||
+ | |||
+ | 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, | ||
+ | |||
+ | |||
+ | Les scènes sont des objets qui héritent de la classe : [[https:// | ||
+ | |||
+ | ++++ Paramètres et fonctions pour les scènes | | ||
+ | active_camera, | ||
+ | ++++ | ||
+ | |||
+ | ==== 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' | ||
+ | |||
+ | {{: | ||
+ | |||
+ | ==== Scène 0 ==== | ||
+ | Sur la scène 0, nous allons placer un objet " | ||
+ | |||
+ | {{: | ||
+ | |||
+ | ==== script02.py ==== | ||
+ | ++++ Voir le script | | ||
+ | <code python> | ||
+ | """ | ||
+ | Troisième script : | ||
+ | Manipulation des scènes et des objets à travers les scènes. | ||
+ | |||
+ | Interactions : | ||
+ | - Appuyer sur " | ||
+ | - La touche " | ||
+ | - La touche " | ||
+ | - La touche " | ||
+ | """ | ||
+ | |||
+ | import bge | ||
+ | import random | ||
+ | |||
+ | # Variable globale que l'on peut utiliser partout dans le script | ||
+ | nombre_scenes = 3 | ||
+ | |||
+ | # Changer de scène, mais de façon fixe | ||
+ | # L' | ||
+ | def goToScene2(cont): | ||
+ | obj = cont.owner | ||
+ | scene = obj.scene | ||
+ | scene.replace(" | ||
+ | | ||
+ | # Aller à la scène suivante de façon dynamique | ||
+ | def goToNextScene(cont): | ||
+ | obj = cont.owner | ||
+ | | ||
+ | # On récupère l' | ||
+ | sensor = obj.sensors[" | ||
+ | | ||
+ | # La touche " | ||
+ | if sensor.positive : | ||
+ | | ||
+ | # Comme les noms des scènes se terminent par un chiffre | ||
+ | # on récupère le dernier caractère du nom de la scène | ||
+ | # et on le convertit en chiffre | ||
+ | scene = obj.scene | ||
+ | id = int(scene.name[-1: | ||
+ | | ||
+ | # On ajoute 1 pour aller à la scène suivante | ||
+ | id += 1 | ||
+ | | ||
+ | # S'il dépasse la variable " | ||
+ | if id > nombre_scenes : | ||
+ | id = 1 | ||
+ | | ||
+ | # Changement de scène | ||
+ | scene.replace(" | ||
+ | print(" | ||
+ | |||
+ | |||
+ | # Détruire l' | ||
+ | def destroyObject(cont): | ||
+ | obj = cont.owner | ||
+ | obj.endObject() # l' | ||
+ | |||
+ | |||
+ | # Détruire l' | ||
+ | # car son nom dans chaque scène se termine par le numéro de la scène | ||
+ | def deleteText(cont): | ||
+ | obj = cont.owner | ||
+ | sensor = obj.sensors[" | ||
+ | if sensor.positive : | ||
+ | scene = obj.scene | ||
+ | id = scene.name[-1: | ||
+ | textObjName = " | ||
+ | if textObjName in scene.objects : | ||
+ | val = scene.objects[textObjName] | ||
+ | val.endObject() | ||
+ | print(" | ||
+ | |||
+ | |||
+ | # Génère des couleurs pour tous les objets de toutes les scènes | ||
+ | # qui ont la propriété " | ||
+ | def randColors(cont): | ||
+ | sensor = cont.sensors[' | ||
+ | if sensor.positive: | ||
+ | | ||
+ | # Liste de toutes les scènes | ||
+ | scenes = bge.logic.getSceneList() | ||
+ | | ||
+ | # Parcours des scènes | ||
+ | for scene in scenes: | ||
+ | | ||
+ | # Parcours des objets de cette scène | ||
+ | for obj in scene.objects: | ||
+ | | ||
+ | # Si l' | ||
+ | if " | ||
+ | print(" | ||
+ | r = random.random() | ||
+ | g = random.random() | ||
+ | b = random.random() | ||
+ | obj.color = (r, g, b, True) | ||
+ | |||
+ | </ | ||
+ | ++++ | ||
+ | |||
+ | |||
+ | ==== 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 : | ||
+ | <code python> | ||
+ | # Liste de toutes les scènes | ||
+ | scenes = bge.logic.getSceneList() | ||
+ | # Trouver la scène " | ||
+ | my_scene = [scene for scene in scenes if scene.name==" | ||
+ | # Trouver l' | ||
+ | my_object = my_scene.objects[' | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Ouïe ! ===== | ||
+ | * Fichier Blender : {{: | ||
+ | {{: | ||
+ | |||
+ | |||
+ | Manipulation des collisions, des messages et des fréquences des boîtes capteurs. Les collisions font parti du groupe [[https:// | ||
+ | |||
+ | ===== Objets ===== | ||
+ | {{: | ||
+ | |||
+ | |||
+ | |||
+ | ==== Contrôler la fréquence des pulses ==== | ||
+ | Avec **sensor.skippedTicks**. | ||
+ | |||
+ | {{: | ||
+ | |||
+ | |||
+ | ==== script03.py ==== | ||
+ | |||
+ | ++++ Voir le script | | ||
+ | <code python> | ||
+ | """ | ||
+ | Manipulation des collisions, des messages et des fréquences des boîtes capteurs | ||
+ | """ | ||
+ | |||
+ | import bge | ||
+ | import random | ||
+ | |||
+ | |||
+ | # Manipuler la fréquence de la boîte capteur | ||
+ | def randFreqColors(cont): | ||
+ | obj = cont.owner | ||
+ | sensor = obj.sensors[" | ||
+ | if sensor.positive : | ||
+ | | ||
+ | # Activation du mode pulse | ||
+ | if sensor.usePosPulseMode == False: | ||
+ | sensor.usePosPulseMode = True | ||
+ | | ||
+ | # Fréquence du prochain déclenchement au hasard | ||
+ | sensor.skippedTicks = random.randrange (1,30) | ||
+ | obj.color = (random.random(), | ||
+ | | ||
+ | |||
+ | # Tests de collisions avec envois de messages | ||
+ | def sendBoom(cont): | ||
+ | obj = cont.owner | ||
+ | sensor = obj.sensors[" | ||
+ | if sensor.positive : | ||
+ | msg = "From " + obj.name | ||
+ | obj.sendMessage(" | ||
+ | | ||
+ | |||
+ | # Réception d'un message et ajout d'un objet texte | ||
+ | def receiveBoom(cont): | ||
+ | obj = cont.owner | ||
+ | sensor = obj.sensors[" | ||
+ | if sensor.positive : | ||
+ | print(" | ||
+ | | ||
+ | # Récupération du contenu du message et séparation des mots dans un tableau | ||
+ | # message[0] est le premier élément, ici " | ||
+ | # message[1] est le deuxième élément, ici le nom de la sphère | ||
+ | message = sensor.bodies[0].split(" | ||
+ | | ||
+ | # Construction du nom de l' | ||
+ | textName = obj.name + " | ||
+ | | ||
+ | # Ajout de cet objet dans la scène | ||
+ | # Arguments : nom de l' | ||
+ | obj.scene.addObject(textName, | ||
+ | | ||
+ | # On modifie ensuite le texte et la position de l' | ||
+ | objText = obj.scene.objects[textName] | ||
+ | objText.text = "Ouïe ! " + message[1] + " !" | ||
+ | objText.worldPosition.z = obj.worldPosition.z + 1 | ||
+ | | ||
+ | # On change aussi la couleur | ||
+ | obj.color = (random.randrange(10)/ | ||
+ | </ | ||
+ | ++++ | ||
+ | |||
+ | ===== Autres exemples ===== | ||
+ | * Fichier Blender et les textures : {{: | ||
+ | |||
+ | |||
+ | {{: | ||
+ | |||
+ | Jouer une animation et changer d' | ||
+ | ==== Objets ==== | ||
+ | {{: | ||
+ | |||
+ | |||
+ | ==== script04.py ==== | ||
+ | |||
+ | ++++ Voir le script | | ||
+ | <code python> | ||
+ | """ | ||
+ | Jouer une animation et changer d' | ||
+ | """ | ||
+ | |||
+ | import bge | ||
+ | from bge import texture | ||
+ | from bge import logic | ||
+ | import random | ||
+ | |||
+ | # Jouer une animation | ||
+ | def runAnim(cont): | ||
+ | obj = cont.owner | ||
+ | sens = cont.sensors[' | ||
+ | if sens.positive: | ||
+ | # Déclenchement de l' | ||
+ | obj.playAction(" | ||
+ | |||
+ | |||
+ | # Changer d' | ||
+ | # Un dossier " | ||
+ | # dont le nom des fichiers suit la logique " | ||
+ | def randTexture(cont): | ||
+ | # Nombre d' | ||
+ | max=6 | ||
+ | obj = cont.owner | ||
+ | # Un capteur quelconque | ||
+ | sens = cont.sensors[' | ||
+ | if sens.positive: | ||
+ | # Image orginale de la texture | ||
+ | ID = texture.materialID(obj, | ||
+ | object_texture = texture.Texture(obj, | ||
+ | obj.attrDict[" | ||
+ | # Tirage d'un nombre au hasard et conversion en String pour former le nom de l' | ||
+ | n = str(random.randrange(max)) | ||
+ | # Chemin de l' | ||
+ | url = logic.expandPath("// | ||
+ | new_source = texture.ImageFFmpeg(url) | ||
+ | object_texture.source = new_source | ||
+ | object_texture.refresh(False) | ||
+ | </ | ||
+ | ++++ | ||
+ | ==== Voir aussi === | ||
+ | Des variables peuvent être accessibles depuis toutes les scènes avec [[https:// | ||
+ | |||
+ | Manipuler un actionneur " | ||
+ | |||
+ | Pour les notions de distances entre objet et d' | ||
+ | |||
+ | Pour communiquer avec d' | ||
+ |