python - 乒乓游戏 tkinter 球与桨问题的碰撞
问题描述
有谁知道如果球不接触桨,我怎么能让球离开屏幕?
这是我遇到问题的行:
# intersection avec les raquettes
elif newX<= hit1:
newX=balle[0]
balle[2]*=-1
这是完整的代码:
from tkinter import *
myHeight=400
myWidth=800
mySpeed=10
def initialiserBalle(dx,dy,rayon,couleur):
b=[myWidth/2,myHeight/2,dx,dy,rayon]
b.append(myCanvas.create_oval(myWidth/2-rayon,myHeight/2-rayon,\
myWidth/2+rayon,myHeight/2+rayon,\
width=2,fill=couleur))
return b
def initialiserRaquette(x,y,largeur,hauteur,couleur):
r=[x,y,0,0,largeur,hauteur]
r.append(myCanvas.create_rectangle(x-largeur/2,y-hauteur/2,\
x+largeur/2,y+hauteur/2,\
width=2,fill=couleur))
return r
def miseAJourBalle():
# calcul de la nouvelle position
newX=balle[0]+balle[2]
newY=balle[1]+balle[3]
hit1=raquette1[0]+raquette1[4]
hit2=raquette2[1]+raquette2[5]
# correction
if newX<0 or newX>=myWidth:
newX=balle[0]
balle[2]*=-1
if newY<0 or newY>=myHeight:
newY=balle[1]
balle[3]*=-1
# intersection avec les raquettes
elif newX<= hit1:
newX=balle[0]
balle[2]*=-1
# mise a jour des coordonnees
balle[0]=newX
balle[1]=newY
# mise a jour de l'element graphique
myCanvas.coords(balle[5],\
balle[0]-balle[4],balle[1]-balle[4],\
balle[0]+balle[4],balle[1]+balle[4])
def miseAJourRaquette(r):
newY=r[1]+r[3]
if newY-r[5]/2<0 or newY+r[5]/2>=myHeight:
newY=r[1]
r[3]=0
r[1]=newY
myCanvas.coords(r[6],\
r[0]-r[4]/2,r[1]-r[5]/2,\
r[0]+r[4]/2,r[1]+r[5]/2)
def animation():
miseAJourBalle()
miseAJourRaquette(raquette1)
miseAJourRaquette(raquette2)
myCanvas.after(mySpeed,animation)
def moveRaquettes(event):
if event.keysym == 'a':
raquette1[3]=-5
if event.keysym == 'q':
raquette1[3]=5
if event.keysym == 'Up':
raquette2[3]=-5
if event.keysym == 'Down':
raquette2[3]=5
def stopRaquettes(event):
if event.keysym == 'a' or event.keysym == 'q':
raquette1[3]=0
if event.keysym == 'Up' or event.keysym == 'Down':
raquette2[3]=0
mainWindow=Tk()
mainWindow.title('Pong')
mainWindow.geometry(str(myWidth)+'x'+str(myHeight))
myCanvas=Canvas(mainWindow,bg='dark grey',height=myHeight,width=myWidth)
myCanvas.pack(side=TOP)
balle=initialiserBalle(5,5,20,'red')
raquette1=initialiserRaquette(60,myHeight/2,40,100,'green')
raquette2=initialiserRaquette(myWidth-60,myHeight/2,40,100,'pink')
mainWindow.bind("<Key>",moveRaquettes)
mainWindow.bind("<KeyRelease>",stopRaquettes)
animation()
mainWindow.mainloop()
解决方案
删除此 if 语句:
if newX<0 or newX>=myWidth:
newX=balle[0]
balle[2]*=-1
这是不允许球超出垂直墙壁的部分
并用这个替换你的miseAJourBalle
函数:
def miseAJourBalle():
# calcul de la nouvelle position
newX=balle[0]+balle[2]
newY=balle[1]+balle[3]
hit1=raquette1[0]+raquette1[4]
hit2=raquette2[1]+raquette2[5]
if newY<0 or newY>=myHeight:
newY=balle[1]
balle[3]*=-1
# intersection avec les raquettes
bbox1 = myCanvas.bbox(raquette1[6])
bbox2 = myCanvas.bbox(raquette2[6])
if newX <= bbox1[2] and (newY>bbox1[1] and newY<bbox1[3]):
newX=balle[0]
balle[2]*=-1
if newX >= bbox2[0] and (newY>bbox2[1] and newY<bbox2[3]):
newX=balle[0]
balle[2]*=-1
# mise a jour des coordonnees
balle[0]=newX
balle[1]=newY
# mise a jour de l'element graphique
myCanvas.coords(balle[5],\
balle[0]-balle[4],balle[1]-balle[4],\
balle[0]+balle[4],balle[1]+balle[4])
bbox 将返回一个描述矩形边界框的元组,用于检查球是否击中矩形。
此外,下次当您发布问题时,请考虑在函数名称旁边添加英文注释,以便我们轻松了解每个函数的作用。翻译应用程序并不总是提供正确的翻译
推荐阅读
- java - IvyIDEA 插件不会下载所有依赖项
- c# - 使用 HttpClient 的 Net Core 测试方法
- python - 当我在 python 中运行 pearson 相关测试时,P 值为 0.0 是否正常
- r - 如何计算R中的轨迹长度
- c++ - Visual Studio 2019 C++ 桌面应用程序;如何制作子窗口?
- intellij-idea - IntelliJ 编辑器显示不正确的错误,使用 JavaFX
- python - Python:生成5个具有固定总和的随机整数(每个都有自己的范围)
- php - 即使有现有产品图像,如何在 WooCommerce 上设置默认产品缩略图?
- javascript - Google APi 客户端打开弹出窗口而不是重定向
- python - 如何确定不带空格的字符串中列表的匹配数?