Резкий эффект при подборе
Часть раздела Звук и игровые ощущения путешествия по Pygame на Coddy. Урок 18 из 23.
Когда ты собираешь самоцвет, счёт увеличивается на единицу, но ты смотришь на самоцвет, а не на угол экрана. Короткий всплеск привлекает внимание к счётчику: значок увеличивается, а затем уменьшается до исходного размера.
Задай масштаб 1.0 для обычного размера. При сборе самоцвета установи его равным 1.6; каждый кадр он плавно возвращается к 1 той же строкой, что и раньше:
pop = 1.6 # когда собирают самоцвет
pop += (1 - pop) * 0.2 # каждый кадрПри отрисовке масштаб задаёт размер. Создай Rect этого размера, а затем установи его центр в нужное место, чтобы значок увеличивался вокруг середины, а не из угла:
size = int(20 * pop)
icon = pygame.Rect(0, 0, size, size)
icon.center = (30, 30)Увеличение происходит мгновенно, а обратное уменьшение — плавно. Именно это и создаёт эффект всплеска: доля 0.2 возвращает значок к исходному размеру примерно за четверть секунды.
Для изображения измени его масштаб с помощью pygame.transform.scale_by(image, pop) и так же установи центр его Rect.
Задание
ЛегкоНажми на фиолетовый самоцвет, чтобы собрать его. Сделай так, чтобы золотой значок увеличивался:
- Задай
pop = 1.0перед циклом. - Задай
pop = 1.6, когда самоцвет собран. - Каждый кадр плавно возвращай значение:
pop += (1 - pop) * 0.2. - Нарисуй значок шириной и высотой
int(20 * pop)пикселей, оставив его центр в точке(30, 30).
Попробуйте сами
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()
Все уроки раздела Звук и игровые ощущения
4Тряска экрана и вспышка при попадании
Тряска экранаВспышка при попаданииОстановка при попаданииСоблюдайте умеренность5Плавное движение
Движение к целиПлавная камераРезкий эффект при подбореПлавность при любой частоте кадров6Доведём «Звёздный патруль» до блеска
Звуки «Звёздного патруля»Искры при каждом попаданииПотренируйтесь самостоятельно: Песочница Pygame