Thùng hàng che viên ngọc
Thuộc phần Vòng lặp trò chơi trong hành trình Pygame của Coddy. Bài học 18 trên 35.
Thùng được vẽ trước viên ngọc, nên viên ngọc hiện lên trên thùng. Nếu muốn thùng có thể che viên ngọc, hãy vẽ thùng sau viên ngọc: hình được vẽ sau cùng sẽ che những gì đã có sẵn.
Sau đó, thao tác nhấn lên thùng không được kích hoạt phép kiểm tra viên ngọc và bắt trúng viên ngọc mà người chơi không nhìn thấy. Cả hai phép kiểm tra if đều chạy. Với elif, phép kiểm tra thứ hai chỉ chạy khi phép kiểm tra thứ nhất sai, vì vậy chỉ một trong hai phép kiểm tra nhận thao tác nhấn:
if crate.collidepoint(event.pos):
dragging = True
elif gem.collidepoint(event.pos):
print("Got it!")Hãy kiểm tra trước hình được vẽ trên cùng. Khi nhấn lên thùng, thao tác sẽ không bao giờ đến viên ngọc phía sau nó.
Viền tối hơn khiến chiếc hộp trông chắc chắn. Vẽ lại cùng một Rect bằng màu tối hơn và đặt độ rộng, khi đó chỉ có đường viền được vẽ đè lên phần tô màu.
Thử thách
DễĐể thùng che viên ngọc, đồng thời ngăn thao tác nhấn vào thùng kích hoạt viên ngọc.
- Di chuyển lệnh vẽ đường viền thùng xuống sau đường viền viên ngọc, rồi vẽ lại
cratebên dưới bằng màu(110, 70, 35)với độ rộng3, làm đường viền thùng. - Trong nhánh
MOUSEBUTTONDOWN, đổiifcủa viên ngọc thànhelif, đặt bên dưới phần kiểm tra thùng.
Nhấn Chơi, kéo thùng lên viên ngọc rồi nhấp vào đó: viên ngọc vẫn bị che và không xuất hiện dấu màu hồng. 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()
gem = pygame.Rect(225, 165, 30, 30)
crate = pygame.Rect(40, 230, 60, 60)
dragging = False
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 crate.collidepoint(event.pos):
dragging = True
if gem.collidepoint(event.pos):
score += 1
gem.x = random.randint(15, 435)
gem.y = random.randint(55, 315)
elif event.type == pygame.MOUSEBUTTONUP:
dragging = False
elif event.type == pygame.MOUSEMOTION and dragging:
crate.move_ip(event.rel)
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (150, 100, 50), crate)
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()
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ình3Chuột
Theo con trỏNhấp vào viên ngọcTự luyện tập: Playground Pygame