De plus en plus vite
Fait partie de la section La boucle de jeu du Journey Pygame de Coddy. Leçon 32 sur 32.
Un jeu devient plus difficile à mesure qu’il avance. Ici, les blocs tombent un peu plus vite toutes les 10 secondes.
pygame.time.set_timer(event_type, ms) ajoute un événement de ce type toutes les ms millisecondes. Crée ton propre type d’événement avec pygame.USEREVENT, un numéro que pygame te laisse libre d’utiliser :
SPEED_UP = pygame.USEREVENT + 1
pygame.time.set_timer(SPEED_UP, 10000)
fall_speed = 3
for event in pygame.event.get():
if event.type == SPEED_UP:
fall_speed += 1L’événement arrive dans la boucle d’événements avec les autres, toutes les 10 secondes. Le bloc tombe alors avec block.y += fall_speed au lieu d’une valeur fixe de 3. Une nouvelle partie recommence lentement, donc le redémarrage rétablit aussi fall_speed = 3.
Défi
Moyen- Sous la police, définis
SPEED_UP = pygame.USEREVENT + 1et démarre un minuteur pour cet événement toutes les 10000 ms. - Définis
fall_speed = 3avant la boucle et utilise cette valeur pour la chute. - Ajoute 1 à
fall_speedlorsqu’un événement SPEED_UP arrive. - Remets sa valeur à 3 lorsque R démarre une nouvelle partie.
Essayez vous-même
import random
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Catch the Blocks")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)
basket = pygame.Rect(200, 330, 80, 16)
block = pygame.Rect(220, 0, 20, 20)
score = 0
lives = 3
paused = False
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_p:
paused = not paused
elif event.key == pygame.K_r and (lives == 0 or score == 10):
score = 0
lives = 3
basket.x = 200
block.y = -20
block.x = random.randint(0, 460)
if lives > 0 and score < 10 and not paused:
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
basket.x -= 8
if keys[pygame.K_RIGHT]:
basket.x += 8
basket.clamp_ip(screen.get_rect())
block.y += 3
if block.top > 360:
block.y = -20
block.x = random.randint(0, 460)
lives -= 1
if block.colliderect(basket):
block.y = -20
block.x = random.randint(0, 460)
score += 1
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (80, 160, 255), basket)
pygame.draw.rect(screen, (235, 80, 80), block)
score_text = font.render(f"Score: {score}", True, (240, 240, 240))
screen.blit(score_text, (10, 10))
lives_text = font.render(f"Lives: {lives}", True, (240, 240, 240))
screen.blit(lives_text, (370, 10))
if lives == 0:
message = font.render("Game over", True, (240, 240, 240))
screen.blit(message, message.get_rect(center=(240, 160)))
elif score == 10:
message = font.render("You win!", True, (240, 240, 240))
screen.blit(message, message.get_rect(center=(240, 160)))
if lives == 0 or score == 10:
again = font.render("Press R to play again", True, (240, 240, 240))
screen.blit(again, again.get_rect(center=(240, 200)))
if paused:
message = font.render("Paused", True, (240, 240, 240))
screen.blit(message, message.get_rect(center=(240, 160)))
pygame.display.flip()
clock.tick(60)
pygame.quit()
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de La boucle de jeu
1Déplacer un carré
Ouvrir une fenêtreRemplir l’arrière-plan4Déplacement en fonction du temps
Temps deltaPixels par secondeVector2Accélération et frictionBoucler autour de l’écran2Formes et couleurs
Cercles, lignes et polygonesContours et anglesUne scène de formesDes couleurs qui changent5Attrape les blocs
Le panierUn bloc qui tombeEntraînez-vous par vous-même : Playground Pygame