Menu
CoddyTech

Dezent bleiben

Teil des Abschnitts Sound und Spielgefühl der Pygame-Journey von Coddy. Lektion 15 von 23.

Game-Feeling ist wie Würze. Ein wenig Wackeln lässt eine Landung schwer wirken; zu viel macht das Spiel schwer lesbar und kann dazu führen, dass sich Spieler schlecht fühlen. Zwei Gewohnheiten halten es in Grenzen.

Begrenze es. Wenn sich Effekte stapeln, können sie unbegrenzt anwachsen. Hier addiert jede Landung 12 zu shake; wenn vier Kisten gleichzeitig landen, steigt der Wert über 40, und die Ansicht springt um 13 Pixel. min() setzt eine Obergrenze:

shake = min(shake + 12, 18)

Jetzt hält das Wackeln länger an, wenn weiterhin Kisten landen, aber es bewegt sich nie mehr als 18 // 3, also 6 Pixel.

Erlaube den Spielern, es auszuschalten. Manche Menschen können nicht spielen, wenn sich der Bildschirm bewegt. Eine Einstellung kostet eine Variable:

shake_on = True
...
if shake_on:
    offset = (random.randint(-amount, amount), random.randint(-amount, amount))

Zeichne die Beschriftung nach dem Blitten der Spielwelt direkt auf den Bildschirm. Text, der Teil der Benutzeroberfläche ist, sollte stillstehen, während die Spielwelt wackelt.

challenge icon

Aufgabe

Mittel

Bei der Leertaste fallen Kisten herunter, und jede Landung erhöht shake um 12. Dämpfe das ab:

  1. Ändere die Landung so, dass shake nie über 18 steigt: shake = min(shake + 12, 18).
  2. Setze shake_on = True vor der Schleife; S schaltet den Wert um.
  3. Wähle einen zufälligen Versatz nur, wenn shake_on wahr ist.
  4. Zeichne nach dem Blitten der Welt Shake: On oder Shake: Off bei (10, 10) auf den Bildschirm.

Probier es selbst

import random
import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Crate Drop")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 28)

thud_sound = pygame.mixer.Sound("assets/sounds/thud.ogg")
falling = []
landed = []
shake = 0
world = pygame.Surface((480, 360))

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
            falling.append(pygame.Rect(random.randint(140, 400), -40, 40, 40))

    for crate in falling:
        crate.y += 8
        if crate.bottom >= 300:
            crate.bottom = 300
            landed.append(crate)
            thud_sound.play()
            shake += 12
    falling = [crate for crate in falling if crate.bottom < 300]

    world.fill((30, 30, 46))
    pygame.draw.rect(world, (80, 80, 100), (0, 300, 480, 60))
    pygame.draw.rect(world, (80, 160, 255), (60, 220, 30, 80))
    for crate in falling + landed:
        pygame.draw.rect(world, (170, 110, 60), crate)

    offset = (0, 0)
    if shake > 0:
        amount = shake // 3
        offset = (random.randint(-amount, amount), random.randint(-amount, amount))
        shake -= 1
    screen.fill((0, 0, 0))
    screen.blit(world, offset)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Sound und Spielgefühl

Übe selbstständig: Pygame-Playground