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.
Défi
Moyen- Avant la boucle, crée
crate = pygame.Rect(40, 230, 60, 60)etdragging = False. - Lors de
MOUSEBUTTONDOWN, définisdragging = Truesi le clic est sur la caisse ; sinon (elif), teste le joyau comme précédemment. - Définis
dragging = Falselors deMOUSEBUTTONUP. Lors deMOUSEMOTION, pendant le glissement, déplace la caisse deevent.rel. - 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
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