2012-02-11 87 views
0

我教计算机编程。对于第一门课程的学生,我正在寻找最简单的算法来改变碰撞方向(使用窗口框架)。这是我的实际代码:最简单的算法来反向冲突方向

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的测试方向。

有些时候,我认为一种方法对学生来说是最容易的,并且会出现一种新的清晰方法。

所有建议,欢迎

一些建议吗?谢谢!

+0

我还没有试过你的代码,但它看起来可能会工作。你有什么问题? – 2012-02-11 20:42:53

+0

@GregHewgill,感谢您的评论,是的,它的工作原理,我编辑过的问题。 – danihp 2012-02-11 20:47:21

回答

1

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

只要你的学生有入门物理学的基础(速度,动量,碰撞),那么你的代码应该是可以理解的。

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

BTW:为什么ballrect而不是ball_rect?

+0

感谢ball_rect,我会解决它。如果我同时检查x和y两个球,球就会以与它相同的方式返回,这不是我们想要的(如果球从右向上并与地面碰撞,那么只应该更改Y分量) – danihp 2012-02-11 22:06:48

+0

对不起如果我不够清楚。单独测试x和y是要走的路,但Rect.contains()将在后台进行测试。最后你测试了两次x运动和y运动两次。这就是为什么我宁愿手动测试我的示例代码中的位置 – CGGJE 2012-02-12 10:54:07