11个版本
0.5.0 | 2024年2月20日 |
---|---|
0.4.1 | 2022年12月6日 |
0.4.0 | 2022年11月24日 |
0.3.1 | 2022年10月22日 |
0.1.2 | 2022年6月30日 |
#9 in #碰撞
每月166次下载
41KB
318 行
bevy_sepax2d
用于在Bevy中使用sepax2d进行2D重叠检测和碰撞解决的插件和实用方法。
兼容版本
bevy | bevy_sepax2d |
---|---|
0.12 | 0.5 |
0.9 | 0.4 |
0.8 | 0.2, 0.3 |
0.7 | 0.1 |
使用方法
将以下内容添加到你的Cargo.toml
文件中的[dependencies]
部分:
sepax2d = "0.3"
bevy_sepax2d = "0.5"
存在一个额外的debug
特性,可以用来将碰撞形状渲染到屏幕上。这依赖于Bevy的默认特性以及bevy_prototype_lyon进行渲染。这可以在你的Cargo.toml中启用。
bevy_sepax2d = { version = "0.5", features = ["debug"] }
版本0.4及更早版本的文档:请查看与0.5(Bevy 0.12)一起工作的示例代码。
要将形状添加到你的世界中,只需将Sepax
结构体插入任何实体中。
let polygon = Polygon::from_vertices((0.0, 0.0), vec![(0.0, -25.0), (15.0, 15.0), (-15.0, 15.0)]);
let convex = Convex::Polygon(polygon);
commands.spawn(Sepax { convex });
Sepax
有一个字段,convex
:这是一个Convex
枚举的实例,它包含sepax2d支持的每种形状的可能值:Polygon
、Circle
、AABB
、Parallelogram
和Capsule。每个变体都包含对应形状的实例。请查看sepax2d 文档以了解有关每个形状的信息。
可以通过shape
和shape_mut
方法方便地访问底层形状,这两个方法提供了对底层形状引用的简单访问,无需进行枚举匹配。
fn bullet_system
(
mut bullets: Query<(&Bullet, &Sepax)>,
targets: Query<&Sepax, Without<Bullet>>
)
{
for (_b, bullet) in bullets.iter()
{
for target in targets.iter()
{
if sat_overlap(wall.shape(), bullet.shape())
{
//Bullet hit target, now react appropriately
}
}
}
}
如果包含,SepaxPlugin
提供了以下基本功能,这些功能在Bevy的PostUpdate
阶段发生:
- 重置前一帧的碰撞信息
- 更新任何附加到
Transform
的Sepax
组件的位置 - 为标记为
Movable
的实体和不可移动的实体提供非弹性碰撞
这些系统是公开的,所以如果您不想包括所有系统,可以手动添加。这通常发生在您想要对哪些对象与哪些对象发生碰撞进行更精细的控制,但仍然想要重置碰撞数据并更新位置。或者,您可能想要碰撞并更新位置,但想要在处理之前保持旧的碰撞数据。
Movable
组件表示一个实体是动态的。相比之下,没有 Movable
组件表示一个静态对象,它被处理为一个“墙壁”,可移动实体应该与之发生碰撞。在 Movable
或非 Movable
实体上使用 NoCollision
标记组件来将其排除在碰撞过程之外。
Movable
结构体包含在 Update
阶段从上一帧的归一化碰撞解决向量的列表,以便您可以在代码中对其进行响应。这些向量表示远离发生碰撞的对象的方向。例如,以下代码在实体落在或击中平台底部时将实体速度的 y 分量设置为 0
fn velocity_correction_system(mut query: Query<(&mut Velocity, &Movable)>)
{
for (mut velocity, correction) in query.iter_mut()
{
for (_x, y) in correction.axes.iter()
{
if y.abs() > f32::EPSILON && velocity.y.is_sign_positive() != y.is_sign_positive()
{
velocity.y = 0.0;
}
}
}
}
调试渲染
如果您启用 debug
功能,则可以使用 bevy_prototype_lyon 来渲染您的形状。以下便捷方法有助于渲染
Sepax::as_shape_bundle
将接受一个Sepax
结构的引用和一个DrawMode
,并返回一个ShapeBundle
以添加到实体。Sepax::shape_geometry
将接受一个Sepax
结构的引用,并返回一个表示给定形状的Path
。与ShapePath
一起使用,可以在运行时更改渲染形状。查看平台游戏示例以查看此功能!
let circle = Circle::new((0.0, 0.0), 15.0);
let convex = Convex::Circle(circle);
let player = DrawMode::Fill(FillMode::color(Color::WHITE));
commands.spawn(Sepax::as_shape_bundle(&convex, player))
.insert(Sepax { convex })
.insert(Movable { axes: Vec::new() });
功能
debug
- 启用形状渲染。
serde
- 启用 Convex 和 Sepax 类型的序列化和反序列化,以便于加载。
示例
存储库包括两个示例应用程序,展示了一个基本的平台游戏(仅使用基本插件),以及一个射击游戏,展示了某些自定义系统。
cargo run --features="debug" --example platformer
cargo run --features="debug" --example shmup
贡献
请随时建议新功能、错误修复或优化。谢谢!
依赖关系
~19–58MB
~1M SLoC