Săn tìm 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 20 trên 35.
Một lượt Gem Hunt kéo dài 30 giây. Hãy đếm thời gian bằng khung hình: với tốc độ 60 khung hình mỗi giây, 10 giây tương ứng với 600 khung hình.
time_left = 600
while running:
# sự kiện
if time_left > 0:
time_left -= 1Khi time_left về 0, trò chơi ngừng nhận thao tác nhấp và kéo, đồng thời hàng điểm số hiển thị kết quả: thêm and time_left > 0 vào điều kiện kiểm tra sự kiện.
Một thanh ở phía trên hiển thị thời gian còn lại. Độ rộng của thanh biểu thị phần thời gian còn lại của lượt chơi: với thanh rộng tối đa 200 pixel trong một lượt chơi kéo dài 600 khung hình, 200 * time_left // 600 có giá trị 200 lúc bắt đầu, 100 khi đi được nửa lượt và 0 khi kết thúc.
Thử thách
Trung bìnhCho mỗi lượt 30 giây.
- Trước vòng lặp, đặt
time_left = 1800. Sau các sự kiện, giảm giá trị này đi 1 khi nó lớn hơn 0. - Thêm
and time_left > 0vào các điều kiện kiểm traMOUSEBUTTONDOWNvàMOUSEMOTION. - Sau hàng điểm, vẽ một hình chữ nhật màu xanh lá
(120, 200, 120)tại(0, 0, 480 * time_left // 1800, 6).
Nhấn Chơi: thanh màu xanh lá sẽ thu nhỏ lại, và sau 30 giây, các lần nhấp sẽ không có tác dụ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)
crate.center = gem.center
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)
crate.center = gem.center
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()
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
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