Forum: Moteur de jeu GameBlender et alternatives

Transcription

Forum: Moteur de jeu GameBlender et alternatives
The Blender Clan
Forum: Moteur de jeu GameBlender et alternatives
Topic: Script Random
Subject: Re: Script Random
Posté par: BG
Contribution le : 10/10/2016 0:41:45
Avant tout un grand merci à Matpi pour son aide et le temps passé pour la résolution de mon
problème de script. Le sien fonctionne à merveille et en plus il a tout expliqué.
Ce qui suit est de Matpi:
Je vais donc tenter de t'expliquer la méthode qui me semble la plus simple. Je me contente ici
d'arriver au but que tu souhaites, je ne remets pas en question ton système.
Je propose que tu utilises un script unique qui sera lancé une seule fois au démarrage:
Random_Numb_Unique.py
Et maintenant les Explications:
L'idée globale du script est de créer une liste aléatoire, puis de s'occuper tour-à-tour de
chaque Empty en lui fixant la valeur de variable souhaitée.
Plus précisément:
1) imports
Je pense que cette partie est claire? bge est un module Python spécifique au Blender Game Engine,
il permet notamment d'accéder aux objets présents dans le jeu.
2) sce = bge.logic.getCurrentScene()
Avec getCurrentScene on récupère l'objet Python correspondant à la scène courante du jeu,
pour accéder plus tard aux objets qui s'y trouvent; c'est juste un raccourci
3) random_list = list(range(24))
Pas-à-pas:
- range(24)
La fonction range crée une "liste" de nombres entiers entre les deux bornes entrées en argument; il
faut toujours faire attention que la borne supérieure n'est pas comprise (pour certaines raisons
pas si idiotes qu'il peut y paraître de prime abord) dans la "liste", mais la borne inférieure, oui;
ainsi, l'objet résultant ira de 0 à 23 compris. La borne inférieure n'étant pas fournie, elle
résulte en la valeur par défaut 0; on aurait donc pu écrire équivalemment range(0, 24).
- list(...)
La fonction range ne rend en fait pas une liste à proprement parler, mais un objet spécial (grosso
http://blenderclan.tuxfamily.org/html
16/2/2017 3:13:44 / Page
modo un générateur); or nous aurons par la suite besoin d'un objet ressemblant à une liste,
nous transformons donc l'objet on conséquence à l'aide de list.
4) random.shuffle(random_list)
Je me suis rendu compte avec tes explications supplémentaires que random.sample n'est en
fait pas la solution optimale pour ton cas, mais que random.shuffle fait bien l'affaire en
l'occurrence.
Cette fonction-ci prend une liste en argument (d'où la conversion à l'étape précédente)
et la "mélange" (comme on battrait les cartes, en fait).
5) for i, j in enumerate(random_list):
La boucle for permet de passer en revue une liste (ou, plus généralement, une séquence) et va nous
permet de "regarder" tour-à-tour chaque Empty. Comme nous devons en même temps récupérer la
valeur aléatoire stockée dans random_list, nous utilisons la fonction spéciale enumerate: celle-ci
rend à chaque pas dans la boucle un élément de la séquence passée en argument (ici, random_list)
agrémenté d'un index correspondant simplement au décompte des éléments de la séquence.
Ainsi, i vaudra tour-à-tour 0, 1, 2, ... 23, tandis que j aura successivement les valeurs
d'éléments contenus dans random_list (les nombres de 0 à 23 compris, dans un ordre
aléatoire).
Cette ligne pourrait être remplacée par (un peu plus lisible mais moins efficace et joli):
for i, j in range(24): j = random_list[i]
où j est récupéré explicitement à la position i de la liste random_list.
6) sce.objects["Place_%02i" % (i + 1)]["Value"] = j
Pas-à-pas:
- "Place_%02i" % (i + 1)
Lorsque l'opérateur "%" suit une chaîne de caractères, il joue le rôle de formateur de chaîne, à
savoir qu'il va insérer dans la chaîne les éléments qui se trouvent après le %. Dans ce cas-ci,
la partie "%02i" va être remplacée par la valeur de i + 1 en s'assurant d'avoir un 0 au
début si le nombre est plus petit que dix. A noter qu'il existe une méthode plus moderne pour
le formatage des strings (chaînes de caractères), format, mais je reste relativement fidèle à
l'ancienne méthode; à toi de voir ce que tu préfères.
- sce.objects["..."]
sce.objects est un conteneur pour les objets Blender présents dans la scène référencée par sce. On
accède à un objet précis dans ce conteneur en donnant son nom entre crochets (un peu comme
dans un dictionnaire Python).
- ...["Valeur"] = j
Ensuite on peut assigner la valeur de j à la variable nommée Valeur contenue dans l'objet
Blender.
Pour donner un exemple de ce qui pourrait se passer:
http://blenderclan.tuxfamily.org/html
16/2/2017 3:13:44 / Page
1) random_list = list(range(24))
Après cette étape, random_list ressemble à [0, 1, 2, 3, 4, ..., 23].
2) random.shuffle(random_list)
Après cette étape, random_list pourrait par exemple ressembler à [17, 3, 1, 20, 13, ..., 8]. Elle a été
mélangée.
3) for i, j in enumerate(random_list):
A chaque pas de l'itération, i et j vaudraient alors respectivement
0 et 17
1 et 3
2 et 1
3 et 20
4 et 13
...
23 et 8.
4) sce.objects["Place_%02i" % (i + 1)]["Valeur"] = j
A chaque pas de l'itération, il y aurait assignement
de la valeur 17 à la variable "Valeur" de l'objet Empty_01
de la valeur 3 à la variable "Valeur" de l'objet Empty_02
de la valeur 1 à la variable "Valeur" de l'objet Empty_03
de la valeur 20 à la variable "Valeur" de l'objet Empty_04
de la valeur 13 à la variable "Valeur" de l'objet Empty_05
...
de la valeur 8 à la variable "Valeur" de l'objet Empty_24.
Pour utiliser le script, je te propose la méthode suivante:
1) Tu crées un objet quelconque (typiquement un Empty, nous ne sommes pas intéressés en sa
géométrie, bien au contraire) et le places en un endroit non moins quelconque (voire même dans un
layer différent).
Correction: L'empty doit être dans le même calque des objets qui reçoivent le nombre généré
par le script.
2) Tu y ajoutes un senseur Always et un contrôleur Python, que tu relies ensemble.
3) Tu coches la case "signet" orange du contrôleur. Cela permet de s'assurer que le script soit
exécuter en priorité au lancement du jeu.
4) Tu sélectionnes le script ci-dessus dans le champ correspondant du contrôleur.
De ce fait, ce nouvel objet Empty va exécuter notre script au démarrage du jeu exactement une fois.
Ensuite ton jeu peut continuer comme tu l'entends.
Bon blend et encore merci Matpi
http://blenderclan.tuxfamily.org/html
16/2/2017 3:13:44 / Page
http://blenderclan.tuxfamily.org/html
16/2/2017 3:13:44 / Page