Menu
CoddyTech

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.

challenge icon

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.

  1. 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 crate bên dưới bằng màu (110, 70, 35) với độ rộng 3, làm đường viền thùng.
  2. Trong nhánh MOUSEBUTTONDOWN, đổi if của viên ngọc thành elif, đặ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

Tự luyện tập: Playground Pygame