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