Tremblement de l’écran
Fait partie de la section Son et sensations de jeu du Journey Pygame de Coddy. Leçon 12 sur 23.
Une lourde caisse heurte le sol et toute la vue tremble un instant. C’est le tremblement de l’écran : pendant quelques images, tout est dessiné avec un décalage de quelques pixels, différent à chaque image.
Pour tout déplacer à la fois, dessine le monde sur une Surface dédiée au lieu de le dessiner à l’écran, puis blitte cette Surface sur l’écran avec un décalage :
world = pygame.Surface((480, 360))Dans la boucle, les appels de dessin qui utilisaient screen utilisent maintenant world. Choisis ensuite le décalage :
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 compte le nombre d’images restantes pendant lesquelles l’écran tremble. Un atterrissage lui donne la valeur 12. Comme amount vaut shake // 3, les premières images déplacent l’image jusqu’à 4 pixels, puis de 3, 2, 1 pixel, puis plus du tout : la secousse s’atténue au lieu de s’arrêter brusquement. Remplis d’abord l’écran de noir, car un monde déplacé de 4 pixels laisse une fine bande découverte.
Défi
MoyenLa barre d’espace fait tomber une caisse, et son atterrissage définit shake = 12, qui n’est pas encore utilisé. Faites trembler la vue :
- Avant la boucle, créez
world = pygame.Surface((480, 360)). - Dessinez l’arrière-plan, le sol, le poteau et les caisses sur
worldplutôt que surscreen. - Tant que
shakeest supérieur à 0, choisissez un décalage avecamount = shake // 3etrandom.randint(-amount, amount)pour x et y, puis diminuezshakede 1. - Remplissez l’écran en noir et affichez
worldau décalage choisi.
Essayez vous-même
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()
Toutes les leçons de Son et sensations de jeu
4Tremblement de l’écran et flash d’impact
Tremblement de l’écranFlash d’impactArrêt sur impactRester subtilEntraînez-vous par vous-même : Playground Pygame