3. Pygame hra

3.5. Náboje

Pridáme triedu pre náboje:

class naboje(object):
    def __init__(self,x,y,polomer,farba,smer):
        self.x = x
        self.y = y
        self.polomer = polomer
        self.farba = farba
        self.smer = smer
        self.posun = 8 * smer

    def vykresliNaboj(self,okno):
        pygame.draw.circle(okno, self.farba, (self.x,self.y), self.polomer)

Upravíme triedu hraca (náš hráč musí byť otočený vždy buď doľava/doprava):

class hrac(object):
 	def __init__(self,x,y,sirka,vyska):
        self.x = x
        self.y = y
        self.sirka = sirka
        self.vyska = vyska
        self.posun = 5
        self.jeVoVyskoku = False
        self.otocenaVlavo = False
        self.otocenaVpravo = False
        self.pocetKrokov = 0
        self.skokPocet = 10
        self.stoji=True

    def vykresliPostavu(self, okno):
        if self.pocetKrokov + 1 >= 27:
            self.pocetKrokov = 0
	if not(self.stoji):
            if self.otocenaVlavo:
            	okno.blit(kracaDolava[self.pocetKrokov//3], (self.x,self.y))
            	self.pocetKrokov += 1
            elif self.otocenaVpravo:
            	okno.blit(kracaDoprava[self.pocetKrokov//3], (self.x,self.y))
            	self.pocetKrokov +=1
        else:
            if self.otocenaVpravo:
            	okno.blit(kracaDoprava[0], (self.x,self.y))
            else:
            	okno.blit(kracaDolava[0], (self.x,self.y))
            		

Upravíme hernú slučku

import pygame

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 hrac1.x > hrac1.posun: 
        hrac1.x -= hrac1.posun
        hrac1.otocenaVlavo = True
        hrac1.otocenaVpravo = False
        hrac1.stoji=False

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

    prekresliHerneOkno() 
    
    
pygame.quit()

Nastavíme náboje

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

clock = pygame.time.Clock()
nabojePole = []

while spustena:
    clock.tick(27)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            spustena = False
            
    for naboj in nabojePole:
        if naboj.x < 500 and naboj.x > 0:
           naboj.x += naboj.posun  # naboj sa "pohne"
        else:
           nabojePole.pop(nabojePole.index(naboj))  # odstranime naboj
		
    
    klavesy = pygame.key.get_pressed()
    
    ...
        
    if klavesy[pygame.K_a]:
        if hrac1.otocenaVlavo:
           smer = -1
        else:
           smer = 1

        if len(nabojePole) < 5:  # max 5 nabojov naraz na obrazovke
           nabojePole.append(náboje(round(hrac1.x+hrac1.sirka//2), round(hrac1.y + hrac1.vyska//2), 6, (0,0,0), smer)) # vytvori naboj uprostred hraca

....

Prekreslíme herné okno

import pygame
def prekresliHerneOkno():
    okno.blit(pozadieObr, (0,0))
    hrac1.vykresliPostavu(okno)
    
    for naboj in nabojePole:
        naboj.vykresliNaboj(okno)
    
    pygame.display.update()

Celý kód

import pygame
pygame.init()

window = pygame.display.set_mode((500,500))
pygame.display.set_caption("Prvá hra - enemyAttack")
#ci ma spustit hernu slucku
runnig= True

#glob premenna s pozadim
backgroundImage = pygame.image.load('pozadie.jpg')
#pole s obrazkami kracania dolava
playerWalkingLeft = [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')]
#pole s obrazkami kracania doprava
playerWalkingRight = [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')]

#pygame.image.load() nacitame obrazok
playerImageStand = pygame.image.load('postavaStoji.png')

#obmzedzenie FPS
timer = pygame.time.Clock()

class player(object):
    #init musi byt vzdy pri class
    def __init__(self,x,y,widht, height):
        self.x = x
        self.y = y
        self.width = widht
        self.height = height
        self.step = 5 #pohyb dolava/doprava
        self.stepCount = 0 #na pole s obrazkami
        self.turnLeft = False #kde je otoceny
        self.turnRight = False
        self.isJumping = False #ci je vo vyskoku
        self.jumpCount = 10 #do akej vysky vyskok
        self.isStanding = True #pomoc premenna ci stoji/je v pohybe

    #na vykreslenie postavy
    def drawPlayer(self, window):
        #mame 9 obrazkov, kazdy obrazok sa zobrazi 3x
        if self.stepCount + 1 > 27:
           self.stepCount = 0
        if not(self.isStanding):
            if self.turnLeft:
            #mame 9 obrazkov, pocet krokov 27, musime vydelit 3
                window.blit(playerWalkingLeft[self.stepCount//3], (self.x, self.y))
                self.stepCount += 1
            elif self.turnRight:
                window.blit(playerWalkingRight[self.stepCount//3], (self.x, self.y))
                self.stepCount += 1
        else:
            #nastavime obrazok kraca dolava/doprava s index 0
            if self.turnRight:
                window.blit(playerWalkingRight[0],(self.x,self.y))
            else:
                window.blit(playerWalkingLeft[0],(self.x,self.y))



class bullets(object):
    def __init__(self,x,y,radius,color,direction):
        self.x = x
        self.y = y
        self.radius = radius
        self.color = color
        self.step = 8 * direction

    def drawBullet(self,window):
        pygame.draw.circle(window,self.color,
                           (self.x,self.y), self.radius)



def redrawGameWindow():
    window.blit(backgroundImage, (0,0))

    #pridame hracovi vzhlad - nasu funkciu vytvorenu
    player1.drawPlayer(window)

    for bullet in bulletArray:
        bullet.drawBullet(window)
    #vzdy posledne
    pygame.display.update()

#vytvorime  hraca so suradnicami, velkostou
player1 = player(100,415,64,64)
bulletArray = []
#herna slucka
while runnig:
    #pre vsetky udalosti
    for event in pygame.event.get():
        #ked stlacime X na okne
        if event.type == pygame.QUIT:
            runnig = False

    for bullet in bulletArray:
        if bullet.x < 500 and bullet.x > 0:
            bullet.x  += bullet.step #naboj sa "pohne"
        else:
            #odstranime naboj
            bulletArray.pop(bulletArray.index(bullet))
    #pole:pygame.key.get_pressed() - ulozene tlacidla na klavesnici
    pressed = pygame.key.get_pressed()
    #po stlaceni W pojde nahor alternativa ...[pygame.K_UP]
    #iba ked hrac nie je vo vyskoku
    if not(player1.isJumping):
        # po stlaceni medzernika vyskoci
        if pressed[pygame.K_SPACE]:
            #docasne nastavime hodnotu vyskoku na True
            player1.isJumping = True
            #ked je vo vyskoku zrus otocenie hraca
            player1.turnLeft = False
            player1.turnRight = False

    else:
        if player1.jumpCount >= -10:
            player1.y -= (player1.jumpCount * abs(player1.jumpCount)*0.5)
            player1.jumpCount -=1
        else:
            #zresetujeme jumpCount a zaroven hrac uz nie je vo vyskoku
            player1.jumpCount = 10       
            player1.isJumping=False
        # po stlaceni W pojde nahor
    if pressed[pygame.K_a] and player1.x > player1.step:
        player1.x -= player1.step
        #ulozime stav, kde je otoceny hrac
        player1.turnLeft = True
        player1.turnRight = False
        player1.isStanding=False
        # po stlaceni W pojde nahor
    elif pressed[pygame.K_d] and player1.x < 500 - player1.step - player1.width:
        player1.x += player1.step
        # ulozime stav, kde je otoceny hrac
        player1.turnRight = True
        player1.turnLeft = False
        player1.isStanding=False
        # nas hrac
    else:
        #vyresetujeme pocet krokov
        player1.stepCount = 0
        player1.isStanding = True
    #strielame napr. Q
    if pressed[pygame.K_q]:
        #uchovame smer ktorym strielame
        if player1.turnLeft:
            direction = -1
        else:
            direction = 1
        #obmezdzime pocet naboj na obrazovke na 5
        if len(bulletArray) < 5:
            #bullets maju 5 parametrov (x,y,radius,color,direction)
            #pozicia x a y bude v strede hraca, preto //2
            bulletArray.append(bullets(round(player1.x+player1.width//2),
                                       round(player1.y+player1.height//2),
                                       6,
                                       (0,0,0),
                                       direction))
    pygame.draw.rect(window, (255, 0, 0), (player1.x, player1.y, player1.width, player1.height))

    #musi byt posledne, aby sa aktualizovala obrazovka
    timer.tick(30)
    #zavolame pomocnu funkciu na prekreslenie herneho okna
    redrawGameWindow()