83 PyGame’i mängutsükkel
Mängutsükkel
Kui mõtleme mõne lihtsama mängu peale, mida saab näiteks käsurealt mängida ning kus mängija saab sisestada käike (korraldusi), peab see mäng pidevalt küsima kasutajalt uut sisendit. Selleks, et seda saavutada, peab mängu kestel programm pidevalt sisendit küsima. Kui sisend on küsitud, saab programm vastavalt sisendile teha käigu (muuta mängu olekut) ning näiteks kuvada mängijale hetkeline mängu seis. Seda protsessi korratakse kuni mängu lõppemiseni. Sellist pidevat tsüklit nimetatakse mängutsükliks (game loop).
Mängutsükkel on sisuliselt lõputu tsükkel, mis hoiab mängu käimas ja mida korratakse, kuni mängust väljutakse (või tekib viga). PyGame’is ühes tsükli sammus tehakse järgmised 4 peamist tegevust:
- Jälgitakse erinevaid sündmusi ja tegeletakse sündmustega (siin näiteks protsessitakse kasutaja sisendit)
- Muudetakse mängu olekut (näiteks mängija asukoht muutub)
- Joonistatakse mängu olek mällu (mängija asukoht muutub)
- Joonistatud seis näidatakse kasutajale (mängija näeb ekraanil, et tema asukoht on muutunud)
Mängutsükli koodinäide
import pygame pygame.init() # create a window screen = pygame.display.set_mode((800, 600)) running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: # closing window finishes the game loop running = False # fill screen with white color screen.fill((255, 255, 255)) # draw a red circle at (100, 100) with radius 50 pygame.draw.circle(screen, (255, 0, 0), (100, 100), 50) # everything drawn will be visible pygame.display.flip()
Selgitame antud koodi natuke põhjalikumalt:
import pygame
impordib PyGame paki. Ilma selleta me PyGame komponente kasutada ei saa.pygame.init()
initsialiseerib ja paneb valmis PyGame’i funktsionaalsuse. See on vajalik, et saaksime komponente kasutada.pygame.display.set_mode((width, height))
– loob mängu pinna ehk ekraani (ja vastavalt ka akna), kuhu peale hakkame mängu elemente joonistama. Saame kaasa anda loodava pinna (samuti akna) laiuse ja kõrguse pikslites.running = True
– loome abimuutuja. Kui selle muutuja väärtus onTrue
, jätkab meie programm (mäng) töötamist.while running:
– mängutsükli algus. Mängutsükli kordamine toimub kunirunning
väärtus onTrue
- Sündmuste kontrollimine:
for event in pygame.event.get(): if event.type == pygame.QUIT: # closing window finishes the game loop running = False
Käiakse läbi kõik sündmused. Kui sündmuse tüüp on mängust väljumine (akna sulgemisel), siis määratakse
running
väärtuseksFalse
. Sellega lõppeb mängutsükkel järgmisel iteratsioonil.Ilma selle kontrollita jääb programm (mängutsükkel) akna sulgemisel taustale ikka jooksma.
screen.fill((255, 255, 255))
– ekraan täidetakse valge värviga. Kolm väärtust ennikus tähistavad RGB värve, ehk vastavalt punase, rohelise ja sinise värvi intensiivsust. Iga värvi jaoks saab kasutada skaalat 0 – 255. Kui kõikide värvide väärtused on maksimaalsed, on tulemuseks valge värv.pygame.draw.circle(screen, (255, 0, 0), (100, 100), 50)
– ekraanile joonistatakse ring teatud värviga teatud positsioonile teatud raadiusega.pygame.display.flip()
– ekraan tehakse kasutajale nähtavaks. Seni kõik muudatused (tausta värvimine ja ringi joonistamine) toimusid mälus ja kasutaja seda kohe ei näinud. Selle käsuga näidatakse kõik muudatused korraga ekraanil.