Тряска экрана
Часть раздела Звук и игровые ощущения путешествия по Pygame на Coddy. Урок 12 из 23.
Тяжёлый ящик падает на землю, и вся картинка на мгновение содрогается. Это тряска экрана: несколько кадров всё изображение смещается на несколько пикселей, причём каждый кадр по-разному.
Чтобы переместить всё сразу, рисуйте игровой мир на отдельной поверхности вместо экрана, а затем выводите эту поверхность на экран со смещением:
world = pygame.Surface((480, 360))В цикле вызовы отрисовки, в которых использовался screen, теперь используют world. Затем задайте смещение:
offset = (0, 0)
if shake > 0:
amount = shake // 3
offset = (random.randint(-amount, amount), random.randint(-amount, amount))
shake -= 1
screen.fill((0, 0, 0))
screen.blit(world, offset)shake отсчитывает оставшиеся кадры тряски. При приземлении задайте ему значение 12. Поскольку amount равен shake // 3, в первых кадрах изображение смещается максимум на 4 пикселя, затем на 3, 2, 1 и ни на сколько: толчок постепенно затихает, а не прекращается резко. Сначала залейте экран чёрным, потому что при смещении мира на 4 пикселя останется узкая незаполненная полоса.
Задание
СреднеПри нажатии пробела падает ящик, и при его приземлении переменной shake = 12 присваивается значение, которое пока нигде не используется. Добавь тряску экрана:
- Перед циклом создай
world = pygame.Surface((480, 360)). - Рисуй фон, землю, столб и ящики на
world, а не наscreen. - Пока
shakeбольше 0, выбери смещение с помощьюamount = shake // 3иrandom.randint(-amount, amount)для координат x и y, затем уменьшиshakeна 1. - Залей экран чёрным цветом и выведи
worldсо смещением.
Попробуйте сами
import random
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Crate Drop")
clock = pygame.time.Clock()
thud_sound = pygame.mixer.Sound("assets/sounds/thud.ogg")
falling = []
landed = []
shake = 0
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
falling.append(pygame.Rect(random.randint(140, 400), -40, 40, 40))
for crate in falling:
crate.y += 8
if crate.bottom >= 300:
crate.bottom = 300
landed.append(crate)
thud_sound.play()
shake = 12
falling = [crate for crate in falling if crate.bottom < 300]
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (80, 80, 100), (0, 300, 480, 60))
pygame.draw.rect(screen, (80, 160, 255), (60, 220, 30, 80))
for crate in falling + landed:
pygame.draw.rect(screen, (170, 110, 60), crate)
pygame.display.flip()
clock.tick(60)
pygame.quit()
Все уроки раздела Звук и игровые ощущения
4Тряска экрана и вспышка при попадании
Тряска экранаВспышка при попаданииОстановка при попаданииСоблюдайте умеренность6Доведём «Звёздный патруль» до блеска
Звуки «Звёздного патруля»Искры при каждом попаданииПотренируйтесь самостоятельно: Песочница Pygame