2017-06-04 64 views
1

我試圖在隨機方向移動的屏幕上繪製多個項目。問題是,當我運行程序時,對象閃爍並在屏幕上閃爍,不能順利進行。我很困惑,因爲我只更新一次屏幕,正如SO上的其他帖子所建議的那樣。我的代碼如下:問題描述屏幕上的多個移動項目Pygame

class Game: 
    def __init__(self): 
     self.possible_directions = ["up", "down"] 
     self.speed_down = 800 
     self.speed_up = 0 
     self.asteroid = pygame.image.load("Asteroididadactyl.png") 

    def def draw_asteroid(self, direction): 

     if direction == "down": 
      self.gameDisplay.blit(self.asteroid, (self.options[direction], self.speed_down)) 

      self.speed_down -= 1 


     elif direction == "up": 


      self.gameDisplay.blit(self.asteroid, (self.options[direction], self.speed_up)) 
      self.speed_up += 1 

    def player(self): 

     pygame.init() 
     self.gameDisplay = pygame.display.set_mode((1000, 900)) 

     pygame.display.set_caption("Asteroid belt") 

     while True: 

      for event in pygame.event.get(): 
      #move main object. 


      self.choice = random.choice(self.possible_directions) 

      self.draw_asteroid(self.choice) 

      pygame.display.flip() 
+0

請編輯您的問題並提供[最小,完整且可驗證的示例](https://stackoverflow.com/help/mcve)。 'self.options'丟失,並且每幀不顯示,因此無法觀察閃爍。 – skrx

回答

1

draw_asteroid方法的blit取決於已傳遞的direction小行星圖像,並且由於傳遞的隨機方向上每個幀中,圖像有時在向上的位置被blit(這被稱爲self.speed_up)和其他時間在下位置(self.speed_down),所以它看起來閃爍。

我建議完全更改代碼,而是使用對象或pygame sprites以及速度和位置,您可以在實例化過程中將其設置爲隨機值。然後首先在while循環中完全更新對象,最後將它們粘貼到顯示器上。

編輯:這是一個最簡單的例子(您也可以使用pygame.sprite.Sprite s和sprite組代替列表)。

import sys 
import random 
import pygame as pg 


class Asteroid: 

    def __init__(self): 
     self.image = pg.Surface((50, 50)) 
     self.image.fill((150, 60, 10)) 
     self.pos = pg.math.Vector2(random.randrange(1230), 
            random.randrange(750)) 
     self.vel = pg.math.Vector2(random.uniform(-5, 5), 
            random.uniform(-5, 5)) 

    def update(self): 
     self.pos += self.vel 


class Game: 

    def __init__(self): 
     pg.init() 
     self.screen = pg.display.set_mode((1280, 800)) 
     self.clock = pg.time.Clock() 
     self.bg_color = pg.Color(20, 20, 20) 
     self.asteroids = [Asteroid() for _ in range(10)] 
     self.done = False 

    def run(self): 
     while not self.done: 
      for event in pg.event.get(): 
       if event.type == pg.QUIT: 
        self.done = True 

      for asteroid in self.asteroids: 
       asteroid.update() 

      self.screen.fill(self.bg_color) 
      for asteroid in self.asteroids: 
       self.screen.blit(asteroid.image, asteroid.pos) 

      pg.display.flip() 
      self.clock.tick(30) 


Game().run() 
pg.quit() 
sys.exit() 
+1

非常感謝您的口齒伶俐的解決方案。 – Ajax1234