3个版本 (破坏性更新)
0.2.0 | 2021年7月19日 |
---|---|
0.1.0 | 2021年6月11日 |
0.0.0 | 2021年6月6日 |
#1912 in 游戏开发
被 2 crates 使用
115KB
2K SLoC
Bevy Retrograde
Bevy Retrograde是一个用于Bevy的2D、像素级渲染器,可以使用OpenGL/WebGL针对网络和桌面进行开发。
Bevy Retrograde专注于提供一个简单且易于使用的接口来编写2D、像素级游戏。与开箱即用的Bevy设置相比,您无需处理3D场景即可创建2D游戏。精灵及其坐标基于复古分辨率的场景中的像素位置。
Bevy Retrograde替换了许多您通常会使用的开箱即用的Bevy组件和Bundles(如SpriteBundle
、Camera2DBundle
等),并提供了自己的Camera
、Image
、Sprite
等组件和Bundles。Bevy Retrograde试图在Bevy之上提供一个专注于2D的体验,帮助排除一些陷阱,并使您在只需2D时更容易思考游戏。
我们希望提供一个包含几乎所有您使用Bevy制作2D像素游戏的需要的功能的插件,包括碰撞、声音、保存数据等。在添加这些功能的同时,我们将努力保持完全的网络兼容性,但无法保证所有功能都适合在网络上实现。
这些额外功能将以可选的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
- 由 Heron 和 Rapier 提供的物理和碰撞检测,自动从精灵图像生成凸碰撞形状
- BDF 字体的文本渲染
- 后处理的自定义着色器,包括内置的 CRT 着色器
- 渲染钩子允许您降级到原始 Luminance 调用来进行自定义渲染
支持的 Bevy 版本
Bevy Retrograde 目前适用于最新的 Bevy 版本,并且可能也支持 Bevy master。Bevy Retrograde 将尝试跟踪最新的 Bevy 版本,但如果 Bevy master 中引入了我们需要的功能,我们可能需要在下一个 Bevy 发布之前暂时使用 Bevy master。
当依赖 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()
});
}
依赖项
~49MB
~683K SLoC