Salto ao Coletar
Parte da seção Som e sensação de jogo do Journey de Pygame da Coddy. Lição 18 de 23.
Quando você coleta uma gema, a pontuação aumenta em um, mas seu olhar está na gema, não no canto. Um breve salto atrai o olhar para o contador: o ícone aumenta de tamanho e depois volta a encolher.
Mantenha uma escala, 1.0 para o tamanho normal. Ao coletar uma gema, defina-a como 1.6; a cada quadro, ela volta suavemente para 1 usando a mesma expressão de antes:
pop = 1.6 # quando uma gema é coletada
pop += (1 - pop) * 0.2 # a cada quadroAo desenhar, a escala define o tamanho. Crie o Rect nesse tamanho e depois coloque o centro dele na posição desejada, para que o ícone cresça a partir do meio, em vez de partir do canto:
size = int(20 * pop)
icon = pygame.Rect(0, 0, size, size)
icon.center = (30, 30)O aumento é instantâneo, e a volta é suave. É isso que dá a impressão de um salto: uma fração de 0.2 faz com que ele volte em cerca de um quarto de segundo.
Para uma imagem, redimensione-a com pygame.transform.scale_by(image, pop) e centralize o Rect da mesma maneira.
Desafio
FácilClique na gema roxa para coletá-la. Faça o ícone dourado saltar:
- Defina
pop = 1.0antes do loop. - Defina
pop = 1.6quando uma gema for coletada. - A cada quadro, suavize o retorno:
pop += (1 - pop) * 0.2. - Desenhe o ícone com
int(20 * pop)pixels de largura e altura, ainda centralizado em(30, 30).
Experimente você mesmo
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 as lições de Som e sensação de jogo
4Vibração da Tela e Flash de Impacto
Vibração da TelaFlash de ImpactoPausa no ImpactoMantenha a Discrição5Movimento Suave
Mova-se em Direção a um AlvoUma Câmera SuaveSalto ao ColetarSuave em Qualquer Taxa de QuadrosPratique por conta própria: Playground de Pygame