Menu
CoddyTech

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 fotograma

Al 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.

challenge icon

Desafío

Fácil

Haz clic en la gema morada para recogerla. Haz que el icono dorado dé un salto:

  1. Establece pop = 1.0 antes del bucle.
  2. Establece pop = 1.6 cuando se recoja una gema.
  3. En cada fotograma, haz que vuelva gradualmente: pop += (1 - pop) * 0.2.
  4. 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

Practica por tu cuenta: Playground de Pygame