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.
Défi
FacileFais en sorte que la caisse cache la gemme et qu’un clic dessus ne puisse pas attraper la gemme.
- Déplace la ligne qui dessine la caisse après le contour de la gemme, puis dessine
cratede nouveau en dessous, en(110, 70, 35)avec une largeur de3, pour représenter son bord. - Dans la branche
MOUSEBUTTONDOWN, remplace leifde la gemme parelif, 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
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’écranEntraînez-vous par vous-même : Playground Pygame