Ursina Python detecter si une entité est cliquée

Bonjour,

Je débute en python, et j'aimerais savoir comment détecter un clic sur une entité avec ursina. Voici ce que j'ai fait :

from ursina import *
from ursina.prefabs.first_person_controller import FirstPersonController

app = Ursina()

for z in range(10):
    for x in range(10):
        Entity(
            model="cube",
            color=color.white,
            collider="box",
            ignore=True,
            position=(x, 0, z), 
            parent=scene, 
            origin_y= 0.5
        )

class ColorBox(Button):
    def __init__(self, position=(5, 2, 5)):
        super().__init__(
            position=position,
            model="cube", 
            color=color.red,
            parent=scene,
            origin_y= 0.5)
        
        def input(self, key):
            if self.hovered:
                if key == "left mouse down":
                    print('Color Changed')
                    self.color= color.random_color()

ColorBox()
player = FirstPersonController()
app.run()

J'ai l'impression que quoi que je fasse la fonction input n'est pas executée, une idée?

9 réponses

  1. Bonjour,

    La fonction input() est définie en ligne 25, mais elle n'est jamais appelée...

    1. Oui, j'ai remarqué, mais je ne sais pas où l'appeler.

  2. Comment ça, tu as remarqué ça ?

    Ce n'est pas toi qui as écris le code ?

    Tu ne sais pas comment il fonctionne ?

    1. Si, j'ai écrit le code avec une vidéo youtube. Le problème, c'est que je n'ai pas fait exactement la même chose, et mon programme ne marche pas contrairement au sien.

    2. class ColorBox(Button):
          def __init__(self, position=(5, 2, 5)):
              
              r = random.randint(0, 255)
              g = random.randint(0, 255)
              b = random.randint(0, 255)
      
              super().__init__(
                  position=position,
                  model="cube", 
                  color=color.color(r, g, b),
                  parent=scene,
                  origin_y= 0.5)
              
              def input(self):
                  if self.hovered:
                      self.color.color(r, g, b)

      J'ai vite changé, car le changement de couleurs ne marchait pas. Mais je ne sais toujours pas, ni comment, ni où appeler la fonction.

  3. Si tu débutes en Python, tu devrais commencer par des trucs plus simples. Connais tu les bases sur les classes, les fonctions et comment les invoquer ?

    Je ne pratique pas Ursina, mais ta fonction input() est une méthode de la classe ColorBox, et en général, on crée un ou des objets à partir d'une classe et ensuite on leur applique les méthodes utiles

    Exemple :

    class Personne:
        def __init__(self, nom, prenom):
            self.nom = nom
            self.prenom = prenom
    
        def presenter(self) :
            return self.nom + " " + self.prenom
    
    #Création d'une personne:
    p1 = Personne('Jean', 'Transcène')
    
    #appel de la méthode presenter:
    print(p1.presenter())
    1. J'ai trouvé : dans ursina, la fonction input est implicitement utilisée. On n'a pas besoin de l'appeler explicitement. Je l'avais juste indentée trop à droite et elle n'était pas correctement prise en compte dans le button. Merci quand même !

  4. Bonjour,

    (texte original, avant correction) je l'avais juste mise trop a droite et elle n'était pas comptée dans le button

    C'est ce qu'on appelle une erreur d'indentation, si tu vois ce que c'est et à quoi ca sert (de la façon dont tu en parles, on ne dirait pas)

    Comme tu avais fait, la fonction input était à l'intérieur de la fonction __init__. D'où l'intérêt de revoir les bases de Python et de commencer par des trucs simples, au lieu de recopier du code vu sur Youtube

    "Science sans conscience n'est que ruine de l'âme" -- Rabelais

    1. Modérateur

      Bonjour,

      Pour revenir à la question initiale, voir cette discussion.

      Je t'invite toutefois (comme Phil_1857 le dit fort justement) à ne pas mettre la charrue avant les bœufs. Tu ne pourras pas aller bien loin avec ursina tant que tu n'auras pas les bases en python (en particulier tout ce qui est lié à l'indentation), en algorithmique (fonctions, conditions, boucles ...) et en programmation objet (classes, instances, méthodes, ...). Il existe de nombreux tutoriels gratuits en ligne pour découvrir python, ce serait sans doute un bon début.

      Quand ceci sera acquis, il sera temps de travailler avec un module déjà écrit (pourquoi pas ursina), comprendre la documentation et le éventuels bouts de code que tu pourrais trouver sur Internet.

      Si tu décides de faire un patchwork de bouts de codes sans les comprendre et en les bidouillant sans trop comprendre ni comment, ni pourquoi, ton code n'aura rapidement aucun sens et tu n'atteindras pas tes objectifs (voire tu risques de te décourager).

      Après... à toi de voir :-)
      Bonne chance

      1. Bonjour Mamiemando,

        Sympa d'avoir ajouté l'auteur de la citation dans mon message

        Par contre, comment fais-tu pour mettre en forme le texte original en gris

        au début ?

        1. Modérateur

          Hello Phil,

          Sympa d'avoir ajouté l'auteur de la citation dans mon message

          De rien :-)

          Par contre, comment fais-tu pour mettre en forme le texte original en gris

          Avec le bouton "citation", le bouton le plus à droite (avec une icône guillemets) dans la barre de mise en forme des messages.

          Bonne journée

      2. Contributeur

        Bonsoir Phil,

        Heuuu .... serait-ce réservé aux modérateurs ? :-)

        Aussi intrigué que toi, j'ai vérifié et j'ai bien les guillemets en fin de ligne d'icones. Et l'utilise ici pour la première fois.

        Mais peut-être n'est-ce accessible qu'aux modérateurs et contributeurs.

        1. Modérateur

          C'est vrai que ça n'est pas une fonctionnalité à mettre entre toutes les mains :-) Plus sérieusement je vais remonter le bug et on verra ce qu'il se passera.

        2. @mamiemando

          Ouii ce serait bien, car entre répondre à la discussion et commenter, on se perd un peu dans l'historique  :-)

        3. Modérateur
          @Diablo76

          Bonjour, je ne sais pas si vous avez accès à ce forum, mais j'ai ouvert une discussion sur cet aspect ici. Selon brupala et Gadjow, ce fait est déjà connu d'Adraen, mais il n'est pas très clair à mes yeux s'il s'agit d'un choix délibéré ou non, ni les raisons qui sont derrières.