Как обрабатывать столкновения с координатами?(в питоне) - PullRequest
1 голос
/ 24 апреля 2019

Я программирую Flappy Bird, и я почти закончил, но я скучаю только по одному: столкновениям между птицей и трубами ... Мне удалось убедиться, что если птица упадет на землю или исчезнет изна экране игра окончена (благодаря функции fin ()).Я бы хотел, чтобы игра закончилась, даже если птица касается труб, но я не могу этого сделать, и люди, которые просят об этом, обычно используют Pygame: (.

Заранее благодарю за помощь внадеясь, что решение простое, но я просто не нашел его.

Я пытался управлять только столкновениями (мы видим соответствующую часть в моей программе), но птица останавливается случайным образом ...

Вот картинки из игры (это ссылка на MediaFire для загрузки zip-файла картинок)!

Вот картинки!

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

#Here are the parts supposed to handle collisions ...
    if y1 >= h :
        fin()

    if y1 >= H :
        fin()

    if y0<=h-379.8:
        fin()

    if y0<=h-379.8:
        fin()
#That's the end of the parts supposed to handle collsions...

    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

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

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

def fin():
    pause=0
    if pause==0:
        canvas.after_cancel(mouvement)
        canvas.unbind("<space>",sauter)

def rejouer():
    global tuyx,tuyx2,oisx,oisy,solx,sol2x,score
    tuyx=316
    tuyx2=488
    oisx=67
    oisy=244
    solx=144
    sol2x=432
    score=0



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


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

menu_debut=PhotoImage(file="menu_jeu.png")
M=Button(fenetre,image=menu_debut,relief=FLAT,command=debut)
Menu_w = canvas.create_window(144,256,window=M)

canvas.pack()
canvas.focus_set()

fenetre.mainloop() 

1 Ответ

3 голосов
/ 24 апреля 2019

У вас есть два подхода:

1- Определите, какие координаты проверять на столкновение с периметром птицы, безопасными зонами, верхним и нижним у, шириной труб, движением труб и другими препятствиями.и т. д. все довольно интересно реализовать и проверить, но немного утомительно и подвержено ошибкам.

2- Воспользуйтесь преимуществами холста tkinter и используйте метод find_overlapping(x0, y0, x1, y1), который возвращает кортеж всех элементов, которые перекрывают данный прямоугольник или полностью заключены в негои используйте это, чтобы определить, произошло ли столкновение, возможно, с использованием tag для обозначения препятствий.

Я предлагаю использовать find_overlapping.

, возможно, что-то вродеthis (псевдокод)

obstacles = canvas.find_withtag('obstacle')
for item in canvas.find_overlapping(canvas.coords(bird)):
    if item in obstacles:
        bird.is_dead() 
...