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
main.py
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()
Giải thích:
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)
movement.py
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))
Giải thích: Tọa độ trong Game có gốc (0,0) ở góc trên bên trái. Muốn đi xuống phải cộng y, muốn đi lên phải trừ y.
Ví dụ 6: Xử lý va chạm (Collision Detection)
collision.py
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!")
Giải thích:
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)
fps_control.py
clock = pygame.time.Clock()
while running:
clock.tick(60) # Chạy đúng 60 khung hình/giây
# ... logic game ...
Giải thích: Nếu không có
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_state.py
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)
🎮 Thử thách cho học sinh: Hãy thử kết hợp Ví dụ 4 (Di chuyển) và Ví dụ 11 (Kẻ địch) để tạo ra một trò chơi né tránh chướng ngại vật đơn giản. Đây là bài tập thực hành tốt nhất để hiểu về logic Game!
📌 Danh sách bình luận