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。您可能同时评估了太多东西或其他东西。考虑以下代码,您只希望运行以下if语句之一,但实际上,所有语句都在运行:

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

如果将第二个更改ifelif,则如果运行第一个语句,则忽略if其余的s: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,一个球会停止滚动,所以你会将xnow 更改为 a 0。然后在第二if条语句之后立即检查它,看看它是否已停止。如果它停止了,请再次开始移动(x == 5或其他)。这意味着球永远不会停止移动,因为无论如何,到if语句结束时,球总是会再次开始移动。

所以你需要做的是使用一个elif语句而不是第二个if,因为除非前一个语句不是,elif否则不会评估。ifTrue

于 2012-07-31T00:39:21.953 回答