Menu
CoddyTech

Survol et surbrillance

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

Tester gx <= x <= gx + 30 à chaque fois devient fastidieux. Pygame possède une classe pour les rectangles, pygame.Rect, qui regroupe une position et une taille et effectue ces tests pour vous :

gem = pygame.Rect(225, 165, 30, 30)

if gem.collidepoint(event.pos):
    score += 1

gem.collidepoint(point) vaut True lorsque le point se trouve à l'intérieur du Rect. Vous pouvez toujours lire et modifier gem.x et gem.y, et un Rect nomme les points qui lui sont propres : gem.midtop, gem.midright, gem.midbottom et gem.midleft correspondent aux milieux de ses côtés, qui sont les quatre coins de la gemme.

Le même test avec la position du pointeur vous indique si le joueur pointe vers la gemme. Les jeux le signalent en la mettant en évidence :

if gem.collidepoint(pygame.mouse.get_pos()):
    pygame.draw.rect(screen, (255, 196, 0), gem.inflate(10, 10), 2)

gem.inflate(10, 10) crée un nouveau Rect 10 pixels plus large et plus haut, avec le même centre, de sorte que le contour se trouve à 5 pixels à l'extérieur de la gemme.

challenge icon

Défi

Facile
  1. Remplacez gx, gy = 225, 165 par gem = pygame.Rect(225, 165, 30, 30), et utilisez gem.x et gem.y là où vous utilisiez gx et gy.
  2. Dessinez la gemme à partir de [gem.midtop, gem.midright, gem.midbottom, gem.midleft], et détectez les clics avec gem.collidepoint(event.pos).
  3. Après la gemme, lorsque le pointeur est dessus, dessinez le contour jaune (255, 196, 0) de gem.inflate(10, 10), d’une largeur de 2 pixels.

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

gx, gy = 225, 165
score = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN:
            x, y = event.pos
            if gx <= x <= gx + 30 and gy <= y <= gy + 30:
                score += 1
                gx = random.randint(15, 435)
                gy = random.randint(55, 315)

    screen.fill((30, 30, 46))
    gem_points = [(gx + 15, gy), (gx + 30, gy + 15), (gx + 15, gy + 30), (gx, gy + 15)]
    pygame.draw.polygon(screen, (80, 220, 255), gem_points)
    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