Skip to main content
 首页 » 编程设计

python之如何向窗口添加第二个弹跳球

2025年05月04日10lhb25

我编写了一个动画(用 Python 语言),让沙滩球在屏幕上弹跳。我现在想在窗口中添加第二个球,当两个球碰撞时让它们相互反弹。

到目前为止,我在这方面的尝试没有成功。任何想法如何做到这一点?我目前的代码如下。

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

请您参考如下方法:

这是对您的代码进行的非常基本的重组。它仍然可以整理很多,但它应该向您展示如何使用该类的实例。

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