25个版本 (8个破坏性更新)

0.9.0-alpha.62024年4月8日
0.9.0-alpha.42024年3月29日
0.8.1 2024年4月25日
0.4.3 2023年12月23日
0.4.1 2023年11月26日

#596游戏开发

Download history • Rust 包仓库 17/week @ 2024-04-15 • Rust 包仓库 135/week @ 2024-04-22 • Rust 包仓库 59/week @ 2024-04-29 • Rust 包仓库 5/week @ 2024-05-20 • Rust 包仓库 20/week @ 2024-05-27 • Rust 包仓库 135/week @ 2024-07-08 • Rust 包仓库

每月135次下载
用于 blit

AGPL-3.0

170KB
2.5K SLoC

pixel-game-lib

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

文档

适用于2D像素艺术游戏的AGPL许可和有观点的游戏引擎。

特性

  • 具有内置rotsprite旋转着色器的像素完美的像素艺术渲染。
  • 使用独立更新和渲染游戏循环创建窗口。
  • 热重载资源,保存资源时在游戏中实时看到资源更新,可以大大提高快速迭代想法的生产力。
  • 单二进制文件,部署时所有资源应嵌入到二进制文件中。
  • 简单的位图字体绘制。
  • 对话脚本系统。
  • 音频播放。
  • 游戏内CPU和内存分析器GUI。

目标

  • 注重快速创建小型游戏,特别是游戏即兴创作的API。
  • 合理的性能,同时绘制数千个动画精灵不应有问题。
  • 良好的Web支持,应该非常容易将其打包为WASM用于Web。

非目标

  • 一个ECS(实体组件系统),尽管ECS架构对缓存局部性和性能非常好,但我认为对于大多数小型游戏来说有点过度。不过,如果您愿意,您可以在该引擎之上添加自己的ECS!
  • 3D,此引擎仅适用于2D像素艺术。
  • 矢量图形,类似于上述内容,此引擎专注于特定于低分辨率的像素艺术。
  • 为一切重新发明轮子,当有合适的crate且有良好支持时,我更喜欢使用它而不是创建额外的维护负担。

使用

使用此crate非常简单,有一个名为PixelGame的单个trait,需要为游戏状态对象实现两个必需函数,即PixelGame::updatePixelGame::render

use pixel_game_lib::{PixelGame, Context, GameConfig};

struct MyGame;

impl PixelGame for MyGame {
  fn update(&mut self, ctx: Context) {
    // ..
  }

  fn render(&mut self, ctx: Context) {
    // ..
  }
}

// In main
let game = MyGame;

game.run(GameConfig::default())?;

功能标志

所有主要功能标志默认启用,我建议使用以下命令安装 pixel_game_lib 并添加所需功能: default-features = false

cargo add pixel_game_lib --no-default-features
hot-reloading-assets(默认)

当资产被保存时,从磁盘热重载资产。对Web目标没有影响。

embedded-assets(Web上默认启用)

assets/ 文件夹中的所有资产烘焙到二进制文件中。创建发布二进制文件时,应启用此功能标志。

dialogue(默认)

Yarn Spinner 的轻量级封装。允许创建可热重载的对话系统。

audio(默认)

Kira 的轻量级封装。播放声音和音乐文件,可以使用资产进行热重载。

为了保持二进制文件和编译时间较小,只支持 .ogg 音频文件。

需求

在Linux上,您需要安装 asound2-dev

sudo apt install libasound2-dev
in-game-profiler(默认)

使用 puffin_egui 实现的 profiler 窗口叠加。

您的游戏中的其他 profiling 方法也可以实现,即使禁用此功能标志,profiling crate 也已启用。

示例

此示例将显示一个窗口,该窗口有一个计数器,当按下左鼠标按钮时增加^left-mouse。计数器以文本形式渲染^text,从左上角的字体加载。当按下 'Escape' 键^escape-key 时,游戏将退出,窗口将关闭。

use pixel_game_lib::{PixelGame, Context, GameConfig, MouseButton, KeyCode, glamour::Vector2};

/// Object holding all game state.
struct MyGame {
  /// A simple counter we increment by clicking on the screen.
  counter: u32,
}

impl PixelGame 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(GameConfig::default().with_title("My Game"))?;

旋转算法

在库中,可以选择多个 upscale 实现用于单次遍历 RotSprite 算法,有关更多信息,请参阅 Rust 文档

最近邻

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

Nearest Neighbor

Scale3x

Scale3x

Diag2x

Diag2x

Scale2x

Scale2x

致谢

  • gtoknu 提供了 branchless scale2x 着色器。
  • @damiengdefault-font 功能背后的字体提供了支持。
  • KenneyNL 为示例中的音频样本提供了支持。

依赖关系

~11–54MB
~896K SLoC