最简单的算法来反转碰撞方向

时间:2012-02-11 20:39:52

标签: pygame collision

我教授计算机编程。对于初级课程的学生,我正在寻找最简单的算法来改变碰撞方向(使用窗框)。这是我的实际代码:

import sys, pygame
pygame.init()
speed_x = 1
speed_y = 1

black = (0, 0, 0)
width, height = 320, 240
size = ( width, height )

screen = pygame.display.set_mode(size)
display_surface = pygame.display.get_surface()
display_rectangle = display_surface.get_rect()

ball_img = pygame.image.load("data/ball.gif")
ball = ball_img.convert_alpha()
ballrect = ball.get_rect()

while 1:
        for event in pygame.event.get():
            if event.type == pygame.QUIT: sys.exit()

        if not display_rectangle.contains( ballrect.move([speed_x, 0]) ):
            speed_x *= -1
        else:
            ballrect = ballrect.move([speed_x, 0])

        if not display_rectangle.contains( ballrect.move([0, speed_y]) ):
            speed_y *= -1
        else:
            ballrect = ballrect.move([0, speed_y])  

        screen.fill(black)
        screen.blit(ball, ballrect)
        pygame.display.flip()
        pygame.time.delay(30)

此代码运行正常,我的问题是,如果有人知道使用contains或任何其他collide pygame测试来反转方向的简单算法或清晰算法。

有些时候,我认为学生最容易采用一种方法,并且会出现一种新的明确方法。

欢迎提出所有建议

一些建议?谢谢!

2 个答案:

答案 0 :(得分:1)

我认为你的方法很好。你的代码使用2向量[speed_x,speed_y]来模拟球的速度。从(水平或垂直)墙上反弹涉及否定向量的适当组成部分。

只要您的学生具有介绍性物理(速度,动量,碰撞)的背景,那么您的代码应该是可以理解的。

答案 1 :(得分:1)

你的代码可能工作正常(我没试过,但看起来很好),但我对此感到好奇。你检查x运动然后检查y运动,这是好的,但是Rect.contains()测试x和y,所以对我来说似乎有点多余。

根据你的学生背景,它会隐藏你正在做的事情。

我想我想手动测试一切:

if display_rectangle.left<=ballrect.left+speed_x or display_rectangle.right<=ballrect.right+speed_x
    speed_x*=-1
if display_rectangle.top<=ballrect.top+speed_y or display_rectangle.bottom<=ballrect.bottom+speed_y
    speed_y*=-1

ballrect.move([speed_x, speed_y])
顺便说一句:为什么它是直立的而不是球直的?