簡體   English   中英

乒乓球游戲 tkinter 球碰撞槳問題

[英]pong game tkinter ball collision with paddle problem

有誰知道如果球 go 不碰到槳,我怎么能把它從屏幕上弄出來?

這是我遇到問題的行:

# 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

這是不允許球到垂直牆外 go 的部分

並將您的miseAJourBalle function 替換為:

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 將返回一個描述矩形邊界框的元組,用於檢查球是否擊中矩形。

此外,下次當您發布問題時,請考慮在 function 名稱旁邊添加英文評論,以便我們可以輕松了解每個 function 的作用。 翻譯應用程序並不總是提供正確的翻譯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM