Menu
CoddyTech

Faire glisser la caisse

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

Un glissement nécessite trois événements. Le bouton est enfoncé sur la caisse (MOUSEBUTTONDOWN), le pointeur se déplace (MOUSEMOTION, de nombreuses fois), puis le bouton est relâché (MOUSEBUTTONUP). Une variable mémorise si un glissement est en cours entre ces événements :

elif event.type == pygame.MOUSEBUTTONDOWN:
    if crate.collidepoint(event.pos):
        dragging = True
elif event.type == pygame.MOUSEBUTTONUP:
    dragging = False
elif event.type == pygame.MOUSEMOTION and dragging:
    crate.move_ip(event.rel)

Pour un événement MOUSEMOTION, event.rel indique de quelle distance le pointeur s'est déplacé depuis le précédent, sous la forme (x, y). crate.move_ip(event.rel) déplace la caisse de la même distance, de sorte que l'endroit où vous l'avez saisie reste sous le pointeur.

La caisse est dessinée après la gemme et peut donc la cacher. Un clic sur la caisse ne doit alors pas collecter la gemme qui se trouve dessous : vérifiez d'abord la caisse, puis la gemme avec elif, afin qu'un seul des deux éléments réagisse au clic.

challenge icon

Défi

Moyen
  1. Avant la boucle, crée crate = pygame.Rect(40, 230, 60, 60) et dragging = False.
  2. Lors de MOUSEBUTTONDOWN, définis dragging = True si le clic est sur la caisse ; sinon (elif), teste le joyau comme précédemment.
  3. Définis dragging = False lors de MOUSEBUTTONUP. Lors de MOUSEMOTION, pendant le glissement, déplace la caisse de event.rel.
  4. Après le contour du joyau, dessine la caisse en marron (150, 100, 50), avec un bord de (110, 70, 35) de 3 pixels de large.

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)
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 gem.collidepoint(event.pos):
                score += 1
                gem.x = random.randint(15, 435)
                gem.y = random.randint(55, 315)

    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)
    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