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.centerChỉ 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.
Thử thách
DễGiấu từng viên ngọc dưới cái thùng.
- Ngay sau khi tạo
crate, đặtcrate.center = gem.center. - Trong nhánh ngọc, sau
gem.ymới, đặt lạicrate.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
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