Nhanh dần theo thời gian
Bài học 18 trên 41 trong khóa học Tạo trò chơi với Pygame của Coddy.
Trò chơi sẽ khó hơn khi tiếp diễn. Ở đây, các khối rơi nhanh hơn một chút sau mỗi 10 giây.
pygame.time.set_timer(event_type, ms) đưa một sự kiện thuộc loại đó vào mỗi ms mili giây. Tạo loại sự kiện riêng bằng pygame.USEREVENT, một số mà pygame để dành cho bạn:
SPEED_UP = pygame.USEREVENT + 1
pygame.time.set_timer(SPEED_UP, 10000)
fall_speed = 3
for event in pygame.event.get():
if event.type == SPEED_UP:
fall_speed += 1Sự kiện này xuất hiện trong vòng lặp sự kiện cùng với các sự kiện khác, cứ mỗi 10 giây một lần. Sau đó, khối rơi với block.y += fall_speed thay vì luôn rơi với tốc độ 3. Ván mới bắt đầu chậm lại, vì vậy khi chơi lại, bạn cũng đặt fall_speed = 3.
Thử thách
Trung bìnhLàm cho các khối rơi nhanh hơn sau mỗi 10 giây.
- Bên dưới phông chữ, tạo
SPEED_UP = pygame.USEREVENT + 1và bắt đầu bộ hẹn giờ cho sự kiện này mỗi10000ms. - Đặt
fall_speed = 3trước vòng lặp và dùng giá trị này để điều khiển tốc độ rơi. - Tăng
fall_speedthêm 1 sau mỗi sự kiện SPEED_UP, và đặt lại thành 3 khi nhấn R để bắt đầu trò chơi mới.
Nhấn Chơi và chờ 10 giây: các khối sẽ rơi nhanh hơn. 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("Catch the Blocks")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)
basket = pygame.Rect(200, 330, 80, 16)
block = pygame.Rect(220, 0, 20, 20)
score = 0
lives = 3
paused = False
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_p:
paused = not paused
elif event.key == pygame.K_r and (lives == 0 or score == 10):
score = 0
lives = 3
basket.x = 200
block.y = -20
block.x = random.randint(0, 460)
if lives > 0 and score < 10 and not paused:
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
basket.x -= 8
if keys[pygame.K_RIGHT]:
basket.x += 8
basket.clamp_ip(screen.get_rect())
block.y += 3
if block.top > 360:
block.y = -20
block.x = random.randint(0, 460)
lives -= 1
if block.colliderect(basket):
block.y = -20
block.x = random.randint(0, 460)
score += 1
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (80, 160, 255), basket)
pygame.draw.rect(screen, (235, 80, 80), block)
score_text = font.render(f"Score: {score}", True, (240, 240, 240))
screen.blit(score_text, (10, 10))
lives_text = font.render(f"Lives: {lives}", True, (240, 240, 240))
screen.blit(lives_text, (370, 10))
if lives == 0:
message = font.render("Game over", True, (240, 240, 240))
screen.blit(message, message.get_rect(center=(240, 160)))
elif score == 10:
message = font.render("You win!", True, (240, 240, 240))
screen.blit(message, message.get_rect(center=(240, 160)))
if lives == 0 or score == 10:
again = font.render("Press R to play again", True, (240, 240, 240))
screen.blit(again, again.get_rect(center=(240, 200)))
if paused:
message = font.render("Paused", True, (240, 240, 240))
screen.blit(message, message.get_rect(center=(240, 160)))
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 Tạo trò chơi với Pygame
2Sự kiện và va chạm
Cái giỏKhối rơiTự luyện tập: Playground Pygame