[bge] creer des boutons contextuels
Blendie
Inscrit:
26/11/2013 17:01
De 34
Post(s): 39
Bonjour !
Je cherche en ce moment à creer une interface graphique pour un petit jeu qui se joue en mode console que j'ai fait en python.
L'idée est donc simple, il s'agit d'afficher un texte à l'écran, de proposer deux ou trois options à l'aide de boutons clicables, et de varier le texte et les options en fonction du choix du joueur.

Le jeu existe deja en bonne partie en python, et les reponses sont simplement assimilé par le programme à l'aide d'un "input".

Sauf que là, je ne sais pas comment dire à mon script d'attendre que je joueur clic sur un bouton pour continuer à s'executer, ni comment savoir quel bouton est choisis sans passer par des briques logiques.

Je me debrouille en python, et avc le bge, mais combiner les deux... c'est assez nouveau.

Voici un exemple de mon code :

from bge import logic, events 
cont = logic.getCurrentController() 
own = cont.owner 
sc = logic.getCurrentScene() 
obl = sc.objects 
mouse = logic.mouse 

text = obl['Text'] #l'objet texte qui affiche les evenments
opt_1 = obl['txt_but_1'] 
opt_2 = obl['txt_but_2'] 
opt_3 = obl['txt_but_3'] 
cam = obl['Camera'] 
button_1 = obl['back_1'] 
button_2 = obl['back_2'] 
button_3 = obl['back_3'] 

over_2 = button_2.sensors['over_but_2'] #over_but_2 est le nom d'un sensor mouse_over sur le deuxieme bouton 

text['Text'] = 'What will you do next ?' 
opt_1['Text'] = 'Walk' 
opt_2['Text'] = 'Camp' 
opt_3['Text'] = 'Leave' 

if mouse.events[events.LEFTMOUSE] == logic.KX_INPUT_JUST_ACTIVATED and over_2.positive:
   print('camp')


Actuellement, mon if ne fontionne pas. Une idée ?

Contribution le : 24/07/2017 22:46
Créer un fichier PDF de la contribution Imprimer


Re: [bge] creer des boutons contextuels
OverdOzed
Inscrit:
19/03/2016 15:30
De Belgique
Post(s): 2029
Dans mon projet, je pense que tu trouvera ce dont tu as besoin.

Télécharge au moins les fichiers du jeu, ouvres le blend "Tales&legends_main" et cherche après "...sensors.positive" suivit d'un "leftmouse... just_activated".

Ce sera plus simple de te montrer ça dans une situation réelle, je pense.

Et, au passage, n'hésite pas à tester mon jeu, regarde dans le post 1 pour savoir comment l'installer .

Contribution le : 25/07/2017 08:18
Créer un fichier PDF de la contribution Imprimer


Re: [bge] creer des boutons contextuels
Blendie
Inscrit:
26/11/2013 17:01
De 34
Post(s): 39
Bon, j'ai profité d'avoir quelques instant ce midi pour fouiller un peu ton fichier, et j'ai effectivement pus trouver et adapter ma solution :)

Je donne ce que j'ai changé dans mon code si quelqu'un a un jour le même probleme :

def button1(): #où 'Mouse' est un sensor over_any
    if cont.sensors['Mouse'].hitObject == obl['back_2']:
        if logic.mouse.events[events.LEFTMOUSE] == logic.KX_INPUT_JUST_ACTIVATED:
            print('Walk')
    else:
        pass


Bon ya encore quelques trucs à changer mais l'idée est là.

Merci !

Et je test ton jeu dès que j'ai un peu plus le temps

Contribution le : 25/07/2017 10:30
Créer un fichier PDF de la contribution Imprimer


Re: [bge] creer des boutons contextuels
Blendie
Inscrit:
26/11/2013 17:01
De 34
Post(s): 39
J'ai parlé un peu vite...
En fait mon problement, c'est que le script s'execute en une fraction de seconde, et se reset aussitot.

Je veux dire que je souhaiterai qu'a un moment précis, le script se mette en "pause" jusqu'a ce que l'utilisateur clique sur un bouton. Vraiment à la façon d'un input en mode console.

J'avoue etre un peu perdus en ce qui concerne la "temporalité" de l'execution du script, probleme que l'on a pas en mode console.


EDIT - je met un .blend, le probleme se voit tout de suite (bon ya pas les textures, mais c'est pas important ici)
fichier .blend

Contribution le : 25/07/2017 16:58
Créer un fichier PDF de la contribution Imprimer


Re: [bge] creer des boutons contextuels
OverdOzed
Inscrit:
19/03/2016 15:30
De Belgique
Post(s): 2029
Il y a une différence entre la console python et le BGE, c'est que c'est en temps réel: mettre un imput dans le BGE ne fonctionnera pas ou le fera planter.

Ce que tu cherches à faire est une boucle: "Si le joueur clique sur un bouton, tant qu'il n'indique pas un imput (comme une phrase, par exemple, il ne sortira pas de la boucle.". Mais attention, la boucle doit être utilisée prudemment (je fais allusion à la boucle "while", pas à "for") !

Tu peux le faire aussi avec des booléens. Dans le même fichier que je t'ai indiqué, regardes la partie là où tu dois inscrire un nom. "Pour sortir de la boucle", tu dois appuyer sur "enter" (cherche après "enterkey").

Contribution le : 26/07/2017 08:18
Créer un fichier PDF de la contribution Imprimer


Re: [bge] creer des boutons contextuels
Blendie
Inscrit:
26/11/2013 17:01
De 34
Post(s): 39
Oui, c'est bien ce que j'avais compris.
J'ai donc déjà penser au boucle while : mon idée était de mettre un while avec une condition qui ne serait remplie qu'une fois un bouton cliqué.
Mais quand je test ça, le script s'execute toujours en boucle depuis le debut, et agis comme si la boucle était infinis, bloquant...

J'ai bien trouvé dans ton script un "enterkey", mais pas de boucle while.

Contribution le : 26/07/2017 09:37
Créer un fichier PDF de la contribution Imprimer


Re: [bge] creer des boutons contextuels
OverdOzed
Inscrit:
19/03/2016 15:30
De Belgique
Post(s): 2029
En fait, dans ton cas, c'est pas utile de mettre un while, car comment vas-tu y rentrer à la base ? Avec une propriété ? Tu peux donc le faire en booléen (plus sécurisé d’ailleurs).

Au départ, elle est fausse, ce qui te permet de cliquer sur un bouton. Quand c'est fait, tu met ce booléen en vraie et c'est là que tu peux cliquer sur l'un de tes 3 boutons: tant que tu ne le fait pas, tu restes "bloqué" dans ta condition.

Une fois avoir cliqué sur l'un des 3 boutons, tu met la condition fausse pour en sortir.

Contribution le : 26/07/2017 10:58
Créer un fichier PDF de la contribution Imprimer


Re: [bge] creer des boutons contextuels
Blendie
Inscrit:
26/11/2013 17:01
De 34
Post(s): 39
Qu'est ce que tu appelle une boucle booleene ?
Je ne suis pas sur d'avoir bien saisis ton explication

En attendant, j'ai trouvé un moyen de faire fonctionner le bazar en rajoutant une variable stockée sur ma caméra qui contient un identifiant indiquant à quel evenement se situe le joueur.
J'ai aussi donc changer la fonction qui s'execute lors du lancement du script : elle appelle maintenant simplement la fonction qui correspond à cette identifiant.

C'est loin d'être élégant comme solution, mais c'est la seule que je parvient pour le moment à appliquer...

mon code, histoire que ce soit plus clair :

from bge import logic, events
import random
import time

cont = logic.getCurrentController()
own = cont.owner
sc = logic.getCurrentScene()
obl = sc.objects
mouse = logic.mouse

text = obl['Text']
opt_1 = obl['txt_but_1']
opt_2 = obl['txt_but_2']
opt_3 = obl['txt_but_3']
cam = obl['Camera']

button_1 = obl['back_1']
button_2 = obl['back_2']
button_3 = obl['back_3']

#cam['click'] est ici une variable str stcoké sur la camera. Sa valeur au demarrage est 'st'

def button(tx1,ac1,tx2,ac2,tx3,ac3):
        opt_1['Text'] = tx1
        opt_2['Text'] = tx2
        opt_3['Text'] = tx3
        
        if cont.sensors['Mouse'].hitObject == obl['back_1'] and cont.sensors['Clic'].positive:
            print('b1')
            cam['click'] = ac1
        elif cont.sensors['Mouse'].hitObject == obl['back_2'] and cont.sensors['Clic'].positive:
            print('b2')
            cam['click'] = ac2
        elif cont.sensors['Mouse'].hitObject == obl['back_3'] and cont.sensors['Clic'].positive:
            print('b3')
            cam['click'] = ac3
def st():
    text['Text'] = 'What will you do next ?'
    button('walk','walk','camp','camp','','st')

def walk():
    text['Text'] = 'walking'
    button('1','camp','2','camp','3','st')

def camp():
    text['Text'] = 'camping'
    button('1','walk','2','camp','3','st')

def start():
    if cam['click'] == 'st':
        st()
    elif cam['click'] == 'walk':
        walk()
    elif cam['click'] == 'camp':
        camp()
    else:
        pass


start()


(bien sur ici mes fonctions walk() et camp() ne font rien de special, elle sont juste là pour la demonstration.

Contribution le : 26/07/2017 11:46
Créer un fichier PDF de la contribution Imprimer


Re: [bge] creer des boutons contextuels
OverdOzed
Inscrit:
19/03/2016 15:30
De Belgique
Post(s): 2029
Comme ça:

# déroulement avant le choix multiple

# Pour info, le "== True", en python, n'est pas nécessaire. Si la condition doit être fausse, il faut écrire "if not obj['question1']"

if obj['question1'] == True: # tant que je n'ai pas appuyé sur un des 3 boutons, je ne peux sortir de "la boucle".

      if text1 + clic:
         action1
         obj['question1'] = False

      elif text2 + clic:
         action2
         obj['question1'] = False

      elif text3 + clic:
         action3
         obj['question1'] = False
else:
    if suivant.positive + clic:
        obj['question1'] = True


Contribution le : 26/07/2017 12:51
Créer un fichier PDF de la contribution Imprimer


Re: [bge] creer des boutons contextuels
Blendie
Inscrit:
26/11/2013 17:01
De 34
Post(s): 39
Oh, et le if devient une "boucle" car le script est executé en permanence évidement...

Désolé, j'étais à coté de la plaque.

Bon j'ai donc deux solution fonctionelles, je devrait bien pouvoir me debrouiller maintenant !

Merci beaucoup !

Contribution le : 26/07/2017 13:36
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant




Enregistrer votre réponse
Compte*
Nom   Mot de passe   Authentification
Message:*



[Recherche avancée]



Sujets récemment répondus
Forums Sujets Réponses Lus Dernières contributions
The Blender Clan 'tchat Buy (30 Pieces) New Samsung Galaxy Z Fold4 512GB Unlocked $36,570 0 22 Hier 11:09:44
emailychang01 
Hors Sujet !! les tutos de Moonboots    [1][2][3]...[33] 322 53780 02/12 12:16:11
moonboots 
The Blender Clan 'tchat Buy (30 Pcs) iMac M1 24-inch (2021) 8GB 256GB SSD $23,970 Website: www.cutebitelectronics.com 0 699 02/12 10:51:46
emailychang01 
The Blender Clan 'tchat Buy (30 Pcs) Macbook Air M1 13-inch 512GB SSD $22,470 Website: www.cutebitelectronics.com 0 29 01/12 10:07:00
emailychang01 
The Blender Clan 'tchat Buy (30 Pcs) Macbook Pro M2 13-inch 512GB SSD $35,970 Website: www.cutebitelectronics.com 0 33 30/11 10:11:42
emailychang01 
Questions & Réponses Rendu hyyyyyper lent ! 1 74 29/11 10:48:50
moonboots 
The Blender Clan 'tchat Buy (30 Pcs) Apple iPad Air 10.9-inch 256GB Wifi $13,470 : www.cutebitelectronics.com 0 36 29/11 07:54:38
emailychang01 
The Blender Clan 'tchat Buy (30 Pcs ) Apple iPad Mini 8.3-inch 256GB Wifi $11,970 0 54 27/11 12:19:27
emailychang01 
The Blender Clan 'tchat Buy (30 Pieces) New Apple iPad Pro 12.9-Inches 2021 1TB Wifi only $38,970 0 43 26/11 12:30:21
emailychang01 
The Blender Clan 'tchat Buy (30 Pieces) New Apple iPad Pro 11-Inches 2021 1TB Wifi only $32,970 0 66 24/11 03:28:24
emailychang01 
The Blender Clan 'tchat Buy (30 Pieces) New Apple iPhone 13 5G 512GB $20,970 Website: www.cutebitelectronics.com 0 73 22/11 01:26:33
emailychang01 
Questions & Réponses Orienter une texture    [1][2] 11 3992 20/11 12:27:21
moonboots 
The Blender Clan 'tchat Buy (30 Pcs) New Apple iPhone 12 Pro Max 5G 256GB $17,970 Website: www.cutebitelectronics.com 0 1756 16/11 09:36:23
emailychang01 
The Blender Clan 'tchat Buy (20 Pcs) iPad 10.9-inch (2022) 64GB Wifi only $6,980 : www.cutebitelectronics.com 0 84 15/11 12:10:40
emailychang01 
The Blender Clan 'tchat Buy(20 Pcs) iPad Pro 12.9-Inch (2022) 128GB Wifi $17,980 : www.cutebitelectronics.com 0 96 14/11 11:46:55
emailychang01 
Questions & Réponses Modélisation d'après une image en noir & blanc ? 8 380 11/11 15:57:26
moonboots 
The Blender Clan 'tchat Buy (20 Pieces) New Apple iPad Pro 11-Inches (2022) 128GB Wifi only $11,980 0 100 11/11 10:02:44
emailychang01 
The Blender Clan 'tchat Buy (200 Pcs) Insignia - Portable Nugget Icemaker $39,800 Website: www.cutebitelectronics.com 0 85 10/11 08:50:55
emailychang01 
Questions & Réponses ma texture bump glisse pendant animation 2 192 09/11 19:24:41
ALK-chimiste 
The Blender Clan 'tchat Buy (200 Pieces) New Innokin Cool Fire Mini Zenith D22 Kit Original $5,400 0 101 09/11 12:13:21
emailychang01 

Qui est en ligne
61 utilisateur(s) en ligne (dont 50 sur Forums)

Membre(s): 0
Invité(s): 61


plus...
Nouveaux membres
MathiasFul 18/8/2022
VicenteZcl 18/8/2022
OlivaL1007 18/8/2022
Adrian8943 18/8/2022
NorbertoGe 18/8/2022
VeronaKais 18/8/2022
BettieSile 18/8/2022
DarylTier 18/8/2022
BretParkhi 18/8/2022
LeoTrotter 18/8/2022
Dernier Ajout
2020-09-24.jpg

Evènements à venir
Dec 29
Anniversaire d'ebrain
Jan 7
BUG de Lyon
Fev 15
Anniversaire de Dany
plus 231 plus d'élément(s)
 Par Mickaël Guédon [ebrain] © 2003-2021 The Blender Clan - hébergé par TuxFamily - Site déclaré à la CNIL sous le numéro 1155445