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

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 triedy Rect . Vytvoríme ho ako pygame.Rect(x, y, šírka, výška). x a y udáva pozíciu ľavého horného rohu.
  • polygon: pygame.draw.polygon(povrch, farba, body), kde body je 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)

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()
blue-circle.png (800×630)

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 hry
  • pygame.MOUSEBUTTONDOWN - pri stlačení tlačídla myši
  • pygame.MOUSEBUTTONUP - pri uvolnení tlačídla myši
  • pygame.KEYDOWN - pri stlačení nejakého tlačídla 
  • pygage.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čil
hrac_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)) - vracia True, ak sa bod (x, y) nachádza vo vnútri obdĺžnika
  • rect.colliderect(rect2) - vracia True, ak majú dva obdĺžniky prienik
  • rect.collidelist(lst) - vracia True, ak aspoň jeden z obdĺžnikov ke vo vnútri zoznamu má prienik s hlavným
  • rect.collidelistall(lst) - vracia True, 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

Rozlíšenie obrazovky

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