Trái tim làm mạng
Thuộc phần Luật chơi trong hành trình Pygame của Coddy. Bài học 8 trên 30.
Giờ đây trò chơi có ba mạng, hiển thị là Lives: 3 ở phía dưới. Người chơi đọc một hàng trái tim nhanh hơn một con số. Bộ tài nguyên có heart.png và heart_empty.png, cả hai đều có kích thước 36 x 36.
Tải mỗi hình ảnh một lần, sau set_mode:
heart = pygame.image.load("assets/images/heart.png").convert_alpha()
heart_empty = pygame.image.load("assets/images/heart_empty.png").convert_alpha()Sau đó vẽ ba ô bằng vòng lặp for. Ô i đầy khi i nhỏ hơn số mạng còn lại:
for i in range(3):
if i < lives:
screen.blit(heart, (10 + i * 40, 10))
else:
screen.blit(heart_empty, (10 + i * 40, 10))Khi còn 2 mạng, ô 0 và 1 đầy, còn ô 2 trống. Trái tim trống giúp hàng có độ dài không đổi, để người chơi thấy trò chơi bắt đầu với bao nhiêu mạng, chứ không chỉ biết còn lại bao nhiêu.
Thử thách
Trung bìnhHiển thị mạng bằng hình trái tim thay vì văn bản.
- Tải
assets/images/heart.pngvàassets/images/heart_empty.pngmột lần, sauset_mode. - Trong
draw_game(), vẽ ba trái tim tại x 10, 50 và 90, y 10: trái tim đầy ứng với mỗi mạng còn lại, trái tim rỗng ứng với mỗi mạng đã mất. - Xóa dòng chữ
Lives:.
Nhấn Chơi và để nhân vật trúng đòn: trái tim cuối cùng sẽ chuyển thành rỗ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("Meteor Dodge")
clock = pygame.time.Clock()
font = pygame.font.Font("assets/fonts/pixel.ttf", 24)
big_font = pygame.font.Font("assets/fonts/pixel.ttf", 48)
WHITE = (240, 240, 240)
PLATE = (60, 60, 90)
def reset():
global player, rock, score, lives
player = pygame.Rect(220, 300, 40, 40)
rock = pygame.Rect(random.randint(0, 456), -24, 24, 24)
score = 0
lives = 3
def draw_menu():
screen.fill((30, 30, 46))
title = big_font.render("Meteor Dodge", True, WHITE)
title_rect = title.get_rect(center=(240, 140))
pygame.draw.rect(screen, PLATE, title_rect.inflate(24, 12))
screen.blit(title, title_rect)
hint = font.render("Press Enter to play", True, WHITE)
screen.blit(hint, hint.get_rect(center=(240, 200)))
def draw_game():
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (255, 196, 0), player)
pygame.draw.rect(screen, (235, 80, 80), rock)
score_text = font.render(f"Score: {score}", True, WHITE)
score_rect = score_text.get_rect(topright=(470, 10))
pygame.draw.rect(screen, PLATE, score_rect.inflate(12, 8))
screen.blit(score_text, score_rect)
lives_text = font.render(f"Lives: {lives}", True, WHITE)
screen.blit(lives_text, (10, 330))
def play_frame():
global score, lives, state
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
player.x -= 6
if keys[pygame.K_RIGHT]:
player.x += 6
player.clamp_ip(screen.get_rect())
rock.y += 4
if rock.top > 360:
rock.y = -24
rock.x = random.randint(0, 456)
score += 1
if rock.colliderect(player):
rock.y = -24
rock.x = random.randint(0, 456)
lives -= 1
if lives == 0:
state = "over"
draw_game()
def draw_over():
draw_game()
message = big_font.render("Game over", True, WHITE)
screen.blit(message, message.get_rect(center=(240, 160)))
hint = font.render("Press R to play again", True, WHITE)
screen.blit(hint, hint.get_rect(center=(240, 200)))
reset()
state = "menu"
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RETURN and state == "menu":
state = "play"
elif event.key == pygame.K_r and state == "over":
reset()
state = "play"
if state == "menu":
draw_menu()
elif state == "play":
play_frame()
else:
draw_over()
pygame.display.flip()
clock.tick(60)
pygame.quit()
Tất cả bài học trong Luật chơi
Tự luyện tập: Playground Pygame