2017-03-23 5 views
0

Dans mon code:en vol stationnaire ne fonctionne que sur le premier bouton

class text: 
    def __init__(self, size, message, color, position, button = False, action = None): 
     self.size = size 
     self.message = message 
     self.color = color 
     self.position = position 
     self.text_size = pygame.font.SysFont(None, int(size*displaywidth)) 
     self.Textsurface = self.text_size.render(self.message, True, self.color) 
     Textrect = self.Textsurface.get_rect() 
     self.Textrect = Textrect 
     self.Textwidth = Textrect[2] 
     self.Textheight = Textrect[3] 
     self.second_x_pos = Textrect[2] + position[0] 
     self.second_y_pos = Textrect[3] + position[1] 
     self.button = button 
     self.action = action 



    def display(self): 
     self.Textrect.topleft = (self.position) 
     gameWindow.blit(self.Textsurface, self.Textrect) 




     if self.button == True: 
      self.Textrect.topleft = (self.position) 
      gameWindow.blit(self.Textsurface, self.Textrect) 
      for event in pygame.event.get(): 
       if event.type == pygame.MOUSEMOTION: 
        if self.position[0] < event.pos[0] < self.second_x_pos and self.position[1] < event.pos[1] < self.second_y_pos: 
          print("yee") 
          self.color = white 
          self.Textsurface = self.text_size.render(self.message, True, self.color) 
          gameWindow.blit(self.Textsurface, self.Textrect) 
        else: 

          self.Textsurface = self.text_size.render(self.message, True, self.color) 


        if event.type == pygame.MOUSEBUTTONUP : 

         self.action() 

# menu screen 
    def menu_screen(): 
     global wine 
     global purple 
     menu = True 
     global displaywidth 
     global displayheight 
     global gameWindow 
     global compltely_red 
     global brown 
     global red 




    # Texts 

    menu_txt = text(0.2,"Timm", red, (displaywidth/2,displayheight/9)) 
    Play_txt = text(0.04, "Play ", wine, (displaywidth/7, displayheight/1.5), True, game_loop) 
    parallel_button = displaywidth - (displaywidth/7) - Play_txt.Textwidth 
    Quit_txt = text(0.04, "Quit ", compltely_red, (parallel_button, displayheight/1.5), True, quit_Everything) 




    #loop 

    while menu == True: 


     #the loop 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       quit_Everything() 


      if event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_ESCAPE: 
        quit_Everything() 
       if event.key == pygame.K_f: 
         displaywidth = 1920 
         displayheight = 1080 
         gameWindow = pygame.display.set_mode((displaywidth,displayheight), pygame.FULLSCREEN) 
       if event.key == pygame.K_g: 
         displaywidth = 960 
         displayheight = 960 
         gameWindow = pygame.display.set_mode((displaywidth,displayheight)) 
     gameWindow.fill(green) 

     menu_txt.display() 
     Play_txt.display() 
     Quit_txt.display() 
     pygame.display.update() 

Le premier bouton que j'appelle (le bouton « Play ») fonctionne parfaitement (je ne suis pas encore préoccupé par les actions, ce qui compte pour moi à le moment est le vol stationnaire). Mais le deuxième bouton est très glitchy (quand j'ai inversé l'ordre de la façon dont j'ai appelé les boutons, le premier appelé fonctionne toujours parfaitement)

+0

votre question autre nous demandant de déboguer votre code? –

Répondre

0

D'abord, il n'y a pas de pause entre les "frames" - c'est-à-dire vérification des événements dans votre programme - de sorte que tout est fait aussi vite que le computaer peut le porter, en utilisant 100% de CPU - pire choix. La bonne chose est d'attendre quelques dizaines de millisecondes après l'appel à pygame.display.update - placer un appel comme pygame.time.delay(30) immédiatement après celui-là.

Le code ou y arriver, bien qu'ayant un mauvais desing, fonctionne presque, mais pour une chose - quand vous appelez pygame.event.get il récupère tous les événements dans la file d'attente. Donc, il y a une condition de course n que l'appel à get sur votre mainloop choisit tous les événements - mais en raison de la nature sans pause de votre code, certains événements MOUSEMOTION sont sélectionnés par le second appel, dans la méthode display pour le premier bouton . Lorsque vous placez la pause que j'ai indiquée ci-dessus, même le survol du premier bouton devrait s'arrêter, car cela fonctionne simplement par hasard, et la pause entre les images va corriger cette chance. Maintenant, vous avez deux options - si vous voulez continuer à vérifier les événements dans le code dans les objets, ils ne devraient pas appeler pygame.events.get eux-mêmes - à la place, faire un seul appel à ceci sur chaque image, et affecter le résultat à un variable - les transmettre cette variable en tant que paramètre à tous les lieux d'événements doivent être traités:

sur le code de l'écran de menu faire:

while menu: # 
    #the loop 
    events = pygame.event.get() 
    for event in events: 
     ... 
    gameWindow.fill(green) 
    menu_txt.display(events) 
    Play_txt.display(events) 
    Quit_txt.display(events) 

Et la classe de texte:

def display(self, events): 
    ... 
    if self.button: # Please, just stop checking truthiness doing "x == True" 
     self.Textrect.topleft = (self.position) 
     gameWindow.blit(self.Textsurface, self.Textrect) 
     for event in events: 
      if event.type == pygame.MOUSEMOTION: 

Cela devrait résoudre votre problème et beaucoup de choses sur votre conception. Cependant, notez que ceux-ci ne feront ressortir votre texte que si la souris bouge réellement - si elle est en vol stationnaire, mais sans bouger, aucun événement MOUSEMOTION ne sera généré. Vous pouvez donc vérifier si la position de la souris elle-même est à l'intérieur du bouton rect, au lieu de vérifier les événements - vous obtenez directement la position de la souris, au lieu de dépendre d'un événement. En outre, alors que vous y êtes, vous pourriez préférer utiliser les fonctions de calcul du rectangle de Pygame au lieu de l'expression désagréable aux yeux self.position[0] < event.pos[0] < self.second_x_pos and self.position[1] < event.pos[1] < self.second_y_pos.
Sur __init__:

self.rect = pygame.Rect(self.pos + tuple(Textrect[2:]) 

Et sur la if pour vérifier si le pointeur se trouve à l'intérieur du rect:

def display(self, events): 
    if self.button: 
     if self.rect.contains(pygame.mouse.get_pos() + (1,1)): 
      print("yee") 
      ... 
+0

Je suis extrêmement reconnaissant pour le temps que vous avez passé sur cette réponse très détaillée. – chubel