Pygame
Conditions d’achèvement
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í.
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 = 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()