Công Cụ Phát Triển Prototype Dạng Roguelike
Tôi cực kỳ say mê thể loại game Roguelike nguyên bản - nói theo nghĩa đen là những trò chơi mang đúng tinh thần của tựa game Rogue huyền thoại. Trong thế giới game kiểu này, yếu tố hình ảnh lại là phần ít quan trọng nhất. Chỉ cần hệ thống ký tự có thể truyền đạt rõ ràng các tương tác cần thiết là đủ thỏa mãn rồi.
Tôi luôn có một sự yêu thích đặc biệt với những giao diện được xây dựng từ các ký tự ASCII. Hồi nhỏ, những trò chơi tự chế đầu tiên của tôi đều bắt đầu từ chế độ text mode. Đến tận hôm nay, khi muốn kiểm chứng nhanh một ý tưởng game mới, giao diện text mode mang phong cách Roguelike vẫn là lựa chọn tiết kiệm thời gian nhất. Bạn không phải đau đầu tìm kiếm asset đồ họa, không cần bận tâm về quy trình tích hợp hình ảnh với code phức tạp. Chỉ cần vài dòng ASCII art đơn giản cũng có thể trở thành điểm nhấn thú vị trong quá trình lập trình.
Vài tuần trước, khi thử nghiệm một module mới cho dự án đang làm, tôi đã thử xây dựng một thư viện Lua nhỏ để hỗ trợ tạo giao diện text mode. Gần đây gặp phải yêu cầu phức tạp hơn, tôi quyết định đầu tư nghiêm túc hơn để xây dựng một thư viện hòan chỉnh dựa trên SDL2. Kết quả là chỉ trong hai ngày cuối tuần, tôi đã hoàn thành dự án này:
Thành phần cốt lõi của thư viện là một hệ thống sprite hoạt động ở chế độ text. Nó hỗ trợ sử dụng tập ký tự CP437 từng làm mưa làm gió trên IBM Dos, kết hợp với tập hợp các ký tự chữ Hán giản thể trong Unicode. Toàn bộ giao diện đều sử dụng chuẩn UTF-8 hiện đại. Hệ thống cho phép quản lý đến 256 lớp sprite đồng thời, và đặc biệt là sử dụng mô hình màu RGB thay vì bảng màu 16 màu hạn chế truyền thống.
Điểm thú vị là cách tôi xử lý vấn đề hiển thị chữ Hán. Mỗi ô trong bộ đệm văn bản ảo bên trong sẽ lưu trữ đầy đủ mã Unicode, đồng thời ghi nhận thêm thông tin ký tự đó là nửa trái hay nửa phải của chữ Hán. Nhờ đó triệt tiêu hoàn toàn hiện tượng “nửa con chữ” gây lỗi hiển thị phổ biến trong các hệ thống text mode cổ.
Về mô hình rendering, tôi chọn phương pháp retained mode - tức là khi đã tạo sprite thì nó sẽ tự động được vẽ liên tục ở mọi khung hình, không cần phải gọi lệnh draw lặp lại. Điều này khác biệt hoàn toàn so với đa số thư viện tương tự vốn chuộc ngẫu (immediate mode). Tôi từng cân nhắc kết hợp cả hai mô hình, dành retained mode cho map và immediate mode cho nhân vật, nhưng cuối cùng quyết định giữ sự đơn giản cho API.
Trong quá trình tạo ra “đồ chơi” này, tôi không khỏi nhớ lại những ngày tháng cấp ba mày mò làm game trên chiếc Apple ][ cũ kỹ. Chính từ giai đoạn đó, tôi bắt đầu hiểu ra nhiều nguyên lý quý báu: cách tách xuất các thành phần chung thành module tái sử dụng, việc xây dựng game như một máy trạng thái được thiết kế cẩn thận, quan niệm tách biệt dữ liệu và chương trình, tầm quan trọng của việc thiết kế cấu trúc dữ liệu trong lập trình, và cả nhu cầu phát triển các công cụ chuyên dụng để tổ chức dữ liệu…
Đây thực sự là một trải nghiệm phát triển phần mềm đầy chất hoài niệm và thú vị.