Python 如何确定弹球的运动方向并使其碰撞

Python 如何确定弹球的运动方向并使其碰撞,python,game-physics,collision,Python,Game Physics,Collision,我把这个弹球游戏程序作为课堂作业,我一直在努力解决弹球运动和碰撞问题 第一个问题是,无论用户将哪个方向设置为速度,球只会以特定角度移动 我真的不知道为什么它不应该起作用,根据我的笔记、课堂幻灯片和讨论讲义,它应该没问题。那么有人知道为什么它不起作用吗?我环顾四周,找不到确切的答案。任何帮助都将不胜感激。我被难住了:( 不工作意味着无论用户将弹球设置为朝哪个方向移动,它都只朝一个方向移动(例如,用户将弹球设置为向左移动,弹球设置为向右移动;用户将弹球设置为向上移动,弹球设置为向右移动;等等) 此外

我把这个弹球游戏程序作为课堂作业,我一直在努力解决弹球运动和碰撞问题

第一个问题是,无论用户将哪个方向设置为速度,球只会以特定角度移动

我真的不知道为什么它不应该起作用,根据我的笔记、课堂幻灯片和讨论讲义,它应该没问题。那么有人知道为什么它不起作用吗?我环顾四周,找不到确切的答案。任何帮助都将不胜感激。我被难住了:(

不工作意味着无论用户将弹球设置为朝哪个方向移动,它都只朝一个方向移动(例如,用户将弹球设置为向左移动,弹球设置为向右移动;用户将弹球设置为向上移动,弹球设置为向右移动;等等) 此外,弹球不会与墙壁或任何目标碰撞

Graphics是Graphics.py:

这是碰撞代码(连同速度反转,仅与游戏板的右墙保持碰撞):

def checkHit(球、目标、dispX、dispY、VelX、VelY、hit):#####将定义从循环中拉出,但保留在此处以便于参考
center=ball.getCenter()将弹球的中心定义为一个点
hit=0###用于区分与碰撞的对象
if center.getX()+1 45:#######如果弹球与板的右壁碰撞
VelX=VelX*(-1)####x方向上的速度反转
hit=0###未与目标碰撞
对于射程(1000)内的j:#####1000帧(球在空中不会持续很长时间,只有几秒钟)
vy=vy-9.8重力效应
dx=vx/math.sqrt(vx**2+vy**2)###随时间在x方向上的速度
dy=vy/math.sqrt(vx**2+vy**2)###随着时间的推移,y方向的速度
checkHit(弹球、目标、前1、dx、dy、vx、vy、0)#####在碰撞测试的每个帧上运行函数
弹球。移动(dx,dy)###移动弹球

我不能确定,因为你还没有告诉我们你最有可能从学校获得
图形
模块

尝试将一些<代码>如果语句改为<代码> ELIF < /代码> s。您可能同时评估太多的东西。考虑下面的代码,在这里只需要一个下面的代码>如果< /COD>语句运行,但实际上,它们都在运行:

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
您还定义了
checkHit
每个循环,浪费了系统资源。最好将其从循环中拉出来,放到模块的最顶端


编辑:事实上,上面的例子虽然是真的,但不是很好。想象一下,如果
x
,一个速度大于
5
,一个球就会停止滚动,所以你现在就把
x
改成
0
。然后你立即用第二个
if
语句检查它是否停止了。如果它停止了,就启动mo再次移动(
x==5
或其他)。这意味着球永远不会停止移动,因为无论发生什么,在
if
语句结束时,球总是会再次开始移动


因此,您需要做的是使用
elif
语句而不是第二个
if
,因为除非前面的
if
语句不是
True
,否则不会对
elif
进行评估,我不能肯定,因为您还没有告诉我们您从哪里获得
图形
模块很可能

尝试将一些<代码>如果语句改为<代码> ELIF < /代码> s。您可能同时评估太多的东西。考虑下面的代码,在这里只需要一个下面的代码>如果< /COD>语句运行,但实际上,它们都在运行:

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
您还定义了
checkHit
每个循环,浪费了系统资源。最好将其从循环中拉出来,放到模块的最顶端


编辑:事实上,上面的例子虽然是真的,但不是很好。想象一下,如果
x
,一个速度大于
5
,一个球就会停止滚动,所以你现在就把
x
改成
0
。然后你立即用第二个
if
语句检查它是否停止了。如果它停止了,就启动mo再次移动(
x==5
或其他)。这意味着球永远不会停止移动,因为无论发生什么,在
if
语句结束时,球总是会再次开始移动


因此,您需要做的是使用
elif
语句而不是第二个
if
,因为除非前面的
if
语句不是
True

,否则不会对
elif
进行评估。您提到了“课堂讲稿”。这是作业吗?如果是,请将其标记为。通常,请尽量避免发布整个代码(特别是当我们无法访问必要的模块时,
graphics
),并将其细化为尽可能小的代码块。这会使我们更容易帮助您,并让您自己理解问题。graphics.py在此定义就你的问题而言,“不起作用”。你提到了“课堂讲稿”。这是家庭作业吗?如果是,请贴上这样的标签。通常,尽量避免发布整个代码(特别是当我们无法访问必要的模块,
图形时)并将其细化为尽可能小的代码块。使我们能够更容易地帮助您,并让您自己理解问题。Graphics.py在这里嗯,我尝试将多个“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