Menu
CoddyTech

Evidenzia al passaggio

Fa parte della sezione Il game loop del percorso Pygame di Coddy. Lezione 15 di 32.

Eseguire ogni volta il test gx <= x <= gx + 30 diventa lungo. Pygame ha una classe per i rettangoli, pygame.Rect, che raggruppa posizione e dimensioni e svolge questi test per te:

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

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

gem.collidepoint(point) è True quando il punto si trova all'interno del Rect. Puoi comunque leggere e modificare gem.x e gem.y, e un Rect definisce i propri punti: gem.midtop, gem.midright, gem.midbottom e gem.midleft sono i punti medi dei suoi lati, che corrispondono ai quattro angoli della gemma.

Lo stesso test con la posizione del puntatore ti dice se il giocatore sta puntando la gemma. Nei giochi questo viene mostrato con un evidenziamento:

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

gem.inflate(10, 10) è un nuovo Rect più largo e più alto di 10 pixel, con lo stesso centro, quindi il contorno si trova 5 pixel all'esterno della gemma.

challenge icon

Sfida

Facile
  1. Sostituisci gx, gy = 225, 165 con gem = pygame.Rect(225, 165, 30, 30) e usa gem.x e gem.y al posto di gx e gy.
  2. Disegna la gemma usando [gem.midtop, gem.midright, gem.midbottom, gem.midleft] e verifica i clic con gem.collidepoint(event.pos).
  3. Dopo la gemma, quando il puntatore è sopra di essa, disegna il contorno giallo (255, 196, 0) di gem.inflate(10, 10), largo 2 pixel.

Provalo tu

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

Tutte le lezioni di Il game loop

Esercitati da solo: Playground Pygame