Menu
CoddyTech

Beim Aufsammeln aufspringen

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

Wenn du einen Edelstein einsammelst, steigt der Punktestand um eins, aber dein Blick ist auf den Edelstein gerichtet, nicht auf die Ecke. Ein kurzes Aufploppen lenkt den Blick auf den Zähler: Das Symbol springt auf eine größere Größe und schrumpft dann wieder auf seine ursprüngliche Größe zurück.

Verwende einen Skalierungsfaktor von 1.0 für die normale Größe. Beim Einsammeln wird er auf 1.6 gesetzt; in jedem Frame nähert er sich mit derselben Zeile wie zuvor wieder der 1 an:

pop = 1.6         # wenn ein Edelstein eingesammelt wird

pop += (1 - pop) * 0.2    # in jedem Frame

Beim Zeichnen bestimmt der Skalierungsfaktor die Größe. Erzeuge das Rect in dieser Größe und setze dann seinen Mittelpunkt an die richtige Stelle, damit das Symbol um seine Mitte herum statt von seiner Ecke aus wächst:

size = int(20 * pop)
icon = pygame.Rect(0, 0, size, size)
icon.center = (30, 30)

Der Sprung erfolgt sofort, und die Rückkehr verläuft allmählich. Das lässt es wie ein Aufploppen wirken: Ein Faktor von 0.2 bringt es in etwa einer Viertelsekunde zurück.

Skaliere ein Bild mit pygame.transform.scale_by(image, pop) und zentriere sein Rect auf dieselbe Weise.

challenge icon

Aufgabe

Einfach

Klicke auf den violetten Edelstein, um ihn einzusammeln. Lass das goldene Symbol aufploppen:

  1. Setze pop = 1.0 vor der Schleife.
  2. Setze pop = 1.6, wenn ein Edelstein eingesammelt wird.
  3. Lass ihn in jedem Frame sanft zurückgehen: pop += (1 - pop) * 0.2.
  4. Zeichne das Symbol int(20 * pop) Pixel breit und hoch, weiterhin zentriert bei (30, 30).

Probier es selbst

import random
import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Gem Picker")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)

coin_sound = pygame.mixer.Sound("assets/sounds/coin.ogg")
gem = pygame.Rect(300, 200, 24, 24)
score = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN and gem.collidepoint(event.pos):
            score += 1
            coin_sound.play()
            gem.topleft = (random.randint(80, 420), random.randint(90, 300))

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (170, 90, 230), gem)
    icon = pygame.Rect(0, 0, 20, 20)
    icon.center = (30, 30)
    pygame.draw.rect(screen, (255, 200, 60), icon)
    label = font.render(f"x {score}", True, (240, 240, 240))
    screen.blit(label, (52, 20))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Alle Lektionen in Sound und Spielgefühl

Übe selbstständig: Pygame-Playground