1

クラスの課題としてこのピンボール ゲーム プログラムを作成しましたが、ピンボールの動きと衝突を修正するのに苦労しました。

最初の問題は、ユーザーが速度としてどの方向を設定しても、ボールは特定の角度でしか移動しないことです。

私のメモ、講義のスライド、およびディスカッションの配布資料によると、なぜそれが機能しないのか、私にはまったくわかりません。なぜそれが機能しないのか、誰にも分かりますか?私は周りを見回しましたが、決定的な答えを見つけることができませんでした。どんな助けでも大歓迎です。私は困惑しています:(

動作していないということは、ユーザーがピンボールをどちらの方向に進むように設定しても、一方向にしか進まないことを意味します (たとえば、ユーザーがピンボールを左に進むように設定すると、ピンボールは右に進みます。ユーザーがピンボールを上に進むように設定すると、ピンボールは右に進みます。など)。 ) また、ピンボールが壁やターゲットに衝突していません。

グラフィックスはgraphics.pyです: http://mcsp.wartburg.edu/zelle/python/graphics/graphics/index.html

衝突コードは次のとおりです (速度反転とともに、ゲーム ボードの右壁との衝突のみが保持されます):

def checkHit(ball,target,dispX,dispY,VelX,VelY,hit): ###pulled the definition out of the loop but keeping it here for easier reference
     center = ball.getCenter() ###defines the center of the pinball as a point
     hit = 0 ###used for differentiating between objects collided with
     if center.getX() + 1 <= 45 and center.getX() + 1 + dispX > 45: ####if the pinball collides with the right wall of the board
         VelX = VelX *(-1) ###velocity in the x direction reverses
         hit = 0  ###did not collide with a target

for j in range(1000):####1000 frames (ball isn't expected to last long in the air, only a couple seconds)
     vy = vy - 9.8 ###effect of gravity
     dx = vx / math.sqrt(vx**2 + vy**2) ###speed in x direction over time
     dy = vy / math.sqrt(vx**2 + vy**2) ###speed in y direction over time
     checkHit(pinball,target_front1,dx,dy,vx,vy,0) ####runs function each frame for collision testing
     pinball.move(dx , dy) ###moves pinball
4

1 に答える 1

1

graphicsモジュールをどこから入手したか教えてくれなかったので、はっきりとは言えません。おそらく学校。

ifいくつかのステートメントをelifsに変更してみてください。おそらく、同時に評価しすぎているか何かです。次のステートメントの1ifつだけを実行したいが、実際にはすべてのステートメントが実行されている次のコードを考えてみましょう。

def foo(x):
 if x < 5:
  print 'x is greater than five'
 if x == 10:
  print 'x is 10'

foo(10)

>>> x is greater than 5
>>> x is 10

if2 番目を に変更するelifと、最初のifステートメントが実行されると、残りelifの は無視されます。

def bar(x):
 if x < 5:
  print 'x is greater than five'
 elif x == 10:  #changed this line to an 'elif' 
  print 'x is 10'

bar(10)

>>> x is greater than 5   #only prints once, because the first if statement is True

checkHitまた、すべてのループを定義し、システム リソースを浪費します。それをループから引き出して、モジュールの最上部に入れることをお勧めします。


編集: 実際には、上記の例は真実ですが、あまり良くありません。x速度が よりも大きい場合5、ボールの転がりが止まると想像してください。したがって、x現在を に変更します0if次に、2 番目のステートメントの直後にチェックして、停止しているかどうかを確認します。停止している場合は、再び動き始めます (x == 5または何か)。これは、ボールが動きを止めないことを意味します。なぜなら、ifステートメントの終わりまでに、ボールは常に再び動き始めるからです。

したがって、前のステートメントが でない限り は評価されないため、elif2 番目の の代わりにステートメントを使用する必要があります。ifelififTrue

于 2012-07-31T00:39:21.953 に答える