Pygame
3. Pygame hra
3.3. Postavy
https://lms.umb.sk/pluginfile.php/360989/mod_book/chapter/7518/Obr%C3%A1zky%20a%20hudba.rarPridá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 = 0Načí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()