Menu
CoddyTech

La caisse cache la gemme

Fait partie de la section La boucle de jeu du Journey Pygame de Coddy. Leçon 18 sur 35.

La caisse est dessinée avant la gemme, donc la gemme apparaît par-dessus. Pour qu’une caisse puisse cacher la gemme, dessine la caisse après la gemme : ce qui est dessiné en dernier recouvre ce qui est déjà là.

Ensuite, un clic sur la caisse ne doit pas atteindre le test de la gemme ni attraper une gemme que le joueur ne peut pas voir. Les deux tests if sont exécutés. Avec elif, le second n’est exécuté que si le premier était faux : un seul des deux tests prend donc en compte le clic :

if crate.collidepoint(event.pos):
    dragging = True
elif gem.collidepoint(event.pos):
    print("Got it!")

Teste d’abord ce qui est dessiné par-dessus. Un clic sur la caisse n’atteint alors jamais la gemme qui se trouve derrière.

Un bord plus foncé donne à une boîte un aspect solide. Redessine le même Rect dans une couleur plus foncée en indiquant une largeur : seul son contour sera dessiné, par-dessus le remplissage.

challenge icon

Défi

Facile

Fais en sorte que la caisse cache la gemme et qu’un clic dessus ne puisse pas attraper la gemme.

  1. Déplace la ligne qui dessine la caisse après le contour de la gemme, puis dessine crate de nouveau en dessous, en (110, 70, 35) avec une largeur de 3, pour représenter son bord.
  2. Dans la branche MOUSEBUTTONDOWN, remplace le if de la gemme par elif, sous le test de la caisse.

Appuie sur « Jouer », fais glisser la caisse sur la gemme et clique dessus : la gemme reste cachée et aucune marque rose n’apparaît. Puis appuie sur « Vérifier ».

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
            if 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))
    pygame.draw.rect(screen, (150, 100, 50), crate)
    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)
    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()

Toutes les leçons de La boucle de jeu

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