Pygame
2. Vytvorenie obrazovky a pohyb
Ako prvú vec, čo musíme urobiť je pridať knižnicu pygame a inicializovať ho volaním funkcie init().
import pygame
pygame.init()
Na vytvorenie okna si vytvoríme premennú, v ktorej vytvoríme okno pomocou volania funkcie pygame.display.set_mode(). Ak chceme maximalizovať okno. tak ako parameter dáme hodnoty 0. Ak chceme fullscreen, tak pridáme ďalší parameter pygame.FULLSCREEN (upozornenie pri vytváraní projektu, ak nemáme nastavené kedy sa hra ukončí, nebudeme vedieť vypnúť okno hry)pygame.init()
okno = pygame.display.set_mode((500,500))
#okno = pygame.display.set_mode((0,0), pygame.FULLSCREEN)
V tomto kroku je vytvorená obrazovka s čiernym pozadím.#okno = pygame.display.set_mode((0,0), pygame.FULLSCREEN)
Ak chceme nastaviť vlastný popis hry, tak môžeme pridať príkaz set_caption()
pygame.display.set_caption("Prvá hra")
Vykreslenie tvarov
na vykreslenie tvarov môžeme používať podmodul pygame.draw. Najčastejšie môžeme pridávať:- kruh:
pygame.draw.circle(povrch, farba, (x, y), polomer)-(x, y)ak chceme stred - obdĺžnik:
pygame.draw.rect(povrch, farba, obdĺžnik), kde obdĺžnik je objekt triedyRect. Vytvoríme ho akopygame.Rect(x, y, šírka, výška).xayudáva pozíciu ľavého horného rohu. - polygon:
pygame.draw.polygon(povrch, farba, body), kdebodyje zoznam vo formáte(x, y) - čiara:
pygame.draw.line(povrch, farva, start_pozicie, koniec_pozicie)
Farba sa udáva v RGB hodnotách (0-255), pričom môžeme pridať ešte priehľadnosť (červená, modrá, zelená, [priehľadnosť]).
Pridaním kruhu do nášho kódu sa však nič nevykreslí (resp. tak rýchlo, že to nepostrehneme):
import pygame
pygame.init()
pygame.draw.circle(screen, (0, 0, 255), (400, 300), 150)
pygame.init()
pygame.draw.circle(screen, (0, 0, 255), (400, 300), 150)
Herný cyklus
V predchádzajúcom príklade sme vytvorili jeden krok, ktorý sa vykonal raz a hneď skončil. Ak chceme, aby bol zobrazený celý čas, musíme ho dať do cyklu while True. Na konci cyklu je vhodné pridať pygame.display.flip(), ktorý zaktualizuje obrazovku. Alternatívou je pridať prekreslenie obrazovky pygame.display.update().- pygame.display.flip() - aktualizuje obsah celej obrazovky
- pygame.display.update() - umožňuje aktualizovať časť obrazovky, nie celú plochu. Ak neuvedieme žiadny argument aktualizuje celú obrazovku. Preferovaný spôsob (je rýchlejší vo väčšine prípadov).
pygame.display.update(update_rect) #aktualizovalo by iba obsah funkcie update_rect
while True:
pygame.draw.circle(screen, (0, 0, 255), (400, 300), 150)
pygame.display.flip() #pygame.display.update()
pygame.draw.circle(screen, (0, 0, 255), (400, 300), 150)
pygame.display.flip() #pygame.display.update()

Udalosti
Zoznam všetkých udalostí získame pomocou volania funkcie pygame.event.get()pygame.QUIT- volá sa, keď sa niekto pokúsi ukončiť okno hrypygame.MOUSEBUTTONDOWN- pri stlačení tlačídla myšipygame.MOUSEBUTTONUP- pri uvolnení tlačídla myšipygame.KEYDOWN- pri stlačení nejakého tlačídlapygage.KEYUP- pri uvolnění nejakého tlačídla
Problém môže byť, keď chceme ukončiť hru stlačením tlačidla ESC, nakoľko hra beží v cykle while True. Vhodnejšie je vytvoriť premennú ešte pred vytvorením herného cykla a následne pri stlačení ESC zmeníme hodnotu premennej True na False.
pygame.init()
okno = True
while spustena:
for event in pygame.event.get():
if event.type == pygame.QUIT:
spustena = False
elif event.type == pygame.KEYUP and event.key == pygame.K_ESCAPE:
spustena = False
okno = pygame.display.set_mode((800, 600))
pygame.draw.circle(screen, (0, 0, 255), (400, 300), 150)
pygame.display.flip()
Pohyb obdĺžnika
Na pohyb môžeme používať funkciu pygame.key.get_pressed(), v ktorej je uchovaná hodnota, čo používateľ stlačilhrac_x = 400
hrac_y = 300
while spustena:
# ...
pygame.draw.circle(screen, (0, 0, 255), (hrac_x, hrac_y), 150)
pressed = pygame.key.get_pressed()
if pressed[pygame.K_w]: # Hore
hrac_y -= 5
if pressed[pygame.K_s]: # Dole
hrac_y += 5
if pressed[pygame.K_a]: # Doľava
hrac_x -= 5
if pressed[pygame.K_d]: # Doprava
hrac_x += 5
Obmedzenie FPS
hodiny = pygame.time.Clock() # vytvoríme nové pygame hodiny
while True:
# ...
hodiny.tick(30) # umiestníme na koniec cyklu
Celý kód (pohyb obdĺžnika + FPS):
pygame.init()
spustena = True
hodiny = pygame.time.Clock()
hrac_x = 400
hrac_y = 300
while spustena:
for event in pygame.event.get():
if event.type == pygame.QUIT:
spustena = False
elif event.type == pygame.KEYUP and event.key == pygame.K_ESCAPE:
spustena = False
pressed = pygame.key.get_pressed()
if pressed[pygame.K_w]:
hrac_y -= 5
if pressed[pygame.K_s]:
hrac_y += 5
if pressed[pygame.K_a]:
hrac_x -= 5
if pressed[pygame.K_d]:
hrac_x += 5
okno = pygame.display.set_mode((800, 600))
pygame.draw.circle(okno, (0, 0, 255), (hrac_x, hrac_y), 150)
pygame.draw.rect(okno, (0, 255, 0), pygame.Rect(10, 10, 100, 200))
pygame.display.flip()
hodiny.tick(30)
Písmo
Zoznam všetkých dostupných systémových písiem: pygame.font.get_fonts().- Systémové písmo
font = pygame.font.SysFont(font_name, size)
- Vlastné písmo - pribalíme k programu, namiesto path vkladáme cestu k .ttf
font = pygame.font.Font(path, size)
- Vykreslenie písma - písmo zobrazíme pomocou funkcie render(), txt - String, True je antialiasing (zaoblí rohy písma)
text = font.render(txt, True, color)Ukážka:
font = pygame.font.Font('myfont.ttf', 30)
text = font.render("Červený text", True, (255, 0, 0))
screen.blit(text, (10, 10))
Zachovanie veľkosti pre rôzne obrazovky
font = pygame.font.Font('myfont.ttf', 30)
# povrch obrazovky bude mať rozlíšenie 1920x1080
okno = pygame.Surface((1920, 1080))
# displej bude mať ľubovoľné rozlíšenie (napr. fullscreen)
display = pygame.display.set_mode((0, 0))
# klasicky kreslíme všetko na obrazovku
pygame.draw.rect(okno, (255, 255, 255), pygame.Rect((10, 10), (100, 100)))
# na konci prevedieme celé okno na veľkosť displeja
pygame.transform.scale(okno, display.get_size(), display)
# zobrazíme zmeny na monitore
pygame.display.flip()
Zistenie kolízií obdĺžnikov
rect.collidepoint((x, y))- vraciaTrue, ak sa bod(x, y)nachádza vo vnútri obdĺžnikarect.colliderect(rect2)- vraciaTrue, ak majú dva obdĺžniky prienikrect.collidelist(lst)- vraciaTrue, ak aspoň jeden z obdĺžnikov ke vo vnútri zoznamu má prienik s hlavnýmrect.collidelistall(lst)- vraciaTrue, ak všetky obdĺžniky vo vnútri zoznamu majú prienik s hlavným
font = pygame.font.Font('myfont.ttf', 30)
# povrch obrazovky bude mať rozlíšenie 1920x1080
okno = pygame.Surface((1920, 1080))
# displej bude mať ľubovoľné rozlíšenie (napr. fullscreen)
display = pygame.display.set_mode((0, 0))
# klasicky kreslíme všetko na obrazovku
pygame.draw.rect(okno, (255, 255, 255), pygame.Rect((10, 10), (100, 100)))
# na konci prevedieme celé okno na veľkosť displeja
pygame.transform.scale(okno, display.get_size(), display)
# zobrazíme zmeny na monitore
pygame.display.flip()
Pozadie obrazovky
pozadie = pygame.Color(100,149,237) # povrch obrazovky bude mať farbu cornflower modrá okno = pygame.Surface((1920,1080))
while spustena: okno.fill(pozadie)
Načítanie obrázkov

pygame.image.load('obrazok.png')okno.blit(premennaObrazok, (poziciaX,poziciaY))
obrazok = pygame.image.load('logoUMB.png')
okno = pygame.Surface((1920,1080))
while spustena:
...
okno.blit(obrazok,(0,0))