2009-04-21 12 views
1

私は、ビーチボールがスクリーンの周りを跳ね返るアニメーション(Pythonで)をコーディングしました。私は今、2番目のボールをウィンドウに追加し、2人が衝突してお互いに跳ね返りたいときに使います。2番目のバウンスボールをウィンドウに追加するにはどうすればよいですか?

これまでの私の試みは成功していません。どのようにこれを行うにはどのようなアイデア?私がこれまでに持っているコードは以下の通りです。

import pygame 

import sys 

if __name__ =='__main__': 

    ball_image = 'Beachball.jpg' 
    bounce_sound = 'Thump.wav' 
    width = 800 
    height = 600 
    background_colour = 0,0,0 
    caption= 'Bouncing Ball animation' 
    velocity = [1,1] 
    pygame.init() 
    frame = pygame.display.set_mode ((width, height)) 
    pygame.display.set_caption (caption) 
    ball= pygame.image.load (ball_image). convert() 
    ball_boundary = ball.get_rect (center=(300,300)) 
    sound = pygame.mixer.Sound (bounce_sound) 
    while True: 
     for event in pygame.event.get(): 
      print event 
      if event.type == pygame.QUIT: sys.exit(0) 
     if ball_boundary.left < 0 or ball_boundary.right > width: 
      sound.play() 
      velocity[0] = -1 * velocity[0] 
     if ball_boundary.top < 0 or ball_boundary.bottom > height: 
      sound.play() 
      velocity[1] = -1 * velocity[1] 

     ball_boundary = ball_boundary.move (velocity) 
     frame.fill (background_colour) 
     frame.blit (ball, ball_boundary) 
     pygame.display.flip() 

答えて

7

コードの非常に基本的な再構成は次のとおりです。まだまだ整理されているかもしれませんが、クラスのインスタンスをどのように使用できるかを示す必要があります。

import pygame 
import random 
import sys 

class Ball: 
    def __init__(self,X,Y): 
     self.velocity = [1,1] 
     self.ball_image = pygame.image.load ('Beachball.jpg'). convert() 
     self.ball_boundary = self.ball_image.get_rect (center=(X,Y)) 
     self.sound = pygame.mixer.Sound ('Thump.wav') 

if __name__ =='__main__': 
    width = 800 
    height = 600 
    background_colour = 0,0,0 
    pygame.init() 
    frame = pygame.display.set_mode((width, height)) 
    pygame.display.set_caption("Bouncing Ball animation") 
    num_balls = 1000 
    ball_list = [] 
    for i in range(num_balls): 
     ball_list.append(Ball(random.randint(0, width),random.randint(0, height))) 
    while True: 
     for event in pygame.event.get(): 
      print event 
      if event.type == pygame.QUIT: 
       sys.exit(0) 
     frame.fill (background_colour) 
     for ball in ball_list: 
      if ball.ball_boundary.left < 0 or ball.ball_boundary.right > width: 
       ball.sound.play() 
       ball.velocity[0] = -1 * ball.velocity[0] 
      if ball.ball_boundary.top < 0 or ball.ball_boundary.bottom > height: 
       ball.sound.play() 
       ball.velocity[1] = -1 * ball.velocity[1] 

      ball.ball_boundary = ball.ball_boundary.move (ball.velocity) 
      frame.blit (ball.ball_image, ball.ball_boundary) 
     pygame.display.flip() 
+1

あなたはpygameの紹介をリファクタリングしました。 http://www.pygame.org/docs/tut/intro/intro.html –

+0

本当にpygameを__init__関数に渡す必要がありますか? – tgray

+0

@tgray:できるだけ例と同じコードを使用するようにしました。 OPが理解しやすくなると思っています –

3

おそらくビーチボールを表すクラスを作成する必要があります。次に、インスタンスを好きなだけインスタンス化し、そのインスタンスをPythonリストに入れます。

次に、各フレームのリストを調べて、それぞれを更新してレンダリングします。

他のボールとの衝突をテストする方法を含める必要があります(これは円では簡単です)。衝突が検出された場合、関係するボールは、互いから離れてバウンスをシミュレートする必要があります。

関連する問題