2009-04-21 12 views
1

Ich habe eine Animation (in Python) für einen Strandball um einen Bildschirm hüpfen codiert. Ich möchte jetzt einen zweiten Ball zum Fenster hinzufügen, und wenn die beiden kollidieren, um sich gegenseitig abzuprallen.Wie füge ich einen zweiten springenden Ball zum Fenster hinzu?

Bisher waren meine Versuche damit nicht erfolgreich. Irgendwelche Ideen wie man das macht? Der Code, den ich bisher habe, ist unten.

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

Antwort

7

Hier ist eine sehr grundlegende Umstrukturierung Ihres Codes. Es könnte immer noch viel aufgeräumt werden, aber es sollte Ihnen zeigen, wie Sie Instanzen der Klasse verwenden können.

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

Sie haben gerade die pygame-Einführung umstrukturiert. http://www.pygame.org/docs/tut/intro/intro.html –

+0

Müssen Sie wirklich pygame an die Funktion __init__ übergeben? – tgray

+0

@tgray: Ich habe es so gemacht, den gleichen Code wie das Beispiel so oft wie möglich zu verwenden. In dem Denken, dass es das OP leichter machen könnte zu verstehen –

3

Sie sollten wahrscheinlich eine Klasse erstellen, um Ihren Beachball zu repräsentieren. Dann würden Sie beliebig viele Instanzen erstellen und die Instanzen in eine Python-Liste einfügen.

Sie würden dann durch diese Liste auf jedem Frame gehen, jedes aktualisieren und Rendern.

Sie müssen eine Methode einbeziehen, um auf Kollision mit einem anderen Ball zu testen (dies ist einfach für Kreise). Wenn eine Kollision erkannt wird, sollten die beteiligten Bälle einen Abprall voneinander weg simulieren.

Verwandte Themen