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

私はあなたのコードを試していませんが、おそらく動作するようです。あなたの質問は何ですか? –

+0

@GregHewgill、ご意見ありがとうございます、はい、それは動作します、私は編集された質問をしました。 – danihp

答えて

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

を:なぜそれがball_rect ballrectとされていない

私は手動ですべてのものをテストしたいと思いますか?

+0

ball_rectについてありがとう、私はそれを修正します。私はxとyの両方を一度にチェックすると、ボールは同じように戻ってきます。これは私たちが望むものではありません(ボールが右から来て床と衝突した場合、Yコンポーネントのみを変更する必要があります) – danihp

+0

申し訳ありませんもし私が十分に明確でないならば。 xとyを別々にテストする方法はありますが、Rect.contains()は両方の場面でテストを行います。最後に、x回の動きを2回、y回の動きを2回テストしました。だから、私はむしろ私のサンプルコードのように手動で位置をテストしたい – CGGJE

関連する問題