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 FrameBeim 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.
Aufgabe
EinfachKlicke auf den violetten Edelstein, um ihn einzusammeln. Lass das goldene Symbol aufploppen:
- Setze
pop = 1.0vor der Schleife. - Setze
pop = 1.6, wenn ein Edelstein eingesammelt wird. - Lass ihn in jedem Frame sanft zurückgehen:
pop += (1 - pop) * 0.2. - 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
5Flüssige Bewegung
Auf ein Ziel zubewegenEine flüssige KamerabewegungBeim Aufsammeln aufspringenBei jeder Bildrate flüssigÜbe selbstständig: Pygame-Playground