2017-08-07 1 views
1

J'essaye de faire une sorte d'effet de pluie en Python en utilisant pygame et classes. Je ne suis pas habitué à la POO et je ne sais pas ce que je fais mal. La goutte gèle juste en haut de l'écran. Ceci est mon code:Python 3.x pygame Rain

import pygame 
import random 

pygame.init() 
width = 400 
height = 300 
screen = pygame.display.set_mode((width, height)) 
background = pygame.Surface(screen.get_size()) 
background.fill((230, 230, 250)) 
background = background.convert() 

x = random.randint(0,width) 
y= random.randint(-20,-3) 
yspeed = random.randint(1,5) 
class Drop(object): 
    def __init__(self): 
     self.x=x 
     self.y=y 
     self.yspeed=yspeed 
    def fall(self): 
     self.y+=self.yspeed 

    def show(self): 
     pygame.draw.line(background, (138, 43, 226), (self.x, self.y), (self.x, self.y + 10)) 
     screen.blit(background, (0, 0)) 
drop=Drop() 
drop.fall() 
drop.show() 

mainloop = True 
FPS= 30 
clock = pygame.time.Clock() 

while mainloop: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      mainloop = False 
    pygame.display.flip() 
    clock.tick(FPS) 

Je viens de commencer à travailler dans pygame et python de sorte que toute aide serait super.

+0

Est-ce votre premier projet? Si c'est le cas, je recommanderais d'abord de faire un jeu basé sur le texte (vous pouvez suivre votre propre chemin.) –

+0

Pourquoi n'avez-vous pas les arguments 'x',' y', et 'yspeed' pour votre' __init __() 'Fonction comme actuellement toutes ces variables resteront indéfinies –

+0

Savez-vous quelle ligne spécifiquement le programme se fige? Si vous mettez une instruction print dans le code à des fins de débogage, cela s'affichera-t-il? – SeeDerekEngineer

Répondre

0

Je vois quelques problèmes avec ce code, le premier étant votre utilisation des variables x, y, et yspeed dans votre classe mais ne prenant pas ces valeurs en arguments. Pour résoudre ce problème modifier la définition de votre classe:

class Drop(object): 
    def __init__(self, x, y, yspeed): 
     self.x=x 
     self.y=y 
     self.yspeed=yspeed 
    def fall(self): 
     self.y+=self.yspeed 
    def show(self): 
     pygame.draw.line(background, (138, 43, 226), (self.x, self.y), (self.x, self.y + 10)) 
     screen.blit(background, (0, 0)) 

Et puis lors de la création gouttes faire:

drop = Drop(x,y,yspeed) 

En outre, la raison pour laquelle la chute est gelée est que vous exécutez drop.fall() puis drop.show() une fois, ce qui signifie que ce code est exécuté une seule fois, dessinant ainsi votre goutte et s'arrêtant. Au lieu de cela, vous devez ajouter ceci à la boucle while que vous avez exécutée en bas, en fait c'est là que tout le code répétitif devrait aller dans votre programme.

+0

Merci beaucoup, maintenant ça marche! –

+0

Salut @Raluca Pelin si cela ou une réponse a résolu votre question s'il vous plaît envisager [acceptant] (https://meta.stackexchange.com/q/5234/179419) en cliquant sur la coche. Ceci indique à la communauté plus large que vous avez trouvé une solution et donne une certaine réputation à la fois le répondeur et vous-même. Il n'y a aucune obligation de le faire. –