Nauč se Python > Kurzy > Začátečnický kurz PyLadies > Grafika > Zpětná vazba k domácím projektům

Feedback k domácím projektům

Problém s proměnnými - lokální vs. globální, mutable vs. immutable

In [ ]:
import pyglet
from random import randint

sirka = 1280
vyska = 800
rychlost_x = 0
rychlost_y = 0

window = pyglet.window.Window(sirka, vyska)

obrazek = pyglet.image.load("ball.png")
sprite = pyglet.sprite.Sprite(obrazek)
sprite.x = -100
sprite.y = -100

def tik(t):
    sprite.x = sprite.x + t * rychlost_x
    sprite.y = sprite.y + t * rychlost_y
    if sprite.x + obrazek.width > sirka or sprite.x < 0:
        rychlost_x = -rychlost_x
    if sprite.y + obrazek.height > vyska or sprite.y < 0:
        rychlost_y = -rychlost_y

def klik(x, y, tlacitko, mod):
    sprite.x = x
    sprite.y = y
    rychlost_x = randint(-500, 500)
    rychlost_y = randint(-500, 500)

def vykresli():
    window.clear()
    sprite.draw()

pyglet.clock.schedule_interval(tik, 1/30)
window.push_handlers(on_draw=vykresli, on_mouse_press=klik)

pyglet.app.run()

Tento kód nefunguje, protože se uvnitř funkcí snažíme měnit obsah proměnných a zároveň přistupovat k jejich globálnímu stavu.

Řešení 1 - kouzelný příkaz global

In [ ]:
def tik(t):
    global rychlost_x, rychlost_y
    sprite.x = sprite.x + t * rychlost_x
    sprite.y = sprite.y + t * rychlost_y
    if sprite.x + obrazek.width > sirka or sprite.x < 0:
        rychlost_x = -rychlost_x
    if sprite.y + obrazek.height > vyska or sprite.y < 0:
        rychlost_y = -rychlost_y

def klik(x, y, tlacitko, mod):
    global rychlost_x, rychlost_y
    sprite.x = x
    sprite.y = y
    rychlost_x = randint(-500, 500)
    rychlost_y = randint(-500, 500)

Řešení 2 - slovníky a seznamy

In [ ]:
rychlost = {"x": 0, "y": 0}

def tik(t):
    sprite.x = sprite.x + t * rychlost["x"]
    sprite.y = sprite.y + t * rychlost["y"]
    if sprite.x + obrazek.width > sirka or sprite.x < 0:
        rychlost["x"] = -rychlost["x"]
    if sprite.y + obrazek.height > vyska or sprite.y < 0:
        rychlost["y"] = -rychlost["y"]

def klik(x, y, tlacitko, mod):
    sprite.x = x
    sprite.y = y
    rychlost["x"] = randint(-500, 500)
    rychlost["y"] = randint(-500, 500)

Řešení 3 - třída a objekty

In [ ]:
import pyglet
from random import randint

sirka = 1280
vyska = 800

window = pyglet.window.Window(sirka, vyska)

obrazek = pyglet.image.load("ball.png")

class Kulicka:
    def __init__(self, x, y):
        self.sprite = pyglet.sprite.Sprite(obrazek)
        self.sprite.x = x
        self.sprite.y = y
        self.rychlost_x = randint(-500, 500)
        self.rychlost_y = randint(-500, 500)

    def vykresli(self):
        self.sprite.draw()
    
    def tik(self, t):
        self.sprite.x = self.sprite.x + t * self.rychlost_x
        self.sprite.y = self.sprite.y + t * self.rychlost_y
        if self.sprite.x + obrazek.width > sirka or self.sprite.x < 0:
            self.rychlost_x = -self.rychlost_x
        if self.sprite.y + obrazek.height > vyska or self.sprite.y < 0:
            self.rychlost_y = -self.rychlost_y

kulicky = []

def tik(t):
    for kulicka in kulicky:
        kulicka.tik(t)

def klik(x, y, tlacitko, mod):
    kulicky.append(Kulicka(x, y))

def vykresli():
    window.clear()
    for kulicka in kulicky:
        kulicka.vykresli()

pyglet.clock.schedule_interval(tik, 1/30)
window.push_handlers(on_draw=vykresli, on_mouse_press=klik)

pyglet.app.run()

Toto je stránka lekce z kurzu, který probíhá nebo proběhl naživo s instruktorem.