2012-02-11 44 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