Pygame 1

Introductie

Pygame is een open-source, cross-platform gratis bibliotheek voor het ontwikkelen van games met Python.

  • open-source: de bron-code is vrij beschikbaar, en moet vrij beschikbaar blijven

  • cross-platform: is niet gebonden aan 1 platform, maar werkt op o.a. Linux, macOS en Windows

  • gratis: je hoeft er niet voor te betalen :-)

Installatie

Net zoals de andere Python modules die je tot nu toe reeds installeerde, kan je ook pygame met pip installeren.

Installeer pygame met pip: pip install pygame

Initialisatie

In het onderstaande voorbeeld wordt eerst de pygame module geïmporteerd met het import statement. Dit maakt de pygame functionaliteit beschikbaar voor je programma.

Vervolgens wordt de bibliotheek geïnitialiseerd, dit wil zeggen dat pygame zich onder andere klaarmaakt om beeld en geluid aan te sturen.

Met de functie set_mode() maak je een venster aan met de opgegeven afmetingen in pixels. Let op: De parameter van set_mode is een tuple van 2 getallen.

voorbeeld 1
import pygame

pygame.init()
screen = pygame.display.set_mode((320, 240))

Kopieer bovenstaande code en voer uit.

Opgave 2

Pas de code uit voorbeeld 1 aan, zodat je een venster van 800 op 600 pixels krijgt.

Fill en flip

De functie fill() vult het scherm met de opgegeven kleur.

voorbeeld 2
import pygame

pygame.init()
screen = pygame.display.set_mode((320, 240))
screen.fill((250, 0, 0))
pygame.display.flip()

Kopieer bovenstaande code en voer uit.

De parameter (250, 0, 0) van de functie fill() geeft de kleur aan waarmee het scherm gevuld dient te worden. De kleur wordt opgegeven als een combinatie van rood, groen en blauw waarden (RGB).

Opgave 4

Pas de code uit opgave 3 aan, zodat het scherm groen wordt.

Opgave 5

In onderstaand voorbeeld wordt met de functie load() een tekening ingeladen uit het bestand player.png. De functie blit() toont deze tekening op het scherm op coördinaten (50, 50).

import pygame

pygame.init()
screen = pygame.display.set_mode((320, 240))
screen.fill((250, 0, 0))
image = pygame.image.load("player.png")
screen.blit(image, (50, 50))
pygame.display.flip()

Kopieer bovenstaande code en voer uit. Als je de code nu uitvoert, krijg je een foutmelding omdat het bestand player.png niet gevonden wordt. Download player.png en plaats het bestand in dezelfde map als waar je Python code staat. Voer de code nu uit. Wat gebeurt er?

Opgave 6

Pas de code uit opgave 5 aan, zodat de tekening in de linkerbovenhoek van het scherm getoond wordt, dit is coördinaat (0,0).

Game-loop

In de vorige opgaven werd het programma helaas slechts een fractie van een seconde getoond, en meteen verdween het venster weer van het scherm. Dit heeft een logische verklaring: Je Python programma wordt regel na regel uitgevoerd, en het programma eindigt zodra alle regels zijn uitgevoerd. Om dit te voorkomen, wordt er een zogenaamde “game-loop” of algemener “event-loop” gebruikt. Dit is een while-loop zoals jullie die in een eerdere opgave leerden gebruiken.

Opgave 7

In onderstaande code worden de laatste twee regels code tot in het oneindige herhaald door de while-lus.

import pygame

pygame.init()
screen = pygame.display.set_mode((320, 240))
image = pygame.image.load("player.png")
while True:  # nieuw
    screen.blit(image, (50, 50))
    pygame.display.flip()

Voer bovenstaande code uit. Wat gebeurt er? Wat loopt er mis?

Opgave 8

We kunnen de illusie wekken dat het figuurtje beweegt door de afbeelding telkens op een andere positie te tekenen. In onderstaand voorbeeld beweegt het figuurtje zich naar rechts.

import pygame

pygame.init()
screen = pygame.display.set_mode((320, 240))
image = pygame.image.load("player.png")
x = 0
while True:
    screen.fill((250, 250, 0))  # nieuw
    screen.blit(image, (x, 50))
    pygame.display.flip()
    x += 1

Pas bovenstaande code aan zodat het figuurtje zich naar rechtsonder begeeft.

Event handling (gebeurtenissen verwerken)

In de voorgaande opgaven kon je de werking van het programma niet beïnvloeden. Nu passen we de code aan zodat we toetsenbordinvoer kunnen verwerken.

Opgave 9

import pygame

pygame.init()
screen = pygame.display.set_mode((320, 240))
image = pygame.image.load("player.png")
x = 0
while True:
    screen.fill((250, 250, 0))
    screen.blit(image, (x, 50))
    pygame.display.flip()
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            x += 5

Voer bovenstaande code uit. Wat gebeurt er?

Pas de code aan zodat het figuurtje zich dubbel zo snel verplaatst.

Opgave 10

import pygame

pygame.init()
screen = pygame.display.set_mode((320, 240))
image = pygame.image.load("player.png")
x = 0
while True:
    screen.fill((250, 250, 0))
    screen.blit(image, (x, 50))
    pygame.display.flip()
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                x -= 5
            if event.key == pygame.K_RIGHT:
                x += 5

Wat denk je dat in bovenstaande code gebeurt? Voer bovenstaande code uit. Wat gebeurt er?

Pas de code aan zodat het figuurtje zich bij het opstarten in het midden van het scherm bevindt.

Opgave 11

Tot nu toe was het niet mogelijk om het programma correct af te sluiten. We passen nu de code aan zodat we door “q” in te drukken, het programma kunnen beëindigen.

import pygame

pygame.init()
screen = pygame.display.set_mode((320, 240))
image = pygame.image.load("player.png")
x = 0
running = True  # nieuw
while running:  # aangepast
    screen.fill((250, 250, 0))
    screen.blit(image, (x, 50))
    pygame.display.flip()
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_q:  # nieuw
                running = False  # nieuw

            if event.key == pygame.K_LEFT:
                x -= 5
            if event.key == pygame.K_RIGHT:
                x += 5

Kopieer bovenstaande code en voer uit. Pas de code aan zodat je je speler met de pijltjestoetsen naar boven en onder kunt verplaatsen.

If-elif-else

Eerder zagen we hoe we code conditioneel kunnen uitvoeren met behulp van “if” en “else”.

import pygame

pygame.init()
screen = pygame.display.set_mode((800, 600))

player = pygame.image.load("ship.png")

x = 0
y = 480

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                x = x - 5
            if event.key == pygame.K_RIGHT:
                x = x + 5

    screen.fill("white")
    screen.blit(player, (x, y))
    pygame.display.flip()

Als we echter meerdere condities willen testen kunnen we “elif” gebruiken:

import pygame

pygame.init()
screen = pygame.display.set_mode((800, 600))

player = pygame.image.load("ship.png")

x = 0
y = 0
xchange = 0.01

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    x = x + xchange
    screen.fill("white")
    screen.blit(player, (x, y))
    pygame.display.flip()

We kunnen onze code dan ook als volgt aanpassen:

import pygame

WIDTH = 800
HEIGHT = 600

pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))

player = pygame.image.load("ship.png")

x = WIDTH / 2
xchange = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                xchange = -0.1
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT:
                xchange = 0

    x = x + xchange
    screen.fill("white")
    screen.blit(player, (x, HEIGHT - 110))
    pygame.display.flip()