Pygame
Abschlussbedingungen
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()