2017-12-27 27 views
0

私はPygameをかなり新しくしています。Pygameスプライトが移動する代わりに複製を作成する

Pygameを使用してPythonでPongを再作成しようとしていますが、私はロードブロッキングを起こしました。ここで

は私のコードです:

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() 

私は、player1を作るためにパドルオブジェクトをしようとしています、押されたキーに応じて上下に移動します。このコードを実行すると、上下の矢印を押した後にplayer1が伸びます。 5ピクセルがplayer1.rectに追加されます。

私は間違っていますが、なぜsprites_list.update()はplayer1を新しい位置に配置しませんか?

+0

追加することです。黒色で塗りつぶす 'window.fill((0,0,0))' – furas

答えて

1

新しいループで要素を描画する前に、画面を消去する必要があります。
ウィンドウを黒色のwindow.fill((0,0,0))で塗りつぶしたり、すべてのループで背景イメージを描くことができます。すなわち -

は、これはあなたの組織再編後のコードとあなたがループ内で新しい要素を描画する前に画面をクリアする必要が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

ありがとう。私はこれを理解して画面をリセットします。 sprites_list.update()の目的は何ですか? sprites_list.draw()をインクルードする必要がありますか? –

+0

'sprites_list.update()'は、 'x'、' y'やその他のもの(アニメーションの次のフレームを選択するなど)を変更することはできるが、描画することはできないすべてのオブジェクトの 'update()'メソッドを実行します。すべてのオブジェクトに対してscreen.blit(self.rect、self.image)を実行するので、オブジェクトだけが描画されます。 'sprites_list.update()'と 'sprites_list.draw()'の間には、他の機能を持つことができます。衝突をチェックすることができます。 – furas

関連する問題