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.
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 đó.
- Thay
gx, gy = 225, 165bằnggem = pygame.Rect(225, 165, 30, 30), rồi viếtgem.xvàgem.yở những chỗ bạn đã dùnggxvàgy. - Kiểm tra thao tác nhấp bằng
gem.collidepoint(event.pos). - 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)quanhgem.inflate(10, 10), rộng2pixel.
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
1Di chuyển hình vuông
Mở cửa sổTô nền4Di chuyển theo thời gian
Thời gian deltaPixel mỗi giâyVector2Gia tốc và ma sátDi chuyển vòng quanh màn hìnhTự luyện tập: Playground Pygame