【问题标题】:pong game tkinter ball collision with paddle problem乒乓游戏 tkinter 球与桨问题的碰撞
【发布时间】:2021-03-13 02:23:01
【问题描述】:

有谁知道如果球没有碰到球拍,我怎样才能让球离开屏幕?

这是我遇到问题的行:

# 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()


【问题讨论】:

    标签: python python-3.x tkinter pong


    【解决方案1】:

    删除这个 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 将返回一个描述矩形边界框的元组,用它来检查球是否击中了矩形。

    另外,下次当您发布问题时,请考虑在函数名称旁边添加英文 cmets,以便我们轻松了解每个函数的作用。翻译应用并不总是提供正确的翻译

    【讨论】:

    • 好的,谢谢你的帮助,你知道如何添加分数跟踪器吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多