我在编程方面很陌生,因为它只是作为一个主题被引入我的学校,我需要一些帮助。我的任务是让三个球(矩形图像)在屏幕周围反弹并相互关闭。我有三个球和墙壁的弹跳都很好,但我不知道如何让它们互相反弹。任何帮助将不胜感激,我目前的代码如下:
import pygame
import random
import sys
if __name__ =='__main__':
ball_image1 = 'beachball1.jpg'
ball_image2 = 'beachball2.jpg'
ball_image3 = 'beachball3.jpg'
bounce_sound = 'thump.wav'
width = 800
top = 600
x = 0
y = 0
background_colour = 0,0,0
caption= 'Bouncing Ball animation'
velocity1 = [-1,-1]
velocity2 = [-1,1]
velocity3 = [1,-1]
pygame.init ()
frame = pygame.display.set_mode ((width, top))
pygame.display.set_caption (caption)
ball1= pygame.image.load (ball_image1). convert()
ball2= pygame.image.load (ball_image2). convert()
ball3= pygame.image.load (ball_image3). convert()
ball_boundary_1 = ball2.get_rect (center=(random.randint(50, 750),random.randint(50, 550)))
ball_boundary_2 = ball2.get_rect (center=(random.randint(50, 750),random.randint(50, 550)))
ball_boundary_3 = ball2.get_rect (center=(random.randint(50, 750),random.randint(50, 550)))
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_1.left < 0 or ball_boundary_1.right > width:
sound.play()
velocity1[0] = -velocity1[0]
if ball_boundary_1.top < 0 or ball_boundary_1.bottom > top:
sound.play()
velocity1[1] = -velocity1[1]
if ball_boundary_2.left < 0 or ball_boundary_2.right > width:
sound.play()
velocity2[0] = -velocity2[0]
if ball_boundary_2.top < 0 or ball_boundary_2.bottom > top:
sound.play()
velocity2[1] = -velocity2[1]
if ball_boundary_3.left < 0 or ball_boundary_3.right > width:
sound.play()
velocity3[0] = -velocity3[0]
if ball_boundary_3.top < 0 or ball_boundary_3.bottom > top:
sound.play()
velocity3[1] = -velocity3[1]
ball_boundary_1 = ball_boundary_1.move (velocity1)
ball_boundary_2 = ball_boundary_2.move (velocity2)
ball_boundary_3 = ball_boundary_3.move (velocity3)
frame.fill (background_colour)
frame.blit (ball1, ball_boundary_1)
frame.blit (ball2, ball_boundary_2)
frame.blit (ball3, ball_boundary_3)
pygame.display.flip()
答案 0 :(得分:3)
当两个物体“碰撞”时,它们基本上存在于同一物理空间中,因此您必须检查这一点。在2d,这很好,很容易,特别是对于矩形形状。基本上写一个名为'overlap'的函数,如果两个球发生碰撞,它会返回一个真值。例如:
for (i = 0; i < numberOfBalls; i++) {
for (j = i+1; j < numberOfBalls; j++) {
if (overlap (ball_rect[i], ball_rect[j])) {
// you will need to write this reverse velocity code differently
// to comply with the code above but I recommend that the balls
// go in an array with three elements so that you can index
// them. (Useful in for loops as seen above)
ball_xvelocity[i] *= -1;
ball_xvelocity[j] *= -1;
ball_yvelocity[i] *= -1;
ball_yvelocity[j] *= -1;
}
}
}
我会将重叠功能留给你,但你应该谷歌'rectangluar碰撞检测',你会发现如何。你会发现它真的不那么可怕,并且会让你相信你可以研究和学习编程概念。
N.B。具体没有给出python代码。既然是家庭作业,那么写下答案就是你的工作。对不起,只是一个SO政策。希望这可以帮助。 :)
答案 1 :(得分:1)
你确实在你提供的代码中有一些线索。您检测球是否在墙上弹跳的方式是检查球的顶部边界是否小于0意味着它已经触及顶部边界并且需要反弹以便您改变方向。
所以代码:
if ball_boundary_1.top < 0 or ball_boundary_1.bottom > top:
sound.play()
velocity1[1] = -velocity1[1]
如果球在地板或天花板上反弹,则基本上会改变球的垂直运动。
所以要修改它,你需要问问自己,如果两个球互相反弹,意味着什么......这意味着它们的边界会以多种方式重叠。因此,例如,您可以检查球1的左侧或右侧是否在球2的水平尺寸内,球1的顶部或底部是否在球2的垂直尺寸内,然后两个球接触,因此改变两者的速度球。
答案 2 :(得分:1)
正如我的讲师补充了我对此的具体评估,
一旦第二个球在框架周围弹跳,添加一些代码以改变球碰撞时的方向。 PyGame提供了一个函数,允许您检测两个Rect对象之间是否发生了冲突。该函数名为colliderect,并按以下方式调用。如果两个Rect对象名为ball_boundary_1和ball_boundary_2,则可以检查与以下内容的冲突:
if ball_boundary_1.colliderect(ball_boundary_2): # alter the direction of the balls with the usual method
所以,这将用于检查'是否'发生碰撞,返回True,并运行一些代码来反转速度。祝你好运:D我真的已经完成了这一点但我自己,我即将尝试