Menu
CoddyTech

Viên ngọc dưới thùng hàng

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

Giờ đây, thùng trở thành trò chơi. Mỗi viên ngọc xuất hiện bên dưới thùng: kéo thùng ra rồi nhấp vào viên ngọc, thùng sẽ di chuyển đến viên tiếp theo.

Rect có một center, tức điểm ở giữa. Gán tâm của Rect này cho Rect khác, nó sẽ nằm ngay chồng lên Rect đó, bất kể kích thước của chúng:

gem = pygame.Rect(300, 120, 30, 30)
crate = pygame.Rect(0, 0, 60, 60)
crate.center = gem.center

Chỉ có crate di chuyển, đến (285, 105, 60, 60). Hãy làm việc này một lần trước vòng lặp cho viên ngọc đầu tiên, rồi lặp lại mỗi khi viên ngọc có vị trí mới.

challenge icon

Thử thách

Dễ

Giấu từng viên ngọc dưới cái thùng.

  1. Ngay sau khi tạo crate, đặt crate.center = gem.center.
  2. Trong nhánh ngọc, sau gem.y mới, đặt lại crate.center = gem.center.

Nhấn Chơi, kéo cái thùng ra rồi nhấp vào viên ngọc: cái thùng nhảy lên viên tiếp theo. 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
            elif 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))
    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)
    pygame.draw.rect(screen, (150, 100, 50), crate)
    pygame.draw.rect(screen, (110, 70, 35), crate, 3)
    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