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.
Aufgabe
MittelBei der Leertaste fallen Kisten herunter, und jede Landung erhöht shake um 12. Dämpfe das ab:
- Ändere die Landung so, dass
shakenie über 18 steigt:shake = min(shake + 12, 18). - Setze
shake_on = Truevor der Schleife; S schaltet den Wert um. - Wähle einen zufälligen Versatz nur, wenn
shake_onwahr ist. - Zeichne nach dem Blitten der Welt
Shake: OnoderShake: Offbei(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()
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