Pygame

3. Pygame hra

3.3. Postavy

https://lms.umb.sk/pluginfile.php/360989/mod_book/chapter/7518/Obr%C3%A1zky%20a%20hudba.rar

Pridáme premenné, ktoré budú uchovávať informáciu, či je postava otočená naľavo alebo napravo, alebo či stojí.

otocenaVlavo = False
otocenaVpravo = False
pocetKrokov = 0
   
Načítame obrázky pomocou funkcie pygame.image.load(path)

kracaDoprava = [pygame.image.load('doprava1.png'), pygame.image.load('doprava2.png'), pygame.image.load('doprava3.png'), pygame.image.load('doprava4.png'), pygame.image.load('doprava5.png'), pygame.image.load('doprava6.png'), pygame.image.load('doprava7.png'), pygame.image.load('doprava8.png'), pygame.image.load('doprava9.png')]

kracaDolava = [pygame.image.load('dolava1.png'), pygame.image.load('dolava2.png'), pygame.image.load('dolava3.png'), pygame.image.load('dolava4.png'), pygame.image.load('dolava5.png'), pygame.image.load('dolava6.png'), pygame.image.load('dolava7.png'), pygame.image.load('dolava8.png'), pygame.image.load('dolava9.png')]

pozadieObr = pygame.image.load('pozadie.jpg')

postavaStoji = pygame.image.load('postavaStoji.png')
   
Prekresľovanie obrázkov je vhodné vykonávať v samostatnej funkcii:

def prekresliHerneOkno():
    global pocetKrokov
    okno.blit(pozadieObr, (0,0))  # na pozicii 0,0
    pygame.display.update() 
   
while spustena:
    #....
    prekresliHerneOkno()        

pygame.quit()
V hernej slučke pridáme obrázky pre chôdzu naľavo a naprave
def prekresliHerneOkno():
    global pocetKrokov
    
    okno.blit(pozadieObr, (0,0))  # na pozicii 0,0
    pygame.display.update() 

while spustena:
    #....
    if keys[pygame.K_LEFT] and x > posun: 
        x -= posun
        otocenaVlavo = True
        otocenaVpravo = False           

    elif keys[pygame.K_RIGHT] and x < 500 - posun - sirka:  
        x += posun
        otocenaVlavo = False
        otocenaVpravo = True
              
    else: # ak sa postava nepohybuje, tak resetujeme pocitadlo krokov a nastavime otocenieVlavo a otocenieVpravo na hodnotu False
        otocenaVlavo = False
        otocenaVpravo = False
        pocetKrokov = 0
               
    if not(jeVoVyskoku):
        if keys[pygame.K_SPACE]:
            jeVoVyskoku = True              
            otocenaVpravo = False 
            otocenaVlavo = False                    
            pocetKrokov = 0
    else:
        if skokPocet >= -10:
            y -= (skokPocet * abs(skokPocet)) * 0.5
            skokPocet -= 1
        else: 
            skokPocet = 10
            jeVoVyskoku = False

    prekresliHerneOkno() 

pygame.quit()
Vykresľovanie postavy:
def prekresliHerneOkno():
    # Máme 9x obrázok, chceme každý obrázok aby sa zobrazil 3 frame
    #  27 / 3 = 9
    # 3x sa zobrazí každá animácia
    global pocetKrokov
      
    okno.blit(pozadieObrazok, (0,0))  

#ak je v ďalšom kroku počet krokov väčší ako 27, tak kroky vynuluje
    if pocetKrokov + 1 >= 27:
        pocetKrokov = 0
    
#ak je postava otočená vľavo    
    if otocenaVlavo:
        okno.blit(kracaDolava[pocetKrokov//3], (x,y))  # Máme 9 obrázkov, vydelíme 3, aby každý obrázok sa zobrazil práve 3x
        pocetKrokov += 1                          
    elif otocenaVpravo:
        win.blit(kracaDoprava[pocetKrokov//3], (x,y))
        pocetKrokov += 1
    else:
        okno.blit(postavaStoji, (x, y))  # ak postava stojí, tak nastavíme obrázok
          
    pygame.display.update() 
Poslednú vec, čo musíme nastaviť je "framerate" (snímky za sekundu). Vytvoríme premennú, do ktorej uložíme objekt Clock(). V hernej slučke zavoláme funkciu tick(), ktorá sa zavolá raz za jeden frame. Počíta koľko milisekúnd prešlo od posledného volania.
#....
pygame.display.set_mode((500, 480))
#....
clock = pygame.time.Clock()
#....

while spustena:
    clock.tick(27)     
    #....
Celý kód:
import pygame
pygame.init()

okno = pygame.display.set_mode((500,480))
pygame.display.set_caption("Prvá hra")

kracaDoprava = [pygame.image.load('doprava1.png'), pygame.image.load('doprava2.png'), pygame.image.load('doprava3.png'), pygame.image.load('doprava4.png'), pygame.image.load('doprava5.png'), pygame.image.load('doprava6.png'), pygame.image.load('doprava7.png'), pygame.image.load('doprava8.png'), pygame.image.load('doprava9.png')]

kracaDolava = [pygame.image.load('dolava1.png'), pygame.image.load('dolava2.png'), pygame.image.load('dolava3.png'), pygame.image.load('dolava4.png'), pygame.image.load('dolava5.png'), pygame.image.load('dolava6.png'), pygame.image.load('dolava7.png'), pygame.image.load('dolava8.png'), pygame.image.load('dolava9.png')]

pozadieObr = pygame.image.load('pozadie.jpg')

postavaStoji = pygame.image.load('postavaStoji.png')

x = 50
y = 400
sirka = 40
vyska = 60
posun = 5

clock = pygame.time.Clock()

jeVoVyskoku = False
skokPocet = 10

otocenaVlavo = False
otocenaVpravo = False
pocetKrokov = 0

def prekresliHerneOkno():
    global pocetKrokov
    
    okno.blit(pozadieObr, (0,0))  
    if pocetKrokov + 1 >= 27:
        pocetKrokov = 0
        
    if otocenaVlavo:  
        okno.blit(kracaDolava[pocetKrokov//3], (x,y))
        pocetKrokov += 1                          
    elif otocenaVpravo:
        okno.blit(kracaDoprava[pocetKrokov//3], (x,y))
        pocetKrokov += 1
    else:
        okno.blit(postavaStoji, (x, y))
        pocetKrokov = 0
        
    pygame.display.update() 
    


spustena = True

while spustena:
    clock.tick(27)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            spustena = False

    klavesy = pygame.key.get_pressed()
    
    if klavesy[pygame.K_LEFT] and x > posun: 
        x -= posun
        otocenaVlavo = True
        otocenaVpravo = False

    elif klavesy[pygame.K_RIGHT] and x < 500 - posun - sirka:  
        x += posun
        otocenaVlavo = False
        otocenaVpravo = True
        
    else: 
        otocenaVlavo = False
        otocenaVpravo = False
        pocetKrokov = 0
        
    if not(jeVoVyskoku):
        if klavesy[pygame.K_SPACE]:
            jeVoVyskoku = True
            otocenaVlavo = False
            otocenaVpravo = False
            pocetKrokov = 0
    else:
        if skokPocet >= -10:
            y -= (skokPocet * abs(skokPocet)) * 0.5
            skokPocet -= 1
        else: 
            skokPocet = 10
            jeVoVyskoku = False

    prekresliHerneOkno() 
    
    
pygame.quit()