2010-02-06 10 views
3

Dans le code suivant, il n'y a pas seulement un cercle sur l'écran à un moment donné dans le temps. Je veux corriger cela pour qu'il semble qu'il n'y ait qu'un seul cercle, au lieu de laisser une trace de maculage là où le curseur de la souris a été.Comment se débarrasser des surfaces de pygame?

import pygame,sys 
from pygame.locals import * 
pygame.init() 

screen = pygame.display.set_mode((640,400),0,32) 

radius = 25 
circle = pygame.Surface([radius*2]*2,SRCALPHA,32) 
circle = circle.convert_alpha() 
pygame.draw.circle(circle,(25,46,100),[radius]*2,radius) 

while True: 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 

    screen.blit(circle,(pygame.mouse.get_pos()[0],100)) 

    pygame.display.update() 
    pygame.time.delay(10) 

Répondre

6

Vous devez effacer spécifiquement le cercle avant de le recommencer. En fonction de la complexité de votre scène, vous devrez peut-être essayer différentes méthodes. Généralement ce que je fais est d'avoir une surface "arrière-plan" qui blit à l'écran chaque image puis blit les sprites/autres surfaces dans leurs nouvelles positions (les blits dans Pygame sont très rapides, donc même dans des écrans assez grands je n'ai pas eu problèmes de vitesse en faisant cela). Pour votre code ci-dessus, il suffit simplement d'utiliser surface.fill(COLOR)COLOR est votre couleur de fond; par exemple, (255,255,255) pour le blanc:

# ... 
screen = pygame.display.set_mode((640,400),0,32) 
backgroundColor = (255,255,255) 
# ... 
while True: 
    # ... 
    screen.fill(backgroundColor) 
    screen.blit(circle,(pygame.mouse.get_pos()[0],100)) 
    pygame.display.update() 
    pygame.time.delay(10) 

Modifier en réponse à votre commentaire: Il est possible de le faire d'une manière plus orientée objet.

Vous aurez besoin d'une surface de fond associée à votre écran (j'ai généralement une classe Display ou Map (selon le type de jeu) qui fait cela). Ensuite, faites de votre objet une sous-classe de pygame.sprite. Cela nécessite que vous ayez les attributs self.image et self.rect (l'image étant votre surface et le rect étant un Pygame.rect avec l'emplacement). Ajoutez tous vos sprites à un objet pygame.group. Maintenant, chaque image, vous appelez la méthode draw sur le groupe et, après avoir mis à jour l'affichage (par exemple, avec pygame.display.update()), vous appelez la méthode clear sur le groupe. Cette méthode nécessite que vous fournissiez à la fois la surface de destination (c.-à-d. screen ci-dessus) et une image d'arrière-plan.

Par exemple, votre boucle principale peut ressembler à ceci:

while True: 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 

    circle.rect.center = (pygame.mouse.get_pos()[0],100) 
    circleGroup.draw(screen) 

    pygame.display.update() 
    circleGroup.clear(screen, backgroundSurface) 
    pygame.time.delay(10) 

Voir la documentation sur les classes Sprite et groupe pour plus d'informations.

+0

Cette méthode fonctionne et est efficace, mais y a-t-il une approche plus orientée objet? J'ai l'intention d'en faire un objet de classe, donc je me demandais s'il y avait une autre façon d'utiliser screen.fill (bgColor). – lotsofsloths

Questions connexes