Lập Trình Game Với Pygame
Hành trình sáng tạo trò chơi từ những dòng mã đầu tiên
Nội dung bài học (12 Ví dụ)
- VD1: Khởi tạo cửa sổ Game
- VD2: Game Loop (Vòng lặp vô tận)
- VD3: Vẽ hình cơ bản (Rect, Circle)
- VD4: Di chuyển vật thể bằng phím
- VD5: Chèn hình ảnh (Sprite)
- VD6: Xử lý va chạm (Collision)
- VD7: Viết chữ lên màn hình
- VD8: Thêm âm thanh & Nhạc nền
- VD9: Hệ thống tính điểm (Score)
- VD10: Tạo chuyển động mượt (FPS)
- VD11: Tạo nhiều kẻ địch (List)
- VD12: Màn hình Game Over
Kiến trúc cốt lõi của một trò chơi
Khác với ứng dụng văn phòng, Game chạy liên tục ở tốc độ cao. Cấu trúc gồm: Nhập liệu (Input) -> Cập nhật (Update) -> Hiển thị (Draw).
Các ví dụ thực hành chi tiết
Ví dụ 1 & 2: Cửa sổ và Vòng lặp Game
import pygame
# 1. Khởi tạo
pygame.init()
screen = pygame.display.set_mode((800, 600))
running = True
# 2. Vòng lặp Game
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill((0, 0, 0)) # Xóa màn hình bằng màu đen
pygame.display.update()
pygame.quit()
pygame.init(): Đánh thức tất cả các module của Pygame.pygame.event.get(): Lấy danh sách tất cả các thao tác (chuột, phím).screen.fill(): Cực kỳ quan trọng để xóa các hình ảnh cũ trước khi vẽ hình mới.
Ví dụ 4: Di chuyển vật thể (Input Handling)
x, y = 100, 100
vel = 5 # Vận tốc
# Trong vòng lặp while:
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]: x -= vel
if keys[pygame.K_RIGHT]: x += vel
if keys[pygame.K_UP]: y -= vel
if keys[pygame.K_DOWN]: y += vel
pygame.draw.rect(screen, (255, 0, 0), (x, y, 50, 50))
Ví dụ 6: Xử lý va chạm (Collision Detection)
player_rect = pygame.Rect(x, y, 50, 50)
enemy_rect = pygame.Rect(400, 300, 50, 50)
if player_rect.colliderect(enemy_rect):
print("Va chạm rồi!")
colliderect là hàm có sẵn cực mạnh của Pygame giúp kiểm tra xem hai hình chữ nhật có đè lên nhau hay không. Đây là nền tảng của các game bắn súng hoặc ăn xu.
Ví dụ 10: Giới hạn khung hình (FPS)
clock = pygame.time.Clock()
while running:
clock.tick(60) # Chạy đúng 60 khung hình/giây
# ... logic game ...
clock.tick(60), game sẽ chạy nhanh hết mức có thể (tùy máy mạnh yếu), dẫn đến nhân vật di chuyển quá nhanh không thể kiểm soát.
Ví dụ 12: Màn hình Game Over (State Management)
game_active = True
while running:
if game_active:
# Chạy logic game
if lives <= 0: game_active = False
else:
# Hiển thị màn hình Game Over
screen.fill((200, 0, 0))
show_text("NHẤN R ĐỂ CHƠI LẠI", 300, 300)
📌 Danh sách bình luận