乒乓球游戏 tkinter 球与球拍碰撞问题
pong game tkinter ball collision with paddle problem
有谁知道如果球没有碰到球拍怎么才能让球飞出屏幕?
这是我遇到问题的行:
# 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 将 return 一个描述矩形边界框的元组,使用它来检查球是否击中了矩形。
还有,下次你post提问的时候,请考虑在函数名旁边加上英文注释,这样我们就可以很容易地知道每个函数的作用。翻译应用并不总能提供正确的翻译
有谁知道如果球没有碰到球拍怎么才能让球飞出屏幕?
这是我遇到问题的行:
# 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 将 return 一个描述矩形边界框的元组,使用它来检查球是否击中了矩形。
还有,下次你post提问的时候,请考虑在函数名旁边加上英文注释,这样我们就可以很容易地知道每个函数的作用。翻译应用并不总能提供正确的翻译