2017-12-27 8 views
0

Ich bin ziemlich neu zu Pygame.Pygame Sprite, Duplikat erzeugend, anstatt sich zu bewegen

Ich versuche Pong in Python mit Pygame neu zu erstellen, aber ich habe einen Roadblock getroffen.

Hier ist mein Code:

import pygame 

pygame.init() 
UP = "up" 
DOWN = "down" 
white = (255,255,255) 
black = (0,0,0) 
pygame.mouse.set_visible(True) 

resolution = (800,600) 
window = pygame.display.set_mode(resolution) 
pygame.display.set_caption("Pong!") 
clock = pygame.time.Clock() 


sprites_list = pygame.sprite.Group() 


running = True 


class Paddle(pygame.sprite.Sprite): 
    def __init__(self): 
     super().__init__() 

     self.image = pygame.Surface((25,100)) 
     self.image.fill(white) 

     pygame.draw.rect(self.image,white, (0,0,25,100)) 

     self.rect = self.image.get_rect() 

    def move(self,direction,pixels): 
     if direction == DOWN: 
      self.rect.y -= pixels 
     if direction == UP: 
      self.rect.y += pixels 

player1 = Paddle() 

player1.rect.x = 0 
player1.rect.y = 200 



sprites_list.add(player1) 

while running: 


    for event in pygame.event.get(): 

     if event.type == pygame.QUIT: 
      running = False 

    keys = pygame.key.get_pressed() 
    if keys[pygame.K_DOWN]: 
     player1.move(DOWN, 5) 
    if keys[pygame.K_UP]: 
     player1.move(UP, 5) 

    sprites_list.update() 

    sprites_list.draw(window) 


    pygame.display.flip() 
    clock.tick(60) 

pygame.quit() 

Ich versuche player1, ein Paddel-Objekt zu machen, nach oben oder unten, je nach dem Taste gedrückt wird. Wenn ich diesen Code ausführe, wird player1 ausgestreckt, nachdem die Aufwärts- oder Abwärtspfeile gedrückt wurden. 5 Pixel werden auf player1.rect hinzugefügt.

Was mache ich falsch und warum wird sprites_list.update() player1 nicht in seine neue Position bringen?

+0

Sie Bildschirm löschen, bevor Sie neues Element in Schleife ziehen - dh. fülle mit schwarzer Farbe 'window.fill ((0,0,0))' – furas

Antwort

1

Sie müssen den Bildschirm löschen, bevor Sie Elemente in der neuen Schleife zeichnen.
Sie können Fenster mit schwarzer Farbe window.fill((0,0,0)) füllen oder Hintergrundbild in jeder Schleife zeichnen.

Dies ist der Code nach der Reorganisation und das Hinzufügen von window.fill(BLACK)

import pygame 

# --- constants --- (UPPER_CASE_NAMES) 

WHITE = (255, 255, 255) 
BLACK = (0, 0, 0) 

UP = "up" 
DOWN = "down" 

SCREEN_WIDTH = 800 
SCREEN_HEIGHT = 600 

# --- classes ---- (CamelCaseNames) 

class Paddle(pygame.sprite.Sprite): 

    def __init__(self): 
     super().__init__() 

     self.image = pygame.Surface((25,100)) 
     self.image.fill(WHITE) 

     # you don't have to draw white rect if all surface already is white 
     #pygame.draw.rect(self.image,white, (0,0,25,100)) 

     self.rect = self.image.get_rect() 

    def move(self, direction, pixels): 
     if direction == DOWN: 
      self.rect.y += pixels 
     if direction == UP: 
      self.rect.y -= pixels 

# --- functions --- (lower_case_names) 

# empty 

# --- main --- (lower_case_names) 

# - init - 

pygame.init() 
pygame.mouse.set_visible(True) 
window = pygame.display.set_mode(resolution) 
pygame.display.set_caption("Pong!") 

# - objects - 

sprites_list = pygame.sprite.Group() 

player1 = Paddle() 
player1.rect.x = 0 
player1.rect.y = 200 

sprites_list.add(player1) 

# - mainloop - 

clock = pygame.time.Clock() 

running = True 

while running: 

    # - events - 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      running = False 

    keys = pygame.key.get_pressed() 

    if keys[pygame.K_DOWN]: 
     player1.move(DOWN, 5) 
    if keys[pygame.K_UP]: 
     player1.move(UP, 5) 

    # - updates (without draws) - 

    sprites_list.update() 

    # - draws (without updates) - 

    window.fill(BLACK) # <--- clear screen 

    sprites_list.draw(window) 

    pygame.display.flip() 
    clock.tick(60) 

# - end - 

pygame.quit() 
+0

Danke. Ich verstehe das, um den Bildschirm zurückzusetzen. Was ist der Zweck von sprites_list.update()? Ist es erforderlich, wenn ich sprites_list.draw() einschließe? –

+0

'sprites_list.update()' führt die Methode 'update()' in jedem Objekt aus, die 'x',' y' oder andere Dinge ändern kann (wie das nächste Bild der Animation auswählen), aber nicht zeichnen 'sprites_list.draw() 'does 'screen.blit (self.rect, self.image) für jedes Objekt, so dass es nur Objekte zeichnet. Zwischen 'sprites_list.update()' und 'sprites_list.draw()' können Sie andere Funktionen haben - dh. Sie können Kollisionen überprüfen. – furas