#bevy #pixel-perfect #2d #2d-game #gamedev #bevy-plugin #bevy-retrograde

bevy_retrograde_ui

适用于Bevy的像素完美2D渲染器和插件集,无缝针对桌面和网页

3个版本 (破坏性更新)

0.2.0 2021年7月19日
0.1.0 2021年6月11日
0.0.0 2021年6月6日

#1818游戏开发

每月32次下载
bevy_retrograde 中使用

自定义许可协议

155KB
3K SLoC

Bevy Retrograde

Crates.io Docs.rs Build Status lines of code Katharos License

(《Bounty Bros.》游戏截图,该游戏使用Bevy Retrograde和Skip'n Go制作)

bounty bros game screenshot

Bevy Retrograde是一个针对Bevy的2D像素完美渲染器,可以使用OpenGL/WebGL针对网页和桌面。

Bevy Retrograde专注于提供一种简单而优雅的方式来编写2D像素完美游戏。与Bevy的默认设置相比,您无需处理3D场景即可创建2D游戏。精灵及其坐标基于复古分辨率的场景中的像素位置。

Bevy Retrograde替换了许多您通常使用的Bevy组件和包(如SpriteBundleCamera2DBundle等),并自带CameraImageSprite等组件和包。Bevy Retrograde试图在Bevy之上提供专注的2D体验,帮助消除一些陷阱,使您在只需要2D时更容易考虑游戏。

我们希望提供一款包含几乎所有您需要用Bevy制作2D像素游戏的插件,包括碰撞、声音、数据保存等。在添加这些功能的同时,我们将尝试保持完整的网页兼容性,但无法保证所有功能都适用于网页。

这些额外功能将作为可选的cargo功能包含在内,如果不需要,可以禁用,并且在适用的情况下,可能还会作为独立的Rust包打包,即使您不想使用Bevy Retrograde的其余部分也可以使用。

许可协议

Bevy Retrograde LDtk 是在 Katharos License 许可下授权的,该许可对您使用它的方式施加了某些限制。请在使用 Bevy Retrograde 之前阅读并理解这些条款。

开发状态

Bevy Retrograde 正处于开发初期阶段。API 不稳定,可能在任何时候发生重大变化。计划中的可能更改包括

  • 切换到使用 Bevy 内置的渲染器用于桌面/移动端,以及使用 bevy_webgl2 用于网页,而不是使用我们自己的基于 OpenGL 的渲染器。这将有可能使 Bevy Retrograde 与更大的 Bevy 生态系统更加兼容,而不是创建一个仅在 Bevy Retro 上工作的插件孤岛。我们可能将等待 Bevy 渲染器的第二次迭代 来尝试这一点。

请参阅下面的 支持的 Bevy 版本

特性 & 示例

查看我们的 示例 列表,了解如何使用每个 Bevy Retrograde 特性

  • 原生支持网页和桌面
  • 精灵和精灵表
  • 具有三种相机模式:固定宽度、固定高度和信封式的缩放像素完美渲染
  • 精灵默认情况下是像素完美对齐的,但可以设置为每个精灵不完美对齐
  • LDtk 地图加载和渲染
  • RAUI UI 库集成,用于构建游戏内用户界面和 HUD
  • HeronRapier 提供物理和碰撞检测,自动从精灵图像生成凸碰撞形状
  • BDF 字体的文本渲染
  • 自定义后处理着色器,包括内置的 CRT 着色器
  • 渲染钩子允许您降级到原始 Luminance 调用进行自定义渲染

支持的 Bevy 版本

Bevy Retrograde 目前适用于最新的 Bevy 发布版,并且 可能 也支持 Bevy master。Bevy Retrograde 将尝试遵循最新的 Bevy 发布版,但如果 Bevy master 中引入了我们需要的功能,我们可能需要一段时间使用 Bevy master,直到下一个 Bevy 发布版。

当依赖 bevy 包时,您必须确保在您的 Cargo.toml 中将 default-features 设置为 false,以确保 bevy 中的渲染类型与 bevy_retrograde 中的类型不冲突。

Cargo.toml:

bevy = { version = "0.5", default-features = false }
bevy_retrograde = "0.2.0"

示例

以下是一个使用 Bevy Retrograde 的快速示例

main.rs:

use bevy::prelude::*;
use bevy_retrograde::prelude::*;

fn main() {
    App::build()
        .add_plugins(RetroPlugins)
        .add_startup_system(setup.system())
        .run();
}

struct Player;

fn setup(
    mut commands: Commands,
    asset_server: Res<AssetServer>,
) {
    // Load our sprites
    let red_radish_image = asset_server.load("redRadish.png");
    let yellow_radish_image = asset_server.load("yellowRadish.png");
    let blue_radish_image = asset_server.load("blueRadish.png");

    // Spawn the camera
    commands.spawn().insert_bundle(CameraBundle {
        camera: Camera {
            // Set our camera to have a fixed height and an auto-resized width
            size: CameraSize::FixedHeight(100),
            background_color: Color::new(0.2, 0.2, 0.2, 1.0),
            ..Default::default()
        },
        ..Default::default()
    });

    // Spawn a red radish
    let red_radish = commands
        .spawn_bundle(SpriteBundle {
            image: red_radish_image,
            transform: Transform::from_xyz(0., 0., 0.),
            sprite: Sprite {
                flip_x: true,
                flip_y: false,
                ..Default::default()
            },
            ..Default::default()
        })
        // Add our player marker component so we can move it
        .insert(Player)
        .id();

    // Spawn a yellow radish
    let yellow_radish = commands
        .spawn_bundle(SpriteBundle {
            image: yellow_radish_image,
            transform: Transform::from_xyz(-20., 0., 0.),
            sprite: Sprite {
                // Flip the sprite upside down 🙃
                flip_y: true,
                // By setting a sprite to be non-pixel-perfect you can get smoother movement
                // for things like characters, like they did in Shovel Knight®.
                pixel_perfect: false,
                ..Default::default()
            },
            ..Default::default()
        })
        .id();

    // Make the yellow radish a child of the red radish
    commands.entity(red_radish).push_children(&[yellow_radish]);

    // Spawn a blue radish
    commands.spawn().insert_bundle(SpriteBundle {
        image: blue_radish_image,
        // Set the blue radish back a layer so that he shows up under the other two
        transform: Transform::from_xyz(-20., -20., -1.),
        sprite: Sprite {
            flip_x: true,
            flip_y: false,
            ..Default::default()
        },
        ..Default::default()
    });
}

依赖项

~50MB
~707K SLoC