#碰撞检测 #碰撞 #bevy #2d #gamedev #调试

bevy_sepax2d

用于在Bevy中使用sepax2d进行2D重叠检测和碰撞解决的插件和实用方法

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 #碰撞

Download history 5/week @ 2024-07-02 166/week @ 2024-07-30

每月166次下载

MIT/Apache

41KB
318

Bevy tracking Crates.io MIT/Apache 2.0

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支持的每种形状的可能值:PolygonCircleAABBParallelogramCapsule。每个变体都包含对应形状的实例。请查看sepax2d 文档以了解有关每个形状的信息。

可以通过shapeshape_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阶段发生:

  • 重置前一帧的碰撞信息
  • 更新任何附加到TransformSepax组件的位置
  • 为标记为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