Core, công nghệ mới mang tính thử nghiệm để tạo video game
(github.com/damn)-
coreCore là gì
- coreCore là một phương pháp mang tính thử nghiệm để tạo video game dưới dạng công cụ và engine làm game Action-RPG, cùng với trình biên tập thuộc tính
- Sử dụng một hệ thống component đơn giản, trong đó component là vector clojure có dạng
[keyword value] - Nhiều entity khác nhau được cấu thành từ các map clojure
- Các side effect trong game được xử lý bằng component như
[:tx/foo param], có cấu trúc tương tự datomic - Toàn bộ trạng thái game được lưu trong một atom duy nhất tên là
app/state, và các entity cũng tồn tại dưới dạng atom bên trong atom chính - Toàn bộ nội dung của ứng dụng được lưu trong
resources/properties.edn, được kiểm tra bằng malli-schemas và có thể chỉnh sửa qua GUI
-
Ảnh chụp màn hình
-
Cách bắt đầu phát triển
- Nhập lệnh sau:
lein dev
- Ứng dụng sẽ khởi chạy và đồng thời thực hiện các tác vụ sau:
- Khởi động máy chủ NREPL
- Khi thoát ứng dụng (ESC ở menu chính),
clojure.tools.namespacesẽ làm mới các tệp đã thay đổi và khởi động lại ứng dụng - Nếu xảy ra lỗi, không cần khởi động lại JVM; chỉ cần sửa lỗi và gọi
dev-loop/restart! - Có thể dùng bằng cách gán lệnh sau vào phím F5 trong VIM:
nmap <F5> :Eval (do (in-ns 'dev-loop)(restart!))
- Nhập lệnh sau:
-
Giấy phép mã nguồn
- Được cung cấp theo giấy phép MIT
-
Giấy phép tài sản
- Các tài sản được sử dụng là độc quyền và không phải mã nguồn mở
- Tileset: https://winlu.itch.io/
- Sinh vật, vật phẩm, biểu tượng kỹ năng, FX và các tài sản khác: https://www.oryxdesignlab.com
- Con trỏ: Leonid Deburger https://deburger.itch.io/
- Các tài sản được sử dụng là độc quyền và không phải mã nguồn mở
Tóm tắt của GN⁺
- coreCore là công cụ giúp tạo game Action-RPG dễ dàng hơn bằng cách dùng hệ thống component đơn giản để quản lý trạng thái game
- Toàn bộ trạng thái game được lưu trong một atom duy nhất và có thể chỉnh sửa thuộc tính qua GUI, rất hữu ích cho nhà phát triển
- Được phát hành theo giấy phép MIT, nhưng các tài sản đi kèm là độc quyền
- Những công cụ có chức năng tương tự gồm có RPG Maker, Unity, v.v.
1 bình luận
Ý kiến trên Hacker News
Hay đấy. Tôi chưa từng phát hành game nào, nhưng luôn thích xem những cách tiếp cận khác nhau trong phát triển game
Cho đến nay, Bevy ban đầu thì có vẻ tốt nhưng có nhiều vấn đề trong triển khai và có thể trở nên lộn xộn; còn Unity thì cách dùng gameobject và component dạng kết hợp là thực dụng nhất, engine không cản trở và dễ tránh spaghetti
Tôi không thích Godot. Hệ phân cấp hướng đối tượng tệ, ngôn ngữ tích hợp không hay, và “signals” vốn nhằm giảm spaghetti lại làm nó tăng thêm. Pygame khá tốt cho các dự án nhỏ, và bạn có thể tự đặt các lớp hướng đối tượng hoặc hàm lên trên nền tảng thủ tục
Tôi không biết Clojure, nhưng việc thử triển khai theo hướng hàm trong một lĩnh vực thường có vẻ rất hợp với hướng đối tượng là điều thú vị
Signals của Godot là một bước tiến lớn so với sự thiếu mô-đun của các lớp tích hợp trong Unity. Godot và Unity về cơ bản có cùng mô hình scene/node/component, nhưng tôi cho rằng Godot làm tốt hơn
Điểm mạnh của Unity là renderer 3D, PhysX tích hợp, backend il2cpp cho C#, profiler, hiệu năng chạy tổng thể và hỗ trợ console. Ngược lại, thiết kế của Godot gắn kết hơn; còn Unity từ khoảng năm 2018 có cảm giác bị tách ra theo 10 hướng khác nhau
Dạo này tôi làm C++ embedded nên không dùng hướng đối tượng nhiều, nhưng tôi học lập trình bằng C# nên khá quen với kế thừa
Những mảng Unity vượt trội là cấp “Triple I” và “Double A”, vì các tính năng 3D/hiệu năng, công cụ và add-on tốt hơn. Với dự án AAA thì cả hai đều không phải lựa chọn tối ưu
Với game 2D và 3D đơn giản, giờ tôi không thấy lý do gì để dùng Unity nữa; có lẽ Godot sẽ dần vượt lên và thị phần Unity sẽ đều đặn giảm
Điều khó chịu nhất là các node và những thứ trong editor không rõ là bug hay tính năng; nó cho cảm giác rất mạnh rằng ban đầu được làm cho các dự án “nhỏ”
Vì vậy tôi hầu như không dùng editor ngoài việc dựng scene và thiết lập sơ bộ hệ phân cấp. Công cụ thường dùng của tôi là Emacs+C# LSP, debug bằng VS Code, và chỉnh scene tree bằng Godot editor
Về cơ bản nó là Python được thêm ngữ nghĩa slot/emit và tích hợp với editor, nên lại khá ổn. Việc để nó nằm trong ngôn ngữ vẫn tốt hơn so với build system, metadata, và các cách tích hợp phức tạp bằng file cấu hình bên ngoài
Nói là có thể làm cho phát triển game đơn giản hơn, rồi lại ném ra hàng loạt thuật ngữ chuyên môn như Clojure vectors, datomics, atoms, transactions, malli schemas. Ai giải thích giúp được không?
Nó biểu diễn các yếu tố và thuộc tính của game bằng các cấu trúc dữ liệu đơn giản, lưu toàn bộ trạng thái game trong một container duy nhất (app/state) để dễ quản lý và cập nhật
Ngoài ra, nó cung cấp GUI để chỉnh sửa nội dung game được lưu trong một file duy nhất (resources/properties.edn), giúp người không lập trình cũng dễ tiếp cận hơn; đồng thời dùng schema Malli để kiểm chứng dữ liệu, nhằm giữ tính nhất quán của nội dung và giảm lỗi
Clojure vector về cơ bản gần giống list. Atom là một tham chiếu có thể thay đổi trỏ tới cấu trúc dữ liệu bất biến, có thể xem như một con trỏ với ngữ nghĩa cập nhật cụ thể
Transaction giống transaction cơ sở dữ liệu: thay đổi nhiều cấu trúc dữ liệu cùng lúc, nhưng chỉ commit khi mọi thao tác thành công; nếu thất bại thì rollback hoặc thử lại
Malli schema là cách kiểm tra kiểu trong ngôn ngữ kiểu động, còn Datomic là một triển khai cơ sở dữ liệu phi SQL dựa trên cấu trúc dữ liệu bất biến, không ghi đè phá hủy thay đổi mà chỉ thêm vào, nhờ đó có thể tua lại bất kỳ thời điểm nào trong quá khứ
Tôi nghĩ cách tốt nhất để học mô hình này là xem bài nói “Are we there yet” của Rich Hickey, người tạo ra Clojure
[1 2 3]Tôi dùng nó để cấu thành các side effect như
[:tx/foo 3], và gọi chúng là transaction tương tự Datomic. Ở đây:tx/foolà keyword, định danh duy nhất hành vi của componentNói thật, tôi nghĩ dự án này thực tế đã thất bại. Nó là một mớ hỗn loạn bị thiết kế quá mức và không có cấu trúc rõ ràng
Vấn đề lớn nhất là hoàn toàn không có đặc tả. Có thể vì họ không tạo câu chuyện cho game, hoặc thậm chí nghĩ game không cần câu chuyện. Vì vậy họ chỉ thấy viết code bằng Clojure vui nên đã code điên cuồng
Việc thử làm điều gì đó thú vị là tốt, và đây là lĩnh vực nhiều người quan tâm
Với tư cách là một nhà phát triển game, GitHub này trông khá buồn cười. Nó gần như là một bản nhại của kiểu tự đắm chìm học thuật mà các nhà phát triển game ghét. Những ảnh chụp màn hình xấu xí còn là nét chấm phá hoàn hảo
Tôi có thể nghĩ ra vài game xuất phát từ kiểu tự đắm chìm học thuật kỳ quặc như vậy. Jonathan Blow ở bình luận anh em cũng thế, và ngay khi thấy dự án này tôi đã nghĩ đến Braid
Procedural generation trước đây cũng từng là chủ đề tháp ngà, và mọi tiến bộ trong đồ họa 3D ban đầu đều bắt đầu từ những bài báo hội nghị hoàn toàn phi thực tế. Nhiều thứ hiện là chủ lưu trong game từng là ý tưởng học thuật ngách
Nó thất bại ngay ở bước cơ bản là truyền đạt mình làm gì
Nếu vì chán mà rốt cuộc bạn chẳng làm gì cả, thì đây lại là có lợi. Nó giống với logic Jonathan Blow dùng Jai trong phát triển indie
Khá bất ngờ là kho này có ít tài liệu như vậy mà vẫn tạo ra nhiều thảo luận. Nhìn vào code thì nó giống một project hơn là game engine
property editor thì thú vị, nhưng bài này có vẻ được upvote vì tiêu đề hơn là vì nội dung
Hay đấy. Thấy một developer phát triển game bằng Clojure như tôi thì thật vui. Đôi khi đúng là tự làm khó mình hơn :)
Hiện tôi đang phát triển một game bắn súng TPS multiplayer 3D bằng Clojure. Nếu quan tâm thì demo ở đây: https://prototype-game.pages.dev
Tôi cũng sẽ sớm đăng bài blog về hành trình phát triển
Tôi thích Clojure, nhưng một ngôn ngữ hàm dùng cấu trúc dữ liệu bất biến chẳng phải là lựa chọn hơi lạ cho phát triển video game sao?
Đây là các bài viết tôi thích liên quan đến phát triển game theo phong cách hàm:
https://prog21.dadgum.com/228.html
https://prog21.dadgum.com/23.html
https://prog21.dadgum.com/24.html
https://prog21.dadgum.com/25.html
https://prog21.dadgum.com/26.html
Phần còn lại thì với Lisp gần như có thể làm bất cứ thứ gì. Nhờ cách Clojure xử lý cấu trúc dữ liệu bất biến và hệ thống protocol tuyệt vời (https://www.freshcodeit.com/blog/clojure-protocols-and-the-e...), tôi đã có thể dễ dàng chia toàn bộ game thành các component riêng biệt
Clojure có tiềm năng hiệu năng tốt hơn Ruby hay Python, và cả hai ngôn ngữ kia đều đã từng được dùng trong game indie thương mại thực tế
Các studio dĩ nhiên thường né rủi ro và chuộng các chiến lược quen thuộc như hướng đối tượng hoặc dùng ECS cho các cụm thực thể lớn
Cá nhân tôi nghĩ lập trình hàm có thể phù hợp, nhưng trước tiên cần tìm ra kiến trúc giải quyết được các vấn đề phát triển game thực tế. Nên bắt đầu bằng các thử nghiệm nhỏ, và game jam rất hợp cho việc này
Đã có một nền tảng tạo game thương mại tên là Core chạy trên Unreal Engine 4
https://en.wikipedia.org/wiki/Core_(video_game)
Có vẻ họ chọn tên không khéo. Tên này đã được dùng trong lĩnh vực này rồi: https://www.coregames.com/create
Sẽ rất thú vị nếu phân tích dữ liệu về “thời gian/độ phức tạp bỏ vào game engine” và “độ phức tạp/độ thú vị của game tạo ra”
Với tư cách là một nhà phát triển game, tôi dự đoán lợi nhuận từ các game mới sinh ra từ hệ thống template/engine đơn giản sẽ là một đường cong log suy giảm
Nói cách khác, càng làm máy dập bánh quy tốt hơn, sự đa dạng của bánh quy càng giảm