2013-04-15 6 views
0

Salut tous im travailler sur un devoir de devoirs dans lequel je dois créer un jeu de pong solo par le biais de pygame et livewire. J'ai terminé le code pour la plupart, mais j'ai un problème. L'écran ne se met pas à jour et, ce faisant, la palette ne bouge pas et la balle ne rebondit pas. J'ai une méthode de mise à jour à la fois sur la raquette et sur la balle, mais pour une raison quelconque, cela ne fonctionne pas. Voici mon code Merci! MISE À JOUR: J'ai dû refaire quelque chose mais je suis maintenant capable de faire appel aux mes classes et les balles rebondissent mais je ne peux pas bouger la pagaie. Je n'ai aucune idée de pourquoi cela ne fonctionne pas puisque le self.y = games.mouse.y devrait mettre à jour les coordonnées de ma raquette. Voici mon code édité cependant, et merci pour l'aide jusqu'ici!pong programme en python, ne peut pas bouger paddle avec la souris

from livewires import games, color 
import random 

#make screen size 

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

class Paddle(games.Sprite): 

    image = games.load_image("paddle.bmp") 

    def __init__(self): 
     super(Paddle, self).__init__(image = Paddle.image,x = 10, y = games.mouse.y) 
     self.score = games.Text(value = 0, size = 25, color = color.black, 
           top = 20, right = games.screen.width - 8) 

     games.screen.add(self.score) 

     def update(self): 

      self.y = games.mouse.y 

      if self.top < 0: 
       self.top = 0 

      if self.bottom > games.screen.height: 
       self.bottom = games.screen.height 

""" 
      self.check_hit() 

      def check_hit(self): 
       countdown = 0 
       if countdown == 0: 
        for ball in self.overlapping_sprites: 
         self.score.value += 1 
         ball.dat_touch() 
         countdown == 10 
       else: countdown -= 1 
""" 




class Ball(games.Sprite): 

    image = games.load_image("ball.bmp") 
    speed = 2 

    def __init__(self, x = games.screen.height/2, y = games.screen.height/2): 
     super(Ball,self).__init__(image = Ball.image, 
            x = x, y = y, 
            dx = Ball.speed, dy = Ball.speed) 

    def update(self): 
     if self.right > games.screen.width: 
      self.dx = -self.dx 

     if self.bottom > games.screen.height or self.top < 0: 
      self.dy = - self.dy 

     if self.left < 0: 
      self.end_game() 
      self.destroy() 


    #def dat_touch(self): 
     #self.dx = - self.dx 
     #handles paddle touch 
     #doesn't work = game_over 
""" 
     def end_game(self): 

     end_message = games.Message(value = "Game Over", 
            size = 90, 
            color = color.red, 
            x = games.screen.width/2, 
            y = games.screen.height/2, 
            lifetime = 5 * games.screen.fps, 
            after_death = games.screen.quit) 
     games.screen.add(end_message) 

""" 




def main(): 
    wall_image = games.load_image("background.bmp", transparent = False) 
    games.screen.background = wall_image 


    the_ball = Ball() 

    games.screen.add(the_ball) 

    the_paddle = Paddle() 
    games.screen.add(the_paddle) 

    games.mouse.is_visible = False 
    games.screen.event_grab = True 

    games.screen.mainloop() 

main() 
+0

je vais essayer que merci EDIT: J'ai essayé de mettre pygame.display.update() et rien ne s'est passé. Je suppose que cette ligne de code ne fonctionne pas avec livewires. –

+0

Oui. Vous utilisez l'écran livewires, pas l'écran pygame. – PygameNerd

+0

Donc, à tout le moins, la balle/palette DO apparaître sur l'écran. Êtes-vous sûr que les méthodes de mise à jour sont appelées? Essayez de mettre une déclaration d'impression dans la méthode de mise à jour de balle et assurez-vous que cette méthode est effectivement appelée –

Répondre

1

Je vois quelques problèmes ici:

D'abord, vous avez défini votre « Ball » et classes « Paddle », mais vous ne semblent pas être de les utiliser. Au lieu de cela, vous faites ce qui suit dans votre fonction principale():

the_ball=games.Sprite(image=ball_image, 
         x=600, 
         y=250, 
         dx=2, 
         dy=-2) 

En ne définissant ce Sprite, vous utilisez uniquement la logique qui a déjà été défini dans l'objet Sprite LiveWire, ignorant complètement votre balle ou Classe de barre. Au lieu de cela, vous avez probablement voulu créer un objet "Ball" et "Bar". Par exemple, pour créer un objet « Ball », vous changeriez la ligne ci-dessus pour ...

the_ball=Ball(image=ball_image, 
         x=600, 
         y=250, 
         dx=2, 
         dy=-2) 

Donc, vous avez défini une classe de billes, et (en utilisant le code modifié j'ai fourni ci-dessus) vous créerait au ballon à la coordonnée x = 600 et y = 250. Pour que cette boule bouge, les coordonnées x et y devraient changer. Par exemple, pour le déplacer vers les 20 unités de droite, le x devrait passer à 620.

Donc, vous devez considérer comment les coordonnées x et y changent. En regardant à travers le code de LiveWires (parler à votre professeur lors de la prochaine classe à la façon d'accéder au code LiveWires si vous êtes curieux) je lire ce qui suit:

# Some [objects] will, more specifically, move at regular intervals; 
# their classes should subclass Mover (which < Timer) and 
# define a moved method. 

Ainsi, en ce moment, votre classe Ball est seulement héritant de Sprite ...

class Ball(games.Sprite): 

    image = games.load_image("ball.bmp") 
    speed = 2 

    def __init__(self, x = 100, y = 100): 
     super(Ball, self).__init__(image = Ball.image, 
            x = x, y = y, 
            dx = Ball.speed, dy = Ball.speed) 

Essayez de changer cette façon qu'il hérite à la fois Sprite ET Mover ...

class Ball(games.Sprite, games.Mover): 

    image = games.load_image("ball.bmp") 
    speed = 2 

    def __init__(self, x = 100, y = 100): 
     super(Ball, self).__init__(image = Ball.image, 
            x = x, y = y, 
            dx = Ball.speed, dy = Ball.speed) 

ce que vous faites ici est de rendre votre objet non seulement inher c'est la fonctionnalité de la classe "Sprite" (qui gère l'avoir dessiné sur l'écran aux coordonnées fournies) mais aussi hériter de la fonctionnalité de la classe "Mover" (qui change les valeurs x et y basées sur dx et dy).

Espérons que cela vous donnera un début dans ce que vous essayez de faire.

+0

merci j'essaierai vos suggestions –

+0

J'ai mangé pour utiliser les classes et faire rebondir la balle, mais j'ai un problème avec le déplacement de la pagaie.Merci beaucoup pour votre aide –

+1

Etes-vous sûr que la méthode de mise à jour est appelée sur l'objet paddle? Si vous mettez une instruction print dans cette méthode, est-ce que quelque chose est imprimé sur la console? –

Questions connexes