Ejoy2D Mở Mã Nguồn - nói dối e blog

Ejoy2D Mở Mã Nguồn

Dự án Ejoy2D nguồn mở đã sẵn sàng cho cộng đồng phát triển

Sản phẩm game di động đầu tiên của đội ngũ chúng tôi đã tiến gần tới giai đoạn hoàn thiện, kế hoạch ra mắt dự kiến vào đầu tháng 1 năm tới. Hiện tại kết quả thử nghiệm nội bộ rất khả quan, điều này cho phép chúng tôi bắt đầu lên kế hoạch cho dự án game di động tiếp theo.

Dự án trước đó được thực hiện khá gấp gáp khi chỉ khởi động từ tháng 4 năm nay. Khi quyết định phát triển game 2D, tôi nhận thấy bản thân có hơn 15 năm kinh nghiệm chuyên sâu với các engine 2D. Thay vì sử dụng các engine phổ biến như Cocos2d-X, tôi lựa chọn xây dựng engine riêng để có thể kiểm soát toàn diện, tùy biến linh hoạt theo yêu cầu đặc thù và tối ưu hóa hiệu suất chuyên sâu. Thiết bị di động có giới hạn rõ rệt về phần cứng so với PC, vì vậy chúng tôi không chỉ chú trọng hiệu năng phần mềm mà còn đặc biệt quan tâm đến việc giảm tiêu thụ điện năng nhằm kéo dài tuổi thọ pin và hạn chế hiện tượng thiết bị phát nóng. Việc tối ưu hóa engine chính là một trong những niềm vui lớn nhất của các lập trình viên game.

Tuy nhiên dự án lần này vẫn còn tồn tại nhiều điểm hạn chế khi chúng tôi chỉ dành vỏn vẹn 1 tháng để xây dựng hệ thống engine, sau đó liên tục phải sửa đổi ứng phó trong quá trình phát triển game kéo dài đến tháng 10. Khi hoàn thành, hệ thống code đã trở nên phức tạp và khó bảo trì. Tôi không muốn để lại những “di sản” này cho dự án mới, do đó quyết định tái cấu trúc toàn bộ phần code cốt lõi.

Việc công bố mã nguồn luôn nằm trong kế hoạch ban đầu, không chỉ giúp ích cho cộng đồng mà còn thúc đẩy bản thân viết code chuyên nghiệp và sạch sẽ hơn. Trong tuần vừa qua tôi đã dành trọn 7 ngày tập trung viết lại từ đầu, kết quả là sự ra đời của dự án ejoy2d với hơn 4000 dòng code mới. Dù còn nhiều thiếu sót nhưng chúng tôi hy vọng nhận được sự quan tâm đóng góp từ cộng đồng. Các bạn có thể theo dõi dự án và gửi pull request trực tiếp trên nền tảng Github.

Giới thiệu tổng quan về ejoy2d: Đây là một engine đồ họa thuần túy tập trung hoàn toàn vào rendering 2D, không bao gồm các module phụ trợ như âm thanh hay mạng. Chính xác hơn, đây là một thư viện OpenGL ES được thiết kế để dễ dàng tích hợp vào engine game hiện có của bạn. Hiện tại phiên bản thử nghiệm mới chỉ hỗ trợ nền tảng Windows và Linux do chúng tôi vẫn đang nghiên cứu cách tổ chức hệ thống dự án cho iOS và Android một cách hợp lý nhất. Đối với các lập trình viên di động, việc nhúng thư viện này vào môi trường phát triển ứng dụng di động không phải là thách thức quá lớn.

Khác biệt so với các engine đồ sộ khác, ejoy2d không tích hợp sẵn hệ thống quản lý cảnh game. Chúng tôi cho rằng đây không phải thành phần bắt buộc đối với một engine đồ họa, và việc bắt buộc sử dụng module cố định sẽ hạn chế sự sáng tạo của các nhà phát triển thứ cấp. Ejoy2d tập trung cung cấp API rendering sprite, đồng thời cho phép truy cập mức độ thấp hơn thông qua sub-module ejoy2d.shader để kiểm soát đa giác.

Ngôn ngữ phát triển chính kết hợp C với Lua, toàn bộ API cấp cao đều được xây dựng dưới dạng hàm và đối tượng Lua. Các lập trình viên hoàn toàn có thể phát triển game chỉ với Lua nhờ hệ thống binding hiệu quả được tối ưu hóa ngay từ giai đoạn thiết kế. Sprite là kiểu dữ liệu trung tâm của engine, nhưng hầu hết việc xây dựng sprite được thực hiện thông qua file tài nguyên chứ không phải runtime.

Ví dụ trong file examples/asset/sample.lua thể hiện cấu trúc mô tả sprite:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
{
  type = "animation",
  export = "mine",
  id = 38,
  component = {
    {id = 34 },
    {id = 35 },
    {id = 33 },
    {id = 36 },
    {id = 37 },
    {id = 23, name = 'resource' },
  },
  {
    {  0,1,2,3,4,5 },
  },
}

Đoạn code trên định nghĩa một sprite hoạt ảnh với ID 38 (được đặt tên là “mine”), bao gồm 6 thành phần được đánh số từ 0-5. Thành phần cuối cùng với ID 23 được đặt tên “resource” cho phép thao tác riêng biệt trong thời gian chạy. Điều này cho phép nghệ sĩ thiết kế game tổ hợp các thành phần hoạt ảnh mà không cần sự can thiệp của lập trình.

Hệ thống rendering sprite hoạt động dựa trên nguyên tắc:

  • Thành phần không đặt tên sẽ tự động cập nhật theo frame hiện tại của sprite
  • Thành phần có tên cần được chỉ định frame riêng thông qua code

Quy trình đóng gói tài nguyên hiện tại sử dụng module simplepackage để kết hợp file mô tả và hình ảnh. Trong môi trường phát triển, hệ thống đọc các file theo cấu trúc thư mục tiêu chuẩn. Với mục đích phát hành sản phẩm, chúng tôi khuyến khích sử dụng công cụ chuyển đổi Lua->Binary thông qua API ejoy2d.spritepack.pack/import. Điều này giúp tăng tốc độ tải tài nguyên lên gấp nhiều lần đồng thời cho phép tích hợp các tính năng như nén hoặc mã hóa dữ liệu.

Hiện tại engine chỉ hỗ trợ định dạng PPM/PGM cho hình ảnh RGB/Alpha do tính đơn giản khi xử lý (chỉ cần dưới 200 dòng code). Thay vì tích hợp các thư viện nặng nề như libpng, chúng tôi khuyến khích các nhà phát triển tự mở rộng định dạng theo nhu cầu, ví dụ như thêm hỗ trợ PVR texture compression.

Yêu cầu hệ thống và cách sử dụng:

  • Lua 5.2 trở lên
0%