cdec/README_TIPS.md
2025-10-12 10:52:09 +02:00

6.8 KiB

Tipps & Hinweise

Titelbild und Logo einfügen

  • Ein Logo macht das Spiel persönlicher! Die Funktion zum Laden eines Logos ist im Code vorbereitet, aber aktuell deaktiviert.

  • Die Kids können später ein eigenes Logo als images/logo.png erstellen und die folgende Zeile in water-game.py aktivieren:

    # logo_img = pygame.image.load("images/logo.png")
    # pygame.display.set_icon(logo_img)
    
  • Tipp: Das Logo sollte quadratisch und als PNG gespeichert sein.

  • So kann jeder sein eigenes Spiel-Icon gestalten!

Titelbildschirm, Gewinn- und Verlustbildschirm

  • Implementiere einen Titelbildschirm und zeige bei Spielende einen Gewinn- oder Verlustbildschirm (siehe Codebeispiel unten).

Beispiel für Titelbildschirm und Gewinn/Verlust:

# Titelbildschirm anzeigen
show_title_screen(WIN)
# ...
if win_condition:
    show_win_screen(WIN)
elif lose_condition:
    show_lose_screen(WIN)

So kannst du Gewinn- und Verlustbildschirme umsetzen:

  1. Schreibe eine Funktion, die den Bildschirm einfärbt und einen Text anzeigt:
def show_win_screen(win):
    win.fill((40, 180, 80))
    font = pygame.font.SysFont(None, 72)
    text = font.render("Gewonnen!", True, (255, 255, 255))
    win.blit(text, (win.get_width() // 2 - text.get_width() // 2, win.get_height() // 2 - text.get_height() // 2))
    pygame.display.update()
    pygame.time.wait(2500)

def show_lose_screen(win):
    win.fill((180, 40, 40))
    font = pygame.font.SysFont(None, 72)
    text = font.render("Verloren!", True, (255, 255, 255))
    win.blit(text, (win.get_width() // 2 - text.get_width() // 2, win.get_height() // 2 - text.get_height() // 2))
    pygame.display.update()
    pygame.time.wait(2500)
  1. Rufe die jeweilige Funktion auf, wenn die Gewinn- oder Verlustbedingung erfüllt ist:
if win_condition:
    show_win_screen(WIN)
elif lose_condition:
    show_lose_screen(WIN)
  • Die Bedingungen kannst du selbst festlegen, z.B. alle Gegner besiegt = Gewinn, Spieler tot = Verlust.
  • Nach dem Bildschirm kannst du das Spiel beenden oder neu starten.

Gameplay-Tipp: Begrenzte Wasserflaschen & Auffüllen an Trinkbrunnen

  • Implementiere eine Variable für die Anzahl der Wasserflaschen (Munition), z.B. player.ammo.
  • Verringere player.ammo bei jedem Schuss (SPACE).
  • Erlaube das Auffüllen der Munition, wenn der Spieler einen Trinkbrunnen-Pixel berührt (z.B. durch Kollisionsabfrage mit Trinkbrunnen-Positionen).
  • Zeige die aktuelle Munition als Zahl oder Symbol im HUD an.

Beispiel (Pseudo-Code):

# Beim Schießen:
if player.ammo > 0:
    bottles.append(TapWater(player.x, player.y, player.dir))
    player.ammo -= 1

# Beim Berühren eines Trinkbrunnens:
for brunnen in trinkbrunnen_list:
    if player.rect.colliderect(brunnen.rect):
        player.ammo = MAX_AMMO
  • Die Trinkbrunnen-Positionen kannst du aus der GeoJSON oder aus einer Liste von Pixelkoordinaten laden.
  • So wird das Sammeln und Nachfüllen von Wasser spielerisch relevant!

Trinkbrunnen-Pixelpositionen ins Spiel laden und anzeigen

  • Die Datei trinkbrunnen_pixel_positions.npy enthält alle Trinkbrunnen-Positionen als Pixelkoordinaten.
  • So lädst du die Positionen und zeichnest die Trinkbrunnen im Spiel:

Schritt 1: Importiere numpy und lade die Datei

import numpy as np
trinkbrunnen_positions = np.load('trinkbrunnen_pixel_positions.npy')

Schritt 2: Zeichne die Trinkbrunnen in der Spielschleife

for px, py in trinkbrunnen_positions:
    pygame.draw.circle(WIN, (0, 180, 255), (px - ox, py - oy), 10)
  • ox und oy sind die Offsets für das Kamerascrolling (falls verwendet).
  • Die Farbe (0, 180, 255) ist ein helles Blau, der Radius 10 kann angepasst werden.

Schritt 3: Interaktion mit Trinkbrunnen

  • Um z.B. Munition aufzufüllen, prüfe ob der Spieler einen Trinkbrunnen berührt:
player_rect = pygame.Rect(player.x, player.y, PLAYER_SIZE, PLAYER_SIZE)
for px, py in trinkbrunnen_positions:
    brunnen_rect = pygame.Rect(px, py, 20, 20)  # Größe anpassen
    if player_rect.colliderect(brunnen_rect):
        player.ammo = MAX_AMMO
  • So werden die Trinkbrunnen sichtbar und interaktiv im Spiel!

.exe erstellen (Windows)

Kurzanleitung auf Deutsch:

  1. Installiere PyInstaller:

    pip install pyinstaller
    
  2. Konvertiere dein Logo zu einer .ico-Datei (z.B. mit favicon.io).

  3. Erstelle die .exe:

    pyinstaller --onefile --windowed --icon=images/logo.ico water-game.py
    
  4. Die ausführbare Datei findest du im dist-Ordner.

Mac: App als ausführbare Datei erstellen

Kurzanleitung auf Deutsch:

  1. Installiere PyInstaller:

    pip install pyinstaller
    
  2. Erstelle die Mac-App:

    pyinstaller --onefile --windowed --icon=images/logo.png water-game.py
    
    • Das Icon kann als PNG verwendet werden.
    • Die App wird im dist-Ordner als ausführbare Datei erscheinen.
  3. (Optional) Um eine echte Mac-App zu erzeugen, nutze das Flag --name und --osx-bundle-identifier:

    pyinstaller --onefile --windowed --icon=images/logo.png --name=WasserGame --osx-bundle-identifier=com.deinname.wassergame water-game.py
    

Hinweis:

  • Die App kann per Doppelklick gestartet werden.
  • Für die Verteilung an andere Macs kann eine Code-Signierung und Notarisierung nötig sein (siehe Apple Doku).

Tipp: Intro-Video vor Spielstart abspielen

  • Du kannst ein Video (z.B. MP4) als Intro vor dem eigentlichen Spiel abspielen.
  • Nutze dazu z.B. die Bibliothek pygame-vlc oder opencv-python zum Abspielen von Videos im Pygame-Fenster.

Beispiel mit pygame-vlc:

import vlc
import pygame

def play_intro_video(win, video_path):
    instance = vlc.Instance()
    player = instance.media_player_new()
    media = instance.media_new(video_path)
    player.set_media(media)
    player.set_xwindow(win.get_window_id())  # Für Linux, für Windows/Mac ggf. anpassen
    player.play()
    # Warte bis das Video fertig ist oder eine Taste gedrückt wird
    playing = True
    while playing:
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN or event.type == pygame.QUIT:
                player.stop()
                playing = False
        pygame.time.wait(100)
  • Das Video kann z.B. als intro.mp4 im Projektordner liegen.
  • Nach dem Intro kannst du wie gewohnt den Titelbildschirm anzeigen.
  • Für Windows/Mac kann die Fenster-ID Methode abweichen, siehe Doku von pygame-vlc.

Zusätzliche Hinweise

  • Stelle sicher, dass alle Bilder und Daten im richtigen Pfad liegen.
  • Für komplexe Projekte nutze eine PyInstaller spec file.