Chasse aux gemmes
Fait partie de la section La boucle de jeu du Journey Pygame de Coddy. Leçon 17 sur 32.
Maintenant, la caisse devient le jeu. Chaque gemme apparaît sous la caisse : fais glisser la caisse pour la déplacer, puis clique sur la gemme, et la caisse se déplace sur la suivante. Une manche dure 30 secondes.
Place la caisse sur la gemme en lui donnant le centre de la gemme : crate.center = gem.center. Fais-le avant la boucle et chaque fois qu’une nouvelle gemme apparaît.
Compte le temps en images. À 60 images par seconde, 30 secondes font 1800 images :
time_left = 1800
while running:
# événements
if time_left > 0:
time_left -= 1Lorsque time_left atteint 0, le jeu ne prend plus en compte les clics ni les glissements, et la ligne du score affiche le résultat. Ajoute and time_left > 0 aux tests MOUSEBUTTONDOWN et MOUSEMOTION.
Une barre en haut indique le temps restant. Sa largeur représente la part de la manche qu’il reste à jouer : 480 * time_left // 1800 vaut 480 au début, 240 à mi-parcours et 0 à la fin.
Défi
Moyen- Après avoir créé la caisse, définis
crate.center = gem.center. Fais de même après avoir attribué une nouvelle position à une gemme ramassée. - Avant la boucle, définis
time_left = 1800. Dans la boucle, après les événements, soustrais-lui 1 tant qu’il est supérieur à 0. - Gère
MOUSEBUTTONDOWNetMOUSEMOTIONuniquement tant quetime_left > 0. - Après la rangée du score, dessine la barre de temps : en vert
(120, 200, 120)à(0, 0, 480 * time_left // 1800, 6).
Essayez vous-même
import random
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Gem Hunt")
clock = pygame.time.Clock()
gem = pygame.Rect(225, 165, 30, 30)
crate = pygame.Rect(40, 230, 60, 60)
dragging = False
score = 0
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
if crate.collidepoint(event.pos):
dragging = True
elif gem.collidepoint(event.pos):
score += 1
gem.x = random.randint(15, 435)
gem.y = random.randint(55, 315)
elif event.type == pygame.MOUSEBUTTONUP:
dragging = False
elif event.type == pygame.MOUSEMOTION and dragging:
crate.move_ip(event.rel)
screen.fill((30, 30, 46))
gem_points = [gem.midtop, gem.midright, gem.midbottom, gem.midleft]
pygame.draw.polygon(screen, (80, 220, 255), gem_points)
if gem.collidepoint(pygame.mouse.get_pos()):
pygame.draw.rect(screen, (255, 196, 0), gem.inflate(10, 10), 2)
pygame.draw.rect(screen, (150, 100, 50), crate)
pygame.draw.rect(screen, (110, 70, 35), crate, 3)
for i in range(score):
pygame.draw.rect(screen, (240, 110, 180), (10 + 10 * i, 14, 8, 8))
mouse_x, mouse_y = pygame.mouse.get_pos()
pygame.draw.circle(screen, (240, 240, 240), (mouse_x, mouse_y), 10, 2)
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’écran3La souris
Suivre le pointeurCliquer sur la gemmeEntraînez-vous par vous-même : Playground Pygame