Efecto pop al recoger
Parte de la sección Sonido y sensaciones del juego del Journey de Pygame de Coddy. Lección 18 de 23.
Cuando recoges una gema, la puntuación aumenta en uno, pero tienes la vista puesta en la gema, no en la esquina. Un breve salto atrae la atención al contador: el icono aumenta de tamaño y después vuelve a reducirse.
Mantén una escala de 1.0 para el tamaño normal. Al recoger una gema, se establece en 1.6; en cada fotograma, vuelve poco a poco hacia 1 con la misma línea de antes:
pop = 1.6 # cuando se recoge una gema
pop += (1 - pop) * 0.2 # en cada fotogramaAl dibujar, la escala determina el tamaño. Crea el Rect con ese tamaño y después coloca su centro en su sitio, para que el icono crezca desde el medio en lugar de hacerlo desde la esquina:
size = int(20 * pop)
icon = pygame.Rect(0, 0, size, size)
icon.center = (30, 30)El salto es instantáneo y el regreso es gradual. Eso es lo que hace que parezca un salto: una fracción de 0.2 hace que vuelva en aproximadamente un cuarto de segundo.
Para una imagen, escálala con pygame.transform.scale_by(image, pop) y centra su Rect de la misma manera.
Desafío
FácilHaz clic en la gema morada para recogerla. Haz que el icono dorado dé un salto:
- Establece
pop = 1.0antes del bucle. - Establece
pop = 1.6cuando se recoja una gema. - En cada fotograma, haz que vuelva gradualmente:
pop += (1 - pop) * 0.2. - Dibuja el icono con una anchura y una altura de
int(20 * pop)píxeles, manteniéndolo centrado en(30, 30).
Pruébalo tú mismo
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()
Todas las lecciones de Sonido y sensaciones del juego
1Efectos de sonido
Cargar un sonidoSonido al ocurrir un eventoVolumen del sonidoSonidos y teclas presionadas4Sacudida de pantalla y destello de impacto
Sacudida de pantallaDestello de impactoPausa tras el impactoMantén la sutileza5Movimiento suave
Moverse hacia un objetivoUna cámara suaveEfecto pop al recogerSuavidad a cualquier tasa de fotogramasPractica por tu cuenta: Playground de Pygame