3个不稳定版本

0.2.1 2021年7月19日
0.2.0 2021年7月19日
0.0.0 2021年6月21日

#2003 in 游戏开发

32 每月下载量
用于 bevy_retrograde

自定义许可

105KB
2K SLoC

Bevy Retrograde

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

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

bounty bros game screenshot

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

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

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

我们希望提供一个包含几乎所有您需要用Bevy制作2D像素游戏的插件的电池组,包括碰撞、声音、保存数据等。在添加这些功能的同时,我们将尝试保持完全的Web兼容性,但无法保证所有功能都可以在Web上实现。

这些额外功能将以可选的Cargo功能的形式包含在内,如果不需要,则可以禁用,并且适用时,可以打包为单独的Rust crates,即使在您不希望使用Bevy Retrograde的其余部分时也可以使用。

许可

Bevy Retrograde LDtk采用Katharos许可,对您可以使用它进行什么有某些限制。请在使用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 crate 时,您必须确保在您的 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()
    });
}

依赖关系

~57MB
~827K SLoC