85 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:

  1. Jälgitakse erinevaid sündmusi ja tegeletakse sündmustega (siin näiteks protsessitakse kasutaja sisendit)
  2. Muudetakse mängu olekut (näiteks mängija asukoht muutub)
  3. Joonistatakse mängu olek mällu (mängija asukoht muutub)
  4. 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 on True, jätkab meie programm (mäng) töötamist.
  • while running: – mängutsükli algus. Mängutsükli kordamine toimub kuni running väärtus on True
  • 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äärtuseks False. 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.

Mõtle ja nuputa!

Litsents

Icon for the Creative Commons Attribution 4.0 International License

Tarkvaraarendus. 2. trükk on loodud Eno Tõnisson, Tauno Palts, Kaarel Tõnisson, Heidi Meier, Merilin Säde, Ago Luberg, Birgy Lorenz, Einar Kivisalu, Meelis Antoi, ja Säde Mai Krusberg poolt Creative Commons Attribution 4.0 International License litsentsi alusel, kui pole teisiti märgitud.

Jaga seda raamatut