Menu
CoddyTech

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 -= 1

Lorsque 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.

challenge icon

Défi

Moyen
  1. 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.
  2. 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.
  3. Gère MOUSEBUTTONDOWN et MOUSEMOTION uniquement tant que time_left > 0.
  4. 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()
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Playground Pygame