Sessie 10: Cheatsheet (alle sessies)

Een overzicht van alle patronen uit sessies 1 tot 9. Gebruik dit als naslagwerk bij het bouwen van je eigen spel.


Pygame game loop (sessie 6+)

import pygame

pygame.init()
WIDTH, HEIGHT = 800, 500
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Mijn Spel")
clock = pygame.time.Clock()
font = pygame.font.SysFont(None, 36)

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                pass  # actie bij SPATIE

    screen.fill((20, 20, 50))

    # update-logica hier

    # teken-logica hier

    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Pgzrun game loop (sessies 1 tot 5)

import pgzrun

WIDTH = 600
HEIGHT = 400

def draw():
    screen.fill((20, 20, 50))

def update():
    pass  # vervang door jouw logica

pgzrun.go()

Toetsenbord

# Pgzrun stijl:
if keyboard.left:
    speler.x -= 5

# Pygame stijl:
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
    speler_rect.x -= 5
if keys[pygame.K_RIGHT]:
    speler_rect.x += 5
if keys[pygame.K_UP]:
    speler_rect.y -= 5
if keys[pygame.K_DOWN]:
    speler_rect.y += 5

Muisinput

# Positie:
mx, my = pygame.mouse.get_pos()

# Klikken (in event-loop):
if event.type == pygame.MOUSEBUTTONDOWN:
    if event.button == 1:  # linker muisknop
        pass

Actor / Sprite (pgzrun)

speler = Actor('speler')    # laadt images/speler.png
speler.pos = (300, 380)

def draw():
    speler.draw()

if speler.colliderect(ster):
    pass  # botsing!

Rect aanmaken en tekenen (pygame)

speler_rect = pygame.Rect(x, y, breedte, hoogte)
pygame.draw.rect(screen, (0, 128, 255), speler_rect)

# Cirkel:
pygame.draw.circle(screen, (255, 255, 0), (x, y), straal)

# Lijn:
pygame.draw.line(screen, (255, 0, 0), (x1, y1), (x2, y2), dikte)

Botsingsdetectie

# Twee Rects:
if rect_a.colliderect(rect_b):
    pass

# Punt in Rect:
if rect.collidepoint(mx, my):
    pass

# Pgzrun:
if actor_a.colliderect(actor_b):
    pass

Zwaartekracht en springen (sessie 6)

GRAVITY = 0.5
vel_y = 0
on_ground = False

# Elke frame:
vel_y += GRAVITY
speler_rect.y += int(vel_y)

for platform in platforms:
    if speler_rect.colliderect(platform) and vel_y > 0:
        speler_rect.bottom = platform.top
        vel_y = 0
        on_ground = True

# Springen:
if keys[pygame.K_SPACE] and on_ground:
    vel_y = -12

Klassen (sessie 7)

class Vijand:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.alive = True

    def update(self):
        self.y += 2

    def draw(self, screen):
        pygame.draw.circle(screen, (0, 200, 0), (int(self.x), int(self.y)), 15)

# Gebruik:
v = Vijand(200, 0)
v.update()
v.draw(screen)

Overerving (sessie 7)

class SlingerVijand(Vijand):
    def __init__(self, x, y):
        super().__init__(x, y)
        self.timer = 0
        self.start_x = x

    def update(self):
        import math
        self.timer += 0.05
        self.x = self.start_x + math.sin(self.timer) * 60
        self.y += 1.5

Scrollende achtergrond (sessie 8)

scroll_x = 0
speed = 4

# Elke frame:
scroll_x -= speed
if scroll_x <= -WIDTH:
    scroll_x = 0

screen.blit(bg_image, (int(scroll_x), 0))
screen.blit(bg_image, (int(scroll_x) + WIDTH, 0))

Objecten spawnen (sessie 8)

import random

SPAWN_EVENT = pygame.USEREVENT + 1
pygame.time.set_timer(SPAWN_EVENT, 1500)

for event in pygame.event.get():
    if event.type == SPAWN_EVENT:
        objecten.append(pygame.Rect(WIDTH, random.randint(50, HEIGHT - 100), 30, 60))

# Bewegen en verwijderen:
for obj in objecten[:]:
    obj.x -= speed
    if obj.x < -obj.width:
        objecten.remove(obj)

HP-balk tekenen (sessie 9)

MAX_HP = 100

# Achtergrond:
pygame.draw.rect(screen, (80, 0, 0), (10, 10, 300, 20))
# Gevuld deel:
breedte = max(0, int(300 * hp / MAX_HP))
pygame.draw.rect(screen, (220, 0, 0), (10, 10, breedte, 20))

State machine / fasen (sessie 9)

if hp > 50:
    fase = 1
    snelheid = 3
elif hp > 25:
    fase = 2
    snelheid = 5
else:
    fase = 3
    snelheid = 7

Kogels bijhouden

kogels = []

# Aanmaken (bij toetsdruk):
kogels.append(pygame.Rect(speler_rect.centerx - 3, speler_rect.top - 15, 6, 15))

# Bewegen en verwijderen:
for k in kogels[:]:
    k.y -= 8
    if k.y < 0:
        kogels.remove(k)
        continue
    pygame.draw.rect(screen, (255, 255, 0), k)

# Botsing met vijand:
    if k.colliderect(vijand_rect):
        kogels.remove(k)
        vijand.alive = False
        score += 1
        break

Geluid (sessie 6)

pygame.mixer.init()
sprong_snd = pygame.mixer.Sound("sounds/sprong.wav")
sprong_snd.play()

# Achtergrondmuziek:
pygame.mixer.music.load("sounds/muziek.mp3")
pygame.mixer.music.play(-1)  # -1 = herhaal oneindig

Tekst tekenen

font = pygame.font.SysFont(None, 36)
tekst = font.render(f"Score: {score}", True, (255, 255, 255))
screen.blit(tekst, (10, 10))

# Gecentreerd:
screen.blit(tekst, (WIDTH // 2 - tekst.get_width() // 2, HEIGHT // 2))

Score en globale variabelen

score = 0  # buiten alle functies

# In pgzrun update():
global score
score += 1

# In pygame (score is al globaal als het buiten de loop staat):
score += 1

Willekeurige getallen

import random

x = random.randint(0, WIDTH)          # geheel getal tussen 0 en WIDTH
k = random.choice(['rood', 'blauw'])  # willekeurig element uit een lijst
r = random.random()                    # zwevend getal tussen 0.0 en 1.0

Timer-patroon (frame-gebaseerd)

timer = 0
interval = 90  # elke 90 frames (= 1,5 sec bij 60 FPS)

# Elke frame:
timer += 1
if timer >= interval:
    timer = 0
    # doe iets

Win- en game over scherm

# Game over:
screen.fill((0, 0, 0))
go = font.render("GAME OVER", True, (220, 0, 0))
screen.blit(go, (WIDTH // 2 - go.get_width() // 2, HEIGHT // 2))
pygame.display.flip()
pygame.time.wait(3000)

# Win:
win = font.render("Gewonnen!", True, (255, 220, 0))
screen.blit(win, (WIDTH // 2 - win.get_width() // 2, HEIGHT // 2))
pygame.display.flip()
pygame.time.wait(3000)