2011-07-01 6 views
0

C'est encore un programme incomplet, mais pour une raison quelconque, la valeur de la zone de texte n'augmente pas quand elle devrait ... Pourquoi est-ce ?? Lorsque le sprite Pizza chevauche le sprite Pan, le score dans la zone de texte est censé augmenter de 10 points. Pourquoi cela ne se produit-il pas?Question de débogage rapide [Python, pygame]

Merci!

''' 
Created on Jul 1, 2011 

@author: ******* Louis 
''' 
#Watch me do. 
from livewires import games, color 
import random 

games.init (screen_width = 640, screen_height = 480, fps = 50) 

#Pizza Class 
class Pizza (games.Sprite): 
    pizzaimage = games.load_image ("pizza.bmp", transparent = True) 
    def __init__(self, x = random.randrange(640), y = 90, dy = 4): 
     super (Pizza, self).__init__(x = x, 
            y = y, 
            image = Pizza.pizzaimage, 
            dy = dy) 

    def handle_caught (self): 
     self.destroy() 


class Pan (games.Sprite): 
    panimage = games.load_image ("pan.bmp", transparent = True) 
    def __init__ (self, x = games.mouse.x, y = games.mouse.y): 
     super (Pan, self).__init__(x = x, 
            y = y, 
            image = Pan.panimage) 
     self.score = 0 
     self.textbox = games.Text (value = str(self.score), 
            size = 20, 
            color = color.black, 
            x = 550, 
            y = 50) 
     games.screen.add(self.textbox) 


    def update (self): #WWWWOW There is actually an *update* method 
     self.x = games.mouse.x 
     self.y = games.mouse.y 

     if self.left < 0: 
      self.left = 0 
     if self.right >640: 
      self.right = 640 
     if self.top < 0: 
      self.top = 0 
     if self.bottom > 480: 
      self.bottom = 480 
     self.check_collision() 

    def check_collision (self): 
     for Pizza in self.overlapping_sprites: 
      self.score = self.score + 10 
      Pizza.handle_caught() 


#main 
def main(): 
    wallbackground = games.load_image ("wall.jpg", transparent = False) 
    games.screen.background = wallbackground 

    games.screen.add(Pizza()) 

    games.screen.add(Pan()) 
    games.mouse.is_visible = False 
    games.screen.event_grab = True 

    games.screen.mainloop() 
main() 

Répondre

5

La zone de texte prend une valeur qui est une chaîne. Lorsque vous créez la zone de texte, vous créez une chaîne à partir de la valeur actuelle de score et définissez le texte sur cette chaîne. Aucune connexion durable entre le score et la zone de texte n'est faite.

La zone de texte a probablement une méthode disponible pour mettre à jour son texte; appelez cette méthode avec la valeur str(self.score) après avoir incrémenté le score.

+0

Hmm ... Je connais une autre façon de le faire qui changerait le score à l'attribut self.textbox.value = _____ Mais j'étais plus concerné par la logique de la chose. Pourquoi le score ne changerait-il pas? La variable est la même qui s'incrémente, et le mainloop() à la fin de tout le code boucle sans fin le code comme c'est nécessaire pour tous les jeux de ce genre ... Donc j'apprécierais vraiment si vous pouviez expliquer la logique . – Louis93

+1

La zone de texte est créée dans la fonction '__init__' de Pan - c'est-à-dire, une fois pour chaque objet Pan créé. C'est le seul endroit où la valeur de la zone de texte est définie. Il est important de réaliser que 'str (self.score)' est une chaîne immuable construite sur la base de la valeur numérique actuelle de 'self.score' au moment de la création de Pan. C'est une chose très différente de la variable nommée par 'self.score'. Les chaînes en python sont également immuables, donc même si vous avez créé un membre de chaîne de Pan pour contenir la représentation sous forme de chaîne de la partition, et la zone de texte pointée dessus, elle ne serait toujours pas mise à jour automatiquement. –

+0

bonne réponse, merci. – Louis93