high_impact: Port engine game JavaScript sang C
Tóm tắt
- high_impact là một engine game nhỏ cho game hành động 2D, được viết bằng C và có thể biên dịch cho Windows, Mac, Linux và WASM cho web
- Lấy cảm hứng từ engine game JavaScript Impact năm 2010 và được phát hành theo giấy phép MIT
- Mã nguồn: GitHub
Lịch sử xa xưa
- Vào tháng 4 năm 2010, Steve Jobs đã công bố qua bức thư ngỏ "Thoughts on Flash" rằng iOS sẽ không hỗ trợ Flash
- Flash từng là một plugin trình duyệt rất quan trọng trên web, và nhiều website phụ thuộc vào game và hoạt hình Flash
- Android có hỗ trợ Flash nhưng hiệu năng không tốt, và quyết định của Apple là dấu hiệu báo trước sự kết thúc của Flash
- Biolab Disaster được phát triển để chứng minh rằng vẫn có thể làm game web không cần Flash bằng JavaScript Canvas2D API
Tại sao lại là C?
- C là một ngôn ngữ vừa đơn giản vừa có chiều sâu, rất phù hợp để phát triển game
- Sau khi port bộ giải mã MPEG1 JavaScript sang C, triển khai VR, phát triển các định dạng ảnh và âm thanh, tác giả đã tìm lại được niềm yêu thích với C
- Việc viết lại Impact bằng C sẽ là một bài tập thú vị
Khái niệm
- high_impact được xây dựng với lượng mã tối thiểu, đồng thời cung cấp khả năng nạp tile map, tạo object game, cập nhật và vẽ
- Nó xử lý vật lý và phát hiện va chạm, đồng thời bao gồm hoạt ảnh sprite sheet đơn giản, vẽ văn bản, hiệu ứng âm thanh và phát nhạc
- high_impact là một framework chứ không phải thư viện, nên người dùng cần tự viết business logic
- Có thể biên dịch bằng backend nền tảng SDL hoặc Sokol
Entity
- Mọi entity đều chia sẻ cùng một cấu trúc
entity_t, với các thuộc tính như vị trí, vận tốc, kích thước, v.v.
- Có thể mở rộng cấu trúc entity cơ bản thông qua macro
- Mỗi loại entity phải cung cấp một
entity_vtab_t chứa các con trỏ hàm
- Có thể xử lý tối đa 64k entity đang hoạt động
Phát hiện và xử lý va chạm
- Tính toán va chạm với tile map để tìm đúng điểm va chạm
- Va chạm giữa các entity được xử lý riêng, và mỗi entity tự định nghĩa cách nó va chạm với entity khác
Kết xuất
- Cung cấp OpenGL và trình kết xuất phần mềm
- Toàn bộ việc kết xuất được thực hiện thông qua một lời gọi hàm duy nhất, và dùng texture atlas để gộp texture
Âm thanh
- Sử dụng SDL2 hoặc Sokol để xử lý đầu ra âm thanh
- Có thể nạp một số lượng source cố định và phát một số lượng âm thanh cố định
- Âm thanh được tự động loại bỏ để có thể tái sử dụng
Quản lý bộ nhớ
- Quản lý bộ nhớ bằng một mảng byte duy nhất gọi là "hunk"
- Dùng bump allocator và temp allocator để cấp phát bộ nhớ
- Việc giải phóng bộ nhớ được xử lý tự động nên người dùng không cần bận tâm đến quản lý bộ nhớ
Trình biên tập màn chơi
- Bao gồm "Weltmeister", trình biên tập màn chơi gốc của Impact
- Được viết bằng JavaScript và được cập nhật để dùng các tính năng trình duyệt hiện đại
- Dùng File System API để tải và lưu tệp
Game demo
- Hai game Biolab Disaster và Drop đã được port sang C để kiểm chứng tính năng của high_impact
Khả năng mở rộng
- high_impact là một engine game truyền thống, và mã dành riêng cho từng game sẽ được viết thêm
- Nền tảng và renderer có thể được mở rộng để hỗ trợ các hệ thống khác
Tóm tắt của GN⁺
- high_impact là một engine game 2D viết bằng C, cung cấp các tính năng mạnh mẽ nhưng vẫn đơn giản
- Là hậu duệ của engine game JavaScript Impact, có thể chạy trên nhiều nền tảng khác nhau
- Triển khai gọn nhẹ các chức năng cốt lõi cần cho phát triển game như quản lý bộ nhớ và phát hiện va chạm
- Cung cấp các trường hợp sử dụng thực tế thông qua trình biên tập màn chơi và game demo
- Phù hợp với các dự án nhẹ và đơn giản hơn so với những engine lớn như Unity hay Unreal
1 bình luận
Ý kiến Hacker News
Nhiều game web được xây dựng bằng engine game Impact, và nó đã trở thành nền tảng cho các tựa game thương mại đa nền tảng như Cross Code, Eliot Quest, và XType Plus
"Thoughts on Flash" có thể đã cứu nền tảng web
Trò chơi trông rất gọn gàng
high_impact không phải là một "thư viện" mà là một "framework"
Thật vui khi sau một thời gian dài lại đăng nhập vào tài khoản HN và tìm lại được Biolab Disaster
Việc dùng UNION để tạo cấu trúc dữ liệu entity đa hình thật ấn tượng
Kết hợp định dạng tệp QOI lossless với 7Zip cho hiệu năng tốt hơn PNG lossless
Có thể là để tôn trọng thời lượng pin của người chơi
Ý tưởng thú vị, mã nguồn mở để tối đa hóa giá trị học hỏi, triển khai hoàn hảo, và lối viết rõ ràng không phô trương — một đóng góp tuyệt vời
Với tư cách là một trong 3000 người sở hữu giấy phép, tôi rất vui khi thấy Impact hồi sinh
Trông như một game engine tuyệt vời