<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Sessie 10: Mijn Spel :: CoderDojo Python &amp; Pygame</title><link>https://python.coderdojohasselt.be/sessions/python/10-my-game/index.html</link><description>Dit is jouw sessie. Geen vaste stappen, geen verplichte mechanics. Jij beslist wat je bouwt, en vandaag maak je het.
Jouw spel, jouw regels In negen sessies heb je geleerd:
Variabelen, functies en game loops Toetsenbord- en muisinput Sprites, collision detection en score Geluid en animatie Klassen en overerving Scrollende achtergronden, spawnen en moeilijkheidsscaling HP-balken, state machines en baas-AI Al die bouwstenen liggen klaar. Vandaag combineer je ze in je eigen spel.</description><generator>Hugo</generator><language>nl</language><atom:link href="https://python.coderdojohasselt.be/sessions/python/10-my-game/index.xml" rel="self" type="application/rss+xml"/><item><title>Sessie 10: Coach-notities</title><link>https://python.coderdojohasselt.be/sessions/python/10-my-game/mentor-notes/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://python.coderdojohasselt.be/sessions/python/10-my-game/mentor-notes/index.html</guid><description>Doel van deze sessie Dit is een open-ended sessie. Er is geen “Basic checkpoint” met vaste leerdoelen: het doel is dat elke ninja iets bouwt dat hij zelf bedacht heeft en er trots op is.
Succescriteria per niveau:
Basisninja: heeft een werkend pygame-venster met minstens één interactief element (bewegen, schieten, of botsing). Gevorderde ninja: combineert twee of meer mechanics uit eerdere sessies in een coherent spel. Expert-ninja: heeft een volledig speelbaar spel met begin, einde en feedback (score, levens, win/lose scherm). Voorbereiding (30 min vóór de sessie) Kijk de eerdere cheatsheets nog even na: ninjas zullen vragen stellen over patronen uit sessies 1 tot 9. De sessie 10 cheatsheet combineert alles; houd hem bij de hand. Bereid inspiratiemateriaal voor: printjes van de genre-opties of een dia met screenshot-voorbeelden van eenvoudige games helpen ninjas die vastlopen bij het kiezen van een concept. Reminder: het spel hoeft niet af te zijn. Zeg dit expliciet bij de intro. Een ninja die een werkende bewegings-mechanic heeft gebouwd is even geslaagd als iemand die een volledig spel heeft. Tijdsindeling (3 uur) Tijd Activiteit 0:00 tot 0:15 Welkom, uitleg van de vrije sessie, concept kiezen 0:15 tot 0:30 Plan maken (3 vragen op papier of in code) 0:30 tot 2:15 Bouwen: coaches lopen rond en helpen individueel 2:15 tot 2:45 Afwerken + showcase voorbereiden 2:45 tot 3:00 Showcase: iedereen presenteert 1 tot 2 minuten Rol van de coach vandaag Vandaag ben je minder instructeur en meer sparringpartner:</description></item><item><title>Sessie 10: Cheatsheet (alle sessies)</title><link>https://python.coderdojohasselt.be/sessions/python/10-my-game/cheatsheet/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://python.coderdojohasselt.be/sessions/python/10-my-game/cheatsheet/index.html</guid><description>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 &lt;= -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 &lt; -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 &lt; 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)</description></item><item><title>Sessie 10: Demo opname</title><link>https://python.coderdojohasselt.be/sessions/python/10-my-game/demo/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://python.coderdojohasselt.be/sessions/python/10-my-game/demo/index.html</guid><description>Sessie 10 is een vrije sessie: er is geen vaste oplossing en dus geen demo-GIF voor de sessiepagina.
Alternatief: showcase-foto’s Neem tijdens de showcase foto’s van de schermen van de ninjas (met hun toestemming). Je kunt een selectie plaatsen op de sessiepagina als gallerij van wat de groep gebouwd heeft.
Voeg foto’s toe in static/sessions/10-my-game/ en verwijs ernaar via:
![Spel van ninja X](/sessions/10-my-game/naam.jpg) Optioneel: eigen starter-demo Als je een voorbeeldspel wilt tonen dat de starter demonstreert, run dan:</description></item></channel></rss>