简体   繁体   English

如何使用Tkinter在屏幕上显示游戏?

[英]How to display a game over screen with Tkinter?

I'm programming a Flappy Bird clone but whatever I do, I can not display a game over screen if the bird touches the pipes. 我正在编写“飞扬的小鸟”克隆,但无论如何,如果小鸟碰到管道,我都无法在屏幕上显示游戏。 I did not think it was going to be difficult but it is. 我不认为这会很困难,但确实如此。 I managed to get a start screen with the debut and rapide function and canvas.delete ... However, I do not know how to do the opposite: display images / buttons or text if the game is over. 我设法获得了具有首次亮相和快速播放功能以及canvas.delete的启动屏幕...但是,我不知道该怎么做:如果游戏结束,则显示图像/按钮或文本。

Thank you in advance for your help in hopes that the solution is simple but I just did not find it. 预先感谢您的帮助,希望该解决方案很简单,但我没有找到。

I tried to manage the image displays but the images just do not appear ... 我试图管理图像显示,但是图像却没有出现...

Here are the pictures of the game (it's a mediafire link to download the zip file of the pictures)! 这是游戏的图片(这是一个Mediafire链接,用于下载图片的zip文件)!

Here are the pictures 这是图片


from tkinter import *
import random
from random import randint

def sauter(event):
    canvas.move(image_oiseau, 0, -10*DY)

def deplacement():
    global mouvement
    global tuyx,tuyx2,h,H,oisx,oisy,solx,sol2x,score

    x0, y0, x1, y1 = canvas.bbox(image_oiseau)
    if y1 < 416 :
        canvas.move(image_oiseau, 0, DY)

    else :
        fin()

    if y1<=-5:
        fin()

    canvas.coords(image_sol,solx,512)  
    if solx >= -144:
        solx=solx-5
    else:
        solx=144

    canvas.coords(image_sol2,sol2x,512)
    if sol2x >= 144:
        sol2x=sol2x-5
    else:
        sol2x=432

    canvas.coords(image_tuyau_haut,tuyx,h)
    canvas.coords(image_tuyau_bas,tuyx,h-379.8)
    if tuyx>=-28:
        tuyx=tuyx-5
    else:
        tuyx=316
        h=randint(272,523)
        score+=1

    canvas.coords(image_tuyau_haut2,tuyx2,H)
    canvas.coords(image_tuyau_bas2,tuyx2,H-379.8)
    if tuyx2>=-28:
        tuyx2=tuyx2-5
    else:
        tuyx2=316
        H=randint(272,523)
        score+=1

    collision()

    lscore.config(text=str(score))    
    mouvement =canvas.after(40,deplacement)    

def collision():
    global liste_coords
    x0, y0, x1, y1 = canvas.bbox(image_oiseau)
    liste_coords=canvas.coords(image_oiseau)
    liste_items=canvas.find_overlapping(x0,y0,x1,y1)
    test_collision=False
    if len(liste_items)>3:
        for x in liste_items :
            if x != image_oiseau:
                test_collision=True
                break
    if test_collision==True:
        fin()       

def debut():
    pause=1 
    if pause==1:
        deplacement()
        canvas.bind("<space>",sauter)
        Eclair.destroy()
        Jouer.destroy()
        canvas.delete(image_menu_jeu)

def rapide():
    debut()
    debut()
    Eclair.destroy()
    Jouer.destroy()
    canvas.delete(image_menu_jeu)


def rejouer():
    global tuyx,tuyx2,oisx,oisy,solx,sol2x,score,finx,finy
    tuyx=316
    tuyx2=488
    oisx=67
    oisy=244
    solx=144
    sol2x=432
    score=0 
    finx=1000
    finy=1000
    canvas.coords(image_menu_fin,finx,finy)

def fin():
    pause=0
    if pause==0:
        canvas.after_cancel(mouvement)
        canvas.unbind("<space>",sauter)
        finx=144
        finy=256
        canvas.coords(image_menu_fin,finx,finy)

def debut2():
    pause=1 
    if pause==1:
        rejouer()
        deplacement()
        canvas.bind("<space>",sauter)

def rapide2():
    debut2()
    debut2()

LARGEUR = 286
HAUTEUR = 510
DY = 5
tuyx=316
tuyx2=488 
h=randint(272,523)
H=randint(272,523)
oisx=67
oisy=244
solx=144
sol2x=432
score=0
mouvement=None
finx=1000
finy=1000

fenetre = Tk()
canvas = Canvas(fenetre, width=LARGEUR, height=HAUTEUR)

fond = PhotoImage(file="background-day.png")
fond2 = PhotoImage(file="background-night.png")
fond=[fond,fond2]
F= random.choice(fond)
canvas.create_image(144,256, anchor=CENTER,image=F)

tuyau_haut = PhotoImage(file="tuyau_vers_le_haut.png")
image_tuyau_haut = canvas.create_image(tuyx,h,anchor=CENTER,image=tuyau_haut)
image_tuyau_haut2 = canvas.create_image(tuyx2,H,anchor=CENTER,image=tuyau_haut)

tuyau_bas = PhotoImage(file="tuyau_vers_le_bas.png")
image_tuyau_bas = canvas.create_image(tuyx,h,anchor=CENTER,image=tuyau_bas)
image_tuyau_bas2 = canvas.create_image(tuyx2,H,anchor=CENTER,image=tuyau_bas)

sol = PhotoImage(file="sol-day.png")
image_sol = canvas.create_image(144,512, anchor=S,image=sol)
image_sol2 = canvas.create_image(432,512, anchor=S,image=sol)

oiseau = PhotoImage(file="yellowbird-midflap.png")
oiseau2 = PhotoImage(file="bluebird-midflap.png")
oiseau3 = PhotoImage(file="redbird-midflap.png")
oiseau=[oiseau,oiseau2,oiseau3]
O=random.choice(oiseau)
image_oiseau=canvas.create_image(oisx,oisy, anchor=W,image=O) 

lscore=Label(fenetre,text='0')
lscore.pack()

bouton_play=PhotoImage(file="bouton_play.gif")
Jouer=Button(fenetre,image=bouton_play,relief=FLAT,borderwidth=0,highlightthickness=0,command=debut)
canvas.create_window(77.55,364,window=Jouer)

bouton_eclair=PhotoImage(file="bouton_eclair.gif")
Eclair=Button(fenetre,image=bouton_eclair,relief=FLAT,borderwidth=0,highlightthickness=0,command=rapide)
canvas.create_window(210.45,364,window=Eclair)  

bouton_quitter=PhotoImage(file="bouton_quitter.png")
Quitter=Button(fenetre,image=bouton_quitter,relief=FLAT,borderwidth=0,highlightthickness=0,command=fenetre.destroy)
canvas.create_window(255.5,29.63,window=Quitter) 

menu_jeu = PhotoImage(file="menu_jeu.png")
image_menu_jeu = canvas.create_image(144,256,anchor=CENTER,image=menu_jeu)

menu_fin = PhotoImage(file="menu_fin.png")
image_menu_fin = canvas.create_image((finx,finy),anchor=CENTER,image=menu_fin)

canvas.pack()
canvas.focus_set()


fenetre.mainloop() 

You have use canvas.unbind("<space>") instead of canvas.unbind("<space>",sauter) which gives error message. 您已经使用canvas.unbind("<space>")而不是canvas.unbind("<space>",sauter)给出了错误消息。 Now you should see Game Over image. 现在,您应该看到Game Over图片。


Pipes are stil moving. 管道还在移动。

You need global pause in fin() , debut() , debut2() . 您需要在fin()debut()debut2() global pause
And use pause in deplacement to stop animation. 并在deplacement使用pause来停止动画。

if pause == 1:
    mouvement = canvas.after(40,deplacement)

You use after_cancel to stop it but it can't stop running function. 您可以使用after_cancel将其停止,但无法停止运行功能。 It removes function from list of functions waiting for execution. 它将功能从等待执行的功能列表中删除。 But deplacement may run in the moment when you use after_cancel and it will use after() after your after_cancel - so it will not stop. 但是deplacement可能会在您使用after_cancel的瞬间运行,并且它将在after_cancel之后使用after() -因此不会停止。


Instead of pause = 0 , pause = 1 you could use pause = False , pause = True 可以使用pause = Falsepause = True代替pause = 0pause = 1


Full code: 完整代码:

from tkinter import *
import random
from random import randint

def sauter(event):
    canvas.move(image_oiseau, 0, -10*DY)

def deplacement():
    global mouvement
    global tuyx,tuyx2,h,H,oisx,oisy,solx,sol2x,score

    x0, y0, x1, y1 = canvas.bbox(image_oiseau)
    if y1 < 416 :
        canvas.move(image_oiseau, 0, DY)

    else :
        fin()

    if y1<=-5:
        fin()

    canvas.coords(image_sol,solx,512)
    if solx >= -144:
        solx=solx-5
    else:
        solx=144

    canvas.coords(image_sol2,sol2x,512)
    if sol2x >= 144:
        sol2x=sol2x-5
    else:
        sol2x=432

    canvas.coords(image_tuyau_haut,tuyx,h)
    canvas.coords(image_tuyau_bas,tuyx,h-379.8)
    if tuyx>=-28:
        tuyx=tuyx-5
    else:
        tuyx=316
        h=randint(272,523)
        score+=1

    canvas.coords(image_tuyau_haut2,tuyx2,H)
    canvas.coords(image_tuyau_bas2,tuyx2,H-379.8)
    if tuyx2>=-28:
        tuyx2=tuyx2-5
    else:
        tuyx2=316
        H=randint(272,523)
        score+=1

    collision()

    lscore.config(text=str(score))
    if pause == 1:
        mouvement = canvas.after(40,deplacement)

def collision():
    global liste_coords
    x0, y0, x1, y1 = canvas.bbox(image_oiseau)
    liste_coords=canvas.coords(image_oiseau)
    liste_items=canvas.find_overlapping(x0,y0,x1,y1)
    test_collision=False
    if len(liste_items)>3:
        for x in liste_items :
            if x != image_oiseau:
                test_collision=True
                break
    if test_collision==True:
        fin()

def debut():
    global pause
    pause=1
    if pause==1:
        deplacement()
        canvas.bind("<space>",sauter)
        Eclair.destroy()
        Jouer.destroy()
        canvas.delete(image_menu_jeu)

def rapide():
    debut()
    debut()
    Eclair.destroy()
    Jouer.destroy()
    canvas.delete(image_menu_jeu)


def rejouer():
    global tuyx,tuyx2,oisx,oisy,solx,sol2x,score,finx,finy
    tuyx=316
    tuyx2=488
    oisx=67
    oisy=244
    solx=144
    sol2x=432
    score=0
    finx=1000
    finy=1000
    canvas.coords(image_menu_fin,finx,finy)

def fin():
    global pause
    pause=0
    if pause==0:
        canvas.after_cancel(mouvement)
        canvas.unbind("<space>")#,sauter)
        finx=144
        finy=256
        canvas.coords(image_menu_fin,finx,finy)

def debut2():
    global pause
    pause=1
    if pause==1:
        rejouer()
        deplacement()
        canvas.bind("<space>",sauter)

def rapide2():
    debut2()
    debut2()

LARGEUR = 286
HAUTEUR = 510
DY = 5
tuyx=316
tuyx2=488
h=randint(272,523)
H=randint(272,523)
oisx=67
oisy=244
solx=144
sol2x=432
score=0
mouvement=None
finx=1000
finy=1000
pause=1
fenetre = Tk()
canvas = Canvas(fenetre, width=LARGEUR, height=HAUTEUR)

fond = PhotoImage(file="background-day.png")
fond2 = PhotoImage(file="background-night.png")
fond=[fond,fond2]
F= random.choice(fond)
canvas.create_image(144,256, anchor=CENTER,image=F)

tuyau_haut = PhotoImage(file="tuyau_vers_le_haut.png")
image_tuyau_haut = canvas.create_image(tuyx,h,anchor=CENTER,image=tuyau_haut)
image_tuyau_haut2 = canvas.create_image(tuyx2,H,anchor=CENTER,image=tuyau_haut)

tuyau_bas = PhotoImage(file="tuyau_vers_le_bas.png")
image_tuyau_bas = canvas.create_image(tuyx,h,anchor=CENTER,image=tuyau_bas)
image_tuyau_bas2 = canvas.create_image(tuyx2,H,anchor=CENTER,image=tuyau_bas)

sol = PhotoImage(file="sol-day.png")
image_sol = canvas.create_image(144,512, anchor=S,image=sol)
image_sol2 = canvas.create_image(432,512, anchor=S,image=sol)

oiseau = PhotoImage(file="yellowbird-midflap.png")
oiseau2 = PhotoImage(file="bluebird-midflap.png")
oiseau3 = PhotoImage(file="redbird-midflap.png")
oiseau=[oiseau,oiseau2,oiseau3]
O=random.choice(oiseau)
image_oiseau=canvas.create_image(oisx,oisy, anchor=W,image=O)

lscore=Label(fenetre,text='0')
lscore.pack()

bouton_play=PhotoImage(file="bouton_play.gif")
Jouer=Button(fenetre,image=bouton_play,relief=FLAT,borderwidth=0,highlightthickness=0,command=debut)
canvas.create_window(77.55,364,window=Jouer)

bouton_eclair=PhotoImage(file="bouton_eclair.gif")
Eclair=Button(fenetre,image=bouton_eclair,relief=FLAT,borderwidth=0,highlightthickness=0,command=rapide)
canvas.create_window(210.45,364,window=Eclair)

bouton_quitter=PhotoImage(file="bouton_quitter.png")
Quitter=Button(fenetre,image=bouton_quitter,relief=FLAT,borderwidth=0,highlightthickness=0,command=fenetre.destroy)
canvas.create_window(255.5,29.63,window=Quitter)

menu_jeu = PhotoImage(file="menu_jeu.png")
image_menu_jeu = canvas.create_image(144,256,anchor=CENTER,image=menu_jeu)

menu_fin = PhotoImage(file="menu_fin.png")
image_menu_fin = canvas.create_image((finx,finy),anchor=CENTER,image=menu_fin)

canvas.pack()
canvas.focus_set()


fenetre.mainloop()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM