2017-06-04 10 views
1

ランダムな方向に移動する複数の項目を画面に描画しようとしています。問題は、私がプログラムを実行すると、オブジェクトがスムーズに進まずに、画面上で点滅して点滅することです。私は、SO上の他の投稿で推奨されているように、画面を一度更新するだけで、むしろ困惑しています。私のコードは、以下である:発行画面の複数の移動項目を描画するゲームの

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方法は、渡されたdirectionに応じ小惑星画像をブリット、そして、各フレームのランダムな方向を通過するので、画像が時々呼ばれるアップ位置(にブリットされますself.speed_up)、それ以外の時間は下の位置(self.speed_down)であるため、ちらつきが見られます。

私は、コードを完全に変更し、インスタンス化中にランダムな値に設定できるベロシティと位置のベクトルでオブジェクトやpygameスプライトを使用することをお勧めします。その後、まずwhileループでオブジェクトを更新し、最後にそれらをディスプレイにblitします。

編集:ここには最小の例があります(リストの代わりにpygame.sprite.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

関連する問題