6个版本
0.2.1 | 2024年7月11日 |
---|---|
0.2.0 | 2024年7月5日 |
0.1.2 | 2024年6月6日 |
0.1.1 | 2024年5月27日 |
0.0.1 | 2024年4月25日 |
#201 in 游戏开发
每月76次下载
240KB
3.5K SLoC
🐭 鼠标
网站
AGPL许可的、针对2D像素艺术游戏的具有观点的游戏引擎。
特点
- 具有内置rotsprite旋转着色器的像素完美的像素艺术渲染。
- 具有独立更新和渲染游戏循环的窗口创建。
- 可热重载的资源,在保存资源时,您可以在游戏中实时看到资源的更新,这极大地提高了快速迭代想法的生产力。
- 单二进制文件,所有非纹理资源将直接嵌入,纹理将在部署时切割到单个图集映射中并嵌入到二进制文件中。
- 简单的位图字体绘制。
- OGG音频播放。
- 一流的游戏手柄支持。
目标
- 具有专注于快速创建小型游戏(尤其是游戏马拉松)的API。
- 合理的性能,同时绘制成千上万的动画精灵不应该成问题。
- 适当的Web支持,应该非常容易打包为WASM用于Web。
非目标
- ECS(实体组件系统),尽管ECS架构对于缓存局部性和因此性能来说很棒,但我认为它对于大多数小型游戏来说过于冗余。如果您想的话,您可以在该引擎之上添加自己的ECS,这毫无问题!
- 3D,这个引擎仅用于2D像素艺术。
- 矢量图形,类似于上述,这个引擎专注于特定的低分辨率像素艺术。
- 为所有事情重新发明轮子,当有合适的crate且支持良好时,我更喜欢使用它而不是创建额外的维护负担。
- 支持所有可能的文件格式,这会使引擎变得臃肿。
用法
使用此crate相当简单,有一个名为Game
的单一特质,该特质有两个必需函数,Game::update
和Game::render
,需要实现游戏状态对象。
use chuot::{Config, Context, Game};
struct MyGame;
impl Game for MyGame {
fn update(&mut self, ctx: Context) {
// ..
}
fn render(&mut self, ctx: Context) {
// ..
}
}
// In main
let game = MyGame;
game.run(chuot::load_assets!(), Config::default());
特点
embed-assets
在构建时将所有资源嵌入到二进制文件中。
必须 在构建网页时启用。如果禁用,所有资源将从磁盘加载。
这将把所有 PNG 资源切割成一个单个小型的优化 PNG 图集。在启动时,这个切割的图集将高效地上传到 GPU,作为一个更大的图集,用于所有静态精灵。
read-texture
(默认)
如果禁用,将暴露图像的读取操作,如果禁用,精灵将被上传到 GPU,其数据将从内存中删除。
安装需求
在 Linux 上,您需要安装 asound2-dev
以支持音频,以及 udev-dev
以支持游戏手柄。
sudo apt install libasound2-dev libudev-dev
示例
这个示例将显示一个窗口,其中包含一个计数器,当按下左鼠标按钮时增加^左鼠标。计数器以文本形式渲染^文本,从左上角的字体加载。当按下 'Escape' 键^escape 键时,游戏将退出,窗口将关闭。
use chuot::{
Game, Context, Config,
context::{MouseButton, KeyCode},
};
/// Object holding all game state.
struct MyGame {
/// A simple counter we increment by clicking on the screen.
counter: u32,
}
impl Game for MyGame {
fn update(&mut self, ctx: Context) {
// ^1
// Increment the counter when we press the left mouse button
if ctx.mouse_pressed(MouseButton::Left) {
self.counter += 1;
}
// ^3
// Exit the game if 'Escape' is pressed
if ctx.key_pressed(KeyCode::Escape) {
ctx.exit();
}
}
fn render(&mut self, ctx: Context) {
// ^2
// Display the counter with a font called 'font' automatically loaded from the `assets/` directory
// It will be shown in the top-left corner
ctx.text("font", &format!("Counter: {}", self.counter)).draw();
}
}
// In main
// Initialize the game state
let game = MyGame { counter: 0 };
// Run the game until exit is requested
game.run(chuot::load_assets!(), Config::default().with_title("My Game"));
旋转算法
在库中,您可以选择多个放大实现,用于单遍 RotSprite 算法,有关更多信息,请参阅 Rust 文档。
最近邻
这不会应用任何额外的旋转效果。
cleanEdge
Scale3x(默认)
Diag2x
Scale2x
鸣谢
依赖关系
~18–56MB
~1M SLoC