Arrêt sur impact
Fait partie de la section Son et sensations de jeu du Journey Pygame de Coddy. Leçon 14 sur 23.
Un coup puissant a plus d’impact si le jeu s’arrête pendant une fraction de seconde. Les jeux de combat et d’action le font tout le temps : après un coup puissant, tout se fige pendant quelques images, puis le jeu reprend. Cela s’appelle le hit stop.
Utilisez à nouveau un compteur, qui indique le nombre d’images restantes avant la fin du gel. Tant qu’il est supérieur à 0, décrémentez-le et sautez toute la mise à jour. Continuez à dessiner pour que l’instant figé reste à l’écran :
if freeze > 0:
freeze -= 1
else:
enemy.x += enemy_speed
# ... le reste de la mise à jourNe l’activez que pour les coups qui comptent. Ici, le troisième coup vainc l’ennemi ; ce coup définit donc freeze = 12, soit un cinquième de seconde. Geler le jeu à chaque petit coup le rend pataud au lieu de lui donner de la force.
Le compteur du flash fait partie de la mise à jour, il s’arrête donc lui aussi : l’ennemi reste blanc pendant tout le gel, le son de l’explosion retentit, puis le jeu reprend. Les événements continuent de se produire pendant le gel, donc un joueur qui appuie alors sur une touche n’est pas ignoré ; ici, la barre d’espace ne porte un coup que si hp > 0.
Défi
MoyenL’ennemi se déplace vers la gauche et vers la droite ; trois coups avec Espace le vainquent. Fige le jeu lors du coup qui le vainc :
- Définis
freeze = 0avant la boucle. - Là où le coup fait passer
hpà 0, définisfreeze = 12. - Dans la mise à jour, tant que
freezeest supérieur à 0, diminue-le de 1 et ignore tout le reste de la mise à jour. Garde le dessin tel quel.
Essayez vous-même
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Training Dummy")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)
hit_sound = pygame.mixer.Sound("assets/sounds/hit.ogg")
explosion_sound = pygame.mixer.Sound("assets/sounds/explosion.ogg")
enemy = pygame.Rect(100, 150, 60, 60)
enemy_speed = 2
hp = 3
flash = 0
defeated = 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 and hp > 0:
hp -= 1
flash = 6
if hp == 0:
explosion_sound.play()
else:
hit_sound.play()
enemy.x += enemy_speed
if enemy.left < 40 or enemy.right > 440:
enemy_speed = -enemy_speed
if flash > 0:
flash -= 1
if hp == 0:
defeated += 1
hp = 3
enemy.x = 100
screen.fill((30, 30, 46))
if flash > 0:
pygame.draw.rect(screen, (255, 255, 255), enemy)
else:
pygame.draw.rect(screen, (220, 80, 80), enemy)
label = font.render(f"HP: {hp} Defeated: {defeated}", True, (240, 240, 240))
screen.blit(label, (20, 20))
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