Tkinter Game – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Tkinter Game – Python – Fórum – Programujte.comTkinter Game – Python – Fórum – Programujte.com

 

Hike Mike
~ Anonymní uživatel
1 příspěvek
5. 1. 2022   #1
-
0
-

Zdravím, potreboval by som poradiť ohľadom Python Tkinter hry. Jednoduchá hra ktorá spočíva v zostrelení pohybujúcich sa balónov.  Neviem ako zabezpečit aby po zostrelení daného balónu následne zmizol poprípade ak kliknete mimo pokračoval ďalej... 

Veľmi si vážim každý jeden nápad, radu alebo typ na zefektívnenie programu.

Kód :
 

import tkinter
from random import*

canvas = tkinter.Canvas(width = 450, height = 400)
canvas.pack()


def shot(data):
    x = data.x
    y = data.y
    canvas.create_oval(x-10,y-10,x+10,y+10, fill ="black")


canvas.bind('<Button-1>', shot)

def balon () :
    for j in range (1,400,75):
        for i in range (1,400,5):
            canvas.delete ("all")
            balon = canvas.create_oval(20+j,20+i,60+j,70+i,fill = 'red')
            canvas.create_line(40+j,70+i,40+j,110+i)
            

            canvas.after (10)
            canvas.update ()
            


balon()

Nahlásit jako SPAM
IP: 185.242.57.–
peter
~ Anonymní uživatel
4002 příspěvků
6. 1. 2022   #2
-
0
-

Vytvoris si pole, do ktereho ulozis data o balonech a stav, aktivni, neaktivni.
Toto pole pri kaztem tiknuti casu prochazis a vykreslujes balon nebo nic.

Pseudokod nejak takto
 

function bulletCreate(x,y) {return {x:x, y:y, visible:true, ...}} 
function bulletDraw(item) {canvas.drawImage(item.x, item.y, 'bullet')}
function targetCreate(x,y) {return {x:x, y:y, visible:true, ...}} 
function targetDraw(item) {canvas.drawImage(item.x, item.y, 'target')}

function casovacStart() {... kazdy X milisekund zavolej casovacAction }
function casovacAction() {
canvasClear();
for(i=0; i<10; i++)
  {
  if (list[bullets][i].visible) {bulletDraw(list[bullets][i])}
  }
n = 0
for(i=0; i<6; i++)
  {
  if (list[targets][i].visible) {targetsDraw(list[targets][i]); n++}
  }
if (n==1) endGame() // kdyz zustane jeden hrac, ukonci hru
... if bullet hit
}

list = array()
list[bullets] = array()
list[targets] = array()

function init()
{
for(i=0; i<10; i++)
  {
  list[bullets][i] = new bulletCreate(0,0)
  list[bullets][i].visible = false
  }
for(i=0; i<6; i++)
  {
  list[targets][i] = new targetCreate(0,0)
  }
drawGameBoard()
casovacStart();
}
Nahlásit jako SPAM
IP: 2001:718:2601:258:3436:1011:b85e:ec2...–
gna
~ Anonymní uživatel
1874 příspěvků
6. 1. 2022   #3
-
0
-

Jestli to správně chápu, tak balón sestřelíš tím, že na něj klikneš.

Objekt z canvasu můžeš odstranit pomocí .delete a místo globálního click-handleru a zjišťování, na co jsi kliknul, bude jednodušší nastavit ten handler přímo na tom balónu pomocí .tag_bind.

Taky by se asi hodilo, aby tělo toho balónu i jeho provázek byl jeden objekt, ať to nemusíš dohledávat.

Pohyb pak uděláš tak, že pomocí .after budeš periodicky ty balóny posunovat.

Třeba nějak takhle:

import tkinter


class Balloon:
    def __init__(self, canvas, x, y):
        self.alive = True
        self.canvas = canvas
        self.balloon = canvas.create_oval(x, y, x + 40, y + 50, fill="red")
        self.string = canvas.create_line(x + 20, y + 50, x + 20, y + 90)
        self.canvas.tag_bind(self.balloon, "<Button-1>", self.kill)

    def move(self):
        if self.alive and self.canvas.coords(self.balloon)[1] > 0:  # coords == (x1, y2, x2, y2)
            self.canvas.move(self.balloon, 0, -10)
            self.canvas.move(self.string, 0, -10)

    def kill(self, event):
        if self.alive:
            self.canvas.delete(self.balloon)
            self.canvas.delete(self.string)
            self.alive = False


def create_balloons(canvas):
    balloons = []
    for x in range(1, 400, 75):
        balloons.append(Balloon(canvas, x, 300))
    return balloons


def move_balloons(canvas, balloons):
    for balloon in balloons:
        balloon.move()
    canvas.after(100, move_balloons, canvas, balloons)


canvas = tkinter.Canvas(width=450, height=400)
canvas.pack()

balloons = create_balloons(canvas)
canvas.after(100, move_balloons, canvas, balloons)

tkinter.mainloop()
Nahlásit jako SPAM
IP: 213.211.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

Podobná vlákna

Delphi in game — založil Arlene

3D game engine — založil Jarda

Game Maker — založil Samuel Lehotský

C# game develop — založil qwertys

Battleship game — založil Philias

 

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