Соблюдайте умеренность
Часть раздела Звук и игровые ощущения путешествия по Pygame на Coddy. Урок 15 из 23.
Ощущение игры — это приправа. Небольшая тряска делает приземление ощутимым; сильная затрудняет восприятие игры и может вызвать у игроков тошноту. Есть два способа держать её под контролем.
Ограничьте её. Когда эффекты складываются, их сила может расти без конца. Здесь каждое приземление добавляет 12 к shake; четыре ящика, приземлившиеся одновременно, увеличивают значение выше 40, и экран смещается на 13 пикселей. min() задаёт верхний предел:
shake = min(shake + 12, 18)Теперь тряска всё ещё длится дольше, если ящики продолжают приземляться, но экран смещается не более чем на 18 // 3, то есть на 6 пикселей.
Позвольте игрокам отключить её. Некоторые люди не могут играть, когда экран движется. Для настройки нужна всего одна переменная:
shake_on = True
...
if shake_on:
offset = (random.randint(-amount, amount), random.randint(-amount, amount))Выведите подпись после того, как выведете игровой мир на экран. Текст интерфейса должен оставаться неподвижным, пока игровой мир трясётся.
Задание
СреднеSpace сбрасывает ящики, и каждое приземление увеличивает shake на 12. Уменьшим тряску:
- Измени обработку приземления так, чтобы
shakeникогда не превышал 18:shake = min(shake + 12, 18). - Перед циклом задай
shake_on = True; клавиша S переключает его. - Выбирай случайное смещение, только пока
shake_onравно true. - После вывода мира на экран нарисуй на нём
Shake: OnилиShake: Offв точке(10, 10).
Попробуйте сами
import random
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Crate Drop")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 28)
thud_sound = pygame.mixer.Sound("assets/sounds/thud.ogg")
falling = []
landed = []
shake = 0
world = pygame.Surface((480, 360))
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]
world.fill((30, 30, 46))
pygame.draw.rect(world, (80, 80, 100), (0, 300, 480, 60))
pygame.draw.rect(world, (80, 160, 255), (60, 220, 30, 80))
for crate in falling + landed:
pygame.draw.rect(world, (170, 110, 60), crate)
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)
pygame.display.flip()
clock.tick(60)
pygame.quit()
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Звук и игровые ощущения
4Тряска экрана и вспышка при попадании
Тряска экранаВспышка при попаданииОстановка при попаданииСоблюдайте умеренность6Доведём «Звёздный патруль» до блеска
Звуки «Звёздного патруля»Искры при каждом попаданииПотренируйтесь самостоятельно: Песочница Pygame