Menu
CoddyTech

Tô sáng khi di chuột

Thuộc phần Vòng lặp trò chơi trong hành trình Pygame của Coddy. Bài học 16 trên 35.

Kiểm tra gx <= x <= gx + 30 mỗi lần sẽ mất nhiều công. Pygame có một lớp dành cho hình chữ nhật, pygame.Rect, giúp gộp vị trí và kích thước, đồng thời tự thực hiện các phép kiểm tra này:

gem = pygame.Rect(100, 40, 30, 30)

if gem.collidepoint(event.pos):
    print("Got it!")

gem.collidepoint(point) trả về True khi điểm nằm bên trong Rect. Bạn vẫn có thể đọc và thay đổi gem.x và gem.y. Rect còn có các điểm riêng: midtop, midright, midbottom và midleft là trung điểm của các cạnh. Với viên ngọc, các điểm này nằm ở bốn góc.

Phép kiểm tra tương tự với vị trí con trỏ cho bạn biết người chơi có đang trỏ vào viên ngọc hay không. Trò chơi thể hiện điều đó bằng cách tô sáng:

if gem.collidepoint(pygame.mouse.get_pos()):
    pygame.draw.rect(screen, (255, 255, 255), gem.inflate(6, 6), 1)

gem.inflate(6, 6) tạo một Rect mới rộng và cao hơn 6 pixel, với cùng tâm, nên đường viền này nằm cách viên ngọc 3 pixel về phía ngoài.

challenge icon

Thử thách

Dễ

Gán cho viên ngọc một Rect và vẽ viền quanh nó khi con trỏ ở trên đó.

  1. Thay gx, gy = 225, 165 bằng gem = pygame.Rect(225, 165, 30, 30), rồi viết gem.x và gem.y ở những chỗ bạn đã dùng gx và gy.
  2. Kiểm tra thao tác nhấp bằng gem.collidepoint(event.pos).
  3. Sau khi vẽ viên ngọc, khi gem.collidepoint(pygame.mouse.get_pos()) là đúng, hãy vẽ viền màu vàng (255, 196, 0) quanh gem.inflate(10, 10), rộng 2 pixel.

Nhấn Chơi rồi trỏ vào viên ngọc: viền màu vàng sẽ hiện ra. Sau đó nhấn Kiểm tra.

Tự làm thử

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

Tất cả bài học trong Vòng lặp trò chơi

Tự luyện tập: Playground Pygame