#gamedev #assets #pixel-art #utility #context #ctx #texture

chuot

AGPL许可的、针对像素艺术游戏的具有观点的游戏引擎

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 游戏开发

Download history 95/week @ 2024-04-20 40/week @ 2024-04-27 25/week @ 2024-05-04 2/week @ 2024-05-11 101/week @ 2024-05-18 217/week @ 2024-05-25 169/week @ 2024-06-01 24/week @ 2024-06-08 2/week @ 2024-06-15 55/week @ 2024-06-29 163/week @ 2024-07-06 22/week @ 2024-07-13 1/week @ 2024-07-20 14/week @ 2024-07-27 2/week @ 2024-08-03

每月76次下载

AGPL-3.0

240KB
3.5K SLoC

Rust 3K SLoC // 0.1% comments WebGPU Shader Language 504 SLoC // 0.2% comments

🐭 鼠标

Build Status Crates.io Documentation License: AGPL-3.0 Dependency Status Downloads Matrix

网站

AGPL许可的、针对2D像素艺术游戏的具有观点的游戏引擎。

特点

  • 具有内置rotsprite旋转着色器的像素完美的像素艺术渲染。
  • 具有独立更新和渲染游戏循环的窗口创建。
  • 可热重载的资源,在保存资源时,您可以在游戏中实时看到资源的更新,这极大地提高了快速迭代想法的生产力。
  • 单二进制文件,所有非纹理资源将直接嵌入,纹理将在部署时切割到单个图集映射中并嵌入到二进制文件中。
  • 简单的位图字体绘制。
  • OGG音频播放。
  • 一流的游戏手柄支持。

目标

  • 具有专注于快速创建小型游戏(尤其是游戏马拉松)的API。
  • 合理的性能,同时绘制成千上万的动画精灵不应该成问题。
  • 适当的Web支持,应该非常容易打包为WASM用于Web。

非目标

  • ECS(实体组件系统),尽管ECS架构对于缓存局部性和因此性能来说很棒,但我认为它对于大多数小型游戏来说过于冗余。如果您想的话,您可以在该引擎之上添加自己的ECS,这毫无问题!
  • 3D,这个引擎仅用于2D像素艺术。
  • 矢量图形,类似于上述,这个引擎专注于特定的低分辨率像素艺术。
  • 为所有事情重新发明轮子,当有合适的crate且支持良好时,我更喜欢使用它而不是创建额外的维护负担。
  • 支持所有可能的文件格式,这会使引擎变得臃肿。

用法

使用此crate相当简单,有一个名为Game的单一特质,该特质有两个必需函数,Game::updateGame::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 文档。

最近邻

这不会应用任何额外的旋转效果。

Nearest Neighbor

cleanEdge

cleanEdge

Scale3x(默认)

Scale3x

Diag2x

Diag2x

Scale2x

Scale2x

鸣谢

  • Torcado 为出色的 cleanEdge 算法。
  • gtoknu 为分支无 scale2x 着色器。
  • @damiengdefault-font 功能背后的字体。
  • KenneyNL 为示例中的音频样本。

依赖关系

~18–56MB
~1M SLoC