Tkinter - První hra
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Tkinter - První hraTkinter - První hra

 

Tkinter - První hra

Google       Google       20. 6. 2007       20 338×

V dnešní lekci si vysvětlíme některé vlastnosti udělátka Canvas a vytvoříme si hru, ve které budeme sestřelovat letadla.

Dnes si vytvoříme hru, ve které budou donekonečna létat letadla a my je budeme muset sestřelit. Takže to dnes bude o udělátku Canvas a jeho metodách. Pro úplnost přikládám seznam všech metod a nastavení udělátka Canvas. A takto asi bude náš výtvor vypadat:

Seznam použitých metod

Tk.after(cas, akce)

Tato metoda se sice netýká udělátka Canvas, ale v našem programu bude plnit nemalou roli. Pomocí této metody můžete za určitý čas zavolat funkci:


okno.after(1000, funkce)
Pozor, čas se zadává v milisekundách.

Canvas.move(objekt, x,y)

Posune objekt na plátně o x a y souřadnicí.

self.platno.move(objekt,20,0)#pohne objektem o 20 pixelů doprava
self.platno.move(objekt,−5,5)#pohne objektem o 5 pixelů doleva a o 5 pixelů dolů

Canvas.create_image(x,y,obrázek,tags=())

Vytvoří obrázek na souřadnicích x a y.

self.obr=PhotoImage(file="ufo.gif")#nebo se dá použít modul PIL
self.platno.create_image(10,10,image=self.obr)

Canvas.coords(objekt)

Tato funkce umožňuje přesunout nějaký objekt na vámi zadané souřadnice, nebo získat aktuální souřadnice objektu:

objekt=self.platno.create_rectangle(10,10,20,20,fill="red")
print self.platno.coords(objekt)#vytiskne souřadnice objektu.
self.platno.coords(objekt,20,20,30,30)#posune objekt.

Canvas.find_withtag(ukazatel)

Najde všechny prvky obsahující daný identifikátor prvku. Identifikátor může být buď jméno některého tagu, nebo speciální parametr CURRENT. Pokud tento parametr využijete, vrací metoda prvek na plátně nejblíže myši.

Canvas.tag_bind(jméno, akce, funkce)

Sváže plátno s nějakou akcí. A protože těch různých akcí, které by se měly stát například při kliknutí, může být více, poskytuje tato metoda také parametr jméno. Pro parametr akce platí stejné akce, jako když použijete bind.

Samotný program

Nejprve bychom si měli vytvořit hrací plochu. A abychom nemuseli používat anglického slova canvas, budeme mu říkat plátno.

class Plocha:
    def __init__(self,parent):
        self.sirka=640
        self.vyska=480
        self.body=0
        self.platno=Canvas(parent, bg="black", width=self.sirka, height=self.vyska)
        self.platno.pack()
        self.seznam_objektu=[]
        self.obr=PhotoImage(file="ufo.gif")
if __name__=="__main__":
    root=Tk()
    Plocha(root)
    root.mainloop()

Proměnné sirka, vyska určují velikost okna. Do seznamu self.seznam_objektu budeme přidávat letadla, abychom s nimi pak mohli pohybovat. Dále by to chtělo vytvořit nějaký štítek, kam budeme moci zaznamenávat počet úspěšných zásahů. K tomu bych použil udělátko Label.

Pohyb objektem

Nyní můžeme přistoupit k funkci, která nám bude vytvářet letadýlka. Fotku letadýlka si samozřejmě můžete stáhnout . Obrázek je ve tvaru gif, ale můžete ho samozřejmě nahradit nějakým jiným. Za předpokladu, že chcete použít jiný formát než GIF, budete muset použít knihovnu PIL.

def vytvor_objekt(self,x,y):
    objekt=self.platno.create_image(x,y,image=self.obr) 
    self.seznam_objektu.append(objekt)
   

Přičemž x bude vždy 0 a y bude číslo náhodně generované z intervalu (0,výška plátna).

Teď můžeme vytvořit libovolné množství letadýlek, ale stále se nehýbou. K pohybu objektu na plátně se používá metoda move(objekt,x,y). Jako parametry přijímá objekt pohyb ve směru x a pohyb ve směru y. Nám bude stačit, když se bude letadýlko pohybovat pořád ve stejné výšce, měnit se bude jenom x. Tento pohyb budeme muset opakovat každých 200 milisekund. K tomuto opakování použijeme funkci after

Ke správnému chodu našeho programu budeme muset samozřejmě vytvořit funkci pohyb. Funkce pohyb bude volat sama sebe, aby se naše letadýlko pořád pohybovalo:

def pohyb(self):
    for objekt in self.seznam_objektu:
        self.platno.move(objekt,10,0)
    self.platno.after(200,self.pohyb)

Abychom zbytečně nevykreslovali příliš mnoho letadel, dal by se použít mechanizmus, že když letadlo opustí obrazovku, posune se opět na začátek, takže kód upravíme takto:


def pohyb(self):
    for objekt in self.seznam_objektu:
        self.platno.move(objekt,10,0)
        x,y=self.platno.coords(objekt)#zjisti souřadnice letadla
        if x > self.sirka:
            self.platno.coords(objekt,-10,random.randint(0,self.vyska))
    self.platno.after(200,self.pohyb)

Na čtvrtém řádku zjišťujeme polohu obrázku. Na pátém kontrolujeme, zda je obrázek mimo obrazovku, a za předpokladu, že je, posune obrázek opět na začátek.

Tak teď jsme vyřešili pohyb. Ještě bude potřeba nastavit rychlost pohybu letadla, aby se všechna nepohybovala stejně. Ale na to již jistě sami přijdete. Napovím, že by to chtělo generovat velikost x z náhodného intervalu, o kterou se objekt posune.


Teď, když jsme obrázky rozpohybovali, musíme zařídit , aby program poznal, že jsme vystřelili a trefili se. Nejprve si připravíme funkci self.klik. V této funkci přičteme počet sestřelených letadel a posuneme ho na začátek:

def klik(self,akce):
    self.body=self.body+1
    objekt=self.platno.find_withtag(CURRENT)
    self.platno.coords(objekt,−10,random.randint(0,self.vyska))
Teď zbývá dodělat aby program poznal, kdy zavolat funkci klik. K tomu použijeme tag_bind. Do funkce __init__ po vytvoření plátna musíme přidat řádek:

self.platno.tag_bind("klik","<1>",self.klik)

Ještě musíme trochu upravit vytváření obrázku, aby obsahoval tag klik:

objekt=self.platno.create_image(x,y,image=self.obr,tags="klik")

Konečně jsme dokončili hlavní část programu. Teď stačí dodělat lištu, kde se budou znázorňovat body, a je to.

Pro vylepšení programu by se daly dodělat zvuky při střílení či změnit šipkový kurzor za nějaký vhodnější.

×Odeslání článku na tvůj Kindle

Zadej svůj Kindle e-mail a my ti pošleme článek na tvůj Kindle.
Musíš mít povolený příjem obsahu do svého Kindle z naší e-mailové adresy kindle@programujte.com.

E-mailová adresa (např. novak@kindle.com):

TIP: Pokud chceš dostávat naše články každé ráno do svého Kindle, koukni do sekce Články do Kindle.

Hlasování bylo ukončeno    
0 hlasů
Google
Autor studuje na FIT ČVUT a je šéfredaktorem portálu Matematika pro každého.
Web    

Nové články

Obrázek ke článku Hybridní inteligentní systémy 2

Hybridní inteligentní systémy 2

V technické praxi využíváme často kombinaci různých disciplín umělé inteligence a klasických výpočtů. Takovým systémům říkáme hybridní systémy. V tomto článku se zmíním o určitém typu hybridního systému, který je užitečný ve velmi složitých výrobních procesech.

Obrázek ke článku Jak vést kvalitně tým v IT oboru: Naprogramujte si ty správné manažerské kvality

Jak vést kvalitně tým v IT oboru: Naprogramujte si ty správné manažerské kvality

Vedení týmu v oboru informačních technologií se nijak zvlášť neliší od jiných oborů. Přesto však IT manažeři čelí výzvě v podobě velmi rychlého rozvoje a tím i rostoucími nároky na své lidi. Udržet pozornost, motivaci a efektivitu týmu vyžaduje opravdu pevné manažerské základy a zároveň otevřenost a flexibilitu pro stále nové výzvy.

Obrázek ke článku Síla týmů se na home office může vytrácet. Odborníci radí, jak z pracovních omezení vytěžit maximum

Síla týmů se na home office může vytrácet. Odborníci radí, jak z pracovních omezení vytěžit maximum

Za poslední rok se podoba práce zaměstnanců změnila k nepoznání. Především plošné zavedení home office, které mělo být zpočátku jen dočasným opatřením, je pro mnohé už více než rok každodenní realitou. Co ale dělat, když se při práci z domova ztrácí motivace, zaměstnanci přestávají komunikovat a dříve fungující tým se rozpadá na skupinu solitérů? Odborníci na personalistiku dali dohromady několik rad, jak udržet tým v chodu, i když pracovní podmínky nejsou ideální.

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý