Menu
CoddyTech

Sauter lors du ramassage

Fait partie de la section Son et sensations de jeu du Journey Pygame de Coddy. Leçon 18 sur 23.

Lorsque tu ramasses une gemme, le score augmente de un, mais ton regard est sur la gemme, pas sur le coin. Un bref effet de rebond attire le regard vers le compteur : l’icône s’agrandit brusquement, puis reprend sa taille.

Garde une échelle, 1.0 pour la taille normale. Un ramassage la règle sur 1.6 ; à chaque image, elle revient progressivement vers 1 avec la même ligne qu’avant :

pop = 1.6         # lorsqu’une gemme est ramassée

pop += (1 - pop) * 0.2    # à chaque image

Lors du dessin, l’échelle détermine la taille. Crée le Rect à cette taille, puis place son centre, afin que l’icône grandisse autour de son milieu plutôt qu’à partir de son coin :

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

Le saut est instantané et le retour est progressif. C’est ce qui donne l’impression d’un rebond : une fraction de 0.2 la ramène en environ un quart de seconde.

Pour une image, redimensionne-la avec pygame.transform.scale_by(image, pop) et centre son Rect de la même manière.

challenge icon

Défi

Facile

Clique sur la gemme violette pour la ramasser. Fais rebondir l’icône dorée :

  1. Définis pop = 1.0 avant la boucle.
  2. Définis pop = 1.6 lorsqu’une gemme est ramassée.
  3. À chaque image, ramène-la progressivement à sa valeur initiale : pop += (1 - pop) * 0.2.
  4. Dessine l’icône avec une largeur et une hauteur de int(20 * pop) pixels, toujours centrée en (30, 30).

Essayez vous-même

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()

Toutes les leçons de Son et sensations de jeu

Entraînez-vous par vous-même : Playground Pygame