#sprite #bevy #picking #hovering

bevy_cursor_hovering_sprite

为bevy引擎开发的一个非常轻量级的插件,用于检查鼠标光标是否悬停在二维精灵上

2个不稳定版本

0.2.0 2024年6月20日
0.1.0 2024年5月30日

1105游戏开发

MIT 协议

9KB
117

bevy的鼠标悬停精灵检查插件

这是一个为bevy引擎开发的非常轻量级的插件,用于检查鼠标光标是否悬停在二维精灵上。

bevy bevy_cursor_hovering_sprite
0.13 ^0.1.0

它做什么?

当将此插件添加到您的bevy项目中,并将一个SpriteBorder组件附加到一个实体(可能是精灵)上时,此插件会检查鼠标光标是否当前悬停在由SpriteBorder和实体的坐标定义的区域。如果鼠标光标悬停在某个实体上,则插件会发出一个CursorOnSprite事件,报告该实体。

它可以用来实现2D精灵拾取功能。

查看example文件夹以了解如何使用它。

其背后的想法是什么?

想法很简单。首先将鼠标位置转换为2D世界坐标。然后检查此坐标是否位于由SpriteBorder组件和实体的世界坐标计算出的多边形内。

我从https://www.geeksforgeeks.org/how-to-check-if-a-given-point-lies-inside-a-polygon/中学到了检查点是否在多边形内的方法。

为了节省能量,只有通过迭代VisibleEntities可见的实体被检查。

此插件为您的项目添加了什么?

添加此插件时,您的项目将添加以下内容

  1. 一个资源,用于标记用于检查的相机。是的,只允许一个相机。如果您需要同时检查多个相机,我很抱歉。
#[derive(Resource)]
pub struct CursorHoveringCamera{
    pub entity: Option<Entity>,
}
  1. 一个资产,用于存储边多边形数据。多边形由一系列顶点定义。
#[derive(Asset, TypePath, Debug)]
pub struct BorderPolygon{
    pub points: Vec<Vec2>,
}
  1. 一个封装BorderPolygon句柄的组件类型。您应将此组件附加到要检查的实体上。
#[derive(Component)]
pub struct SpriteBorder{
    pub polygon: Handle<BorderPolygon>,
}
  1. 一个事件类型。当插件发现鼠标光标下的实体时,会发出一个包含实体的CursorOnSprite事件。
#[derive(Event)]
pub struct CursorOnSprite{
    pub entity: Entity,
}
  1. 一个状态,用于标记检查函数是否正在运行。您可以将状态更改为Idling以暂停检查。
#[derive(States, Debug, Clone, Copy, Eq, PartialEq, Hash, Default)]
pub enum CursorHoveringSpriteState{
    #[default]
    Checking,
    Idling,
}
  1. 一个更新系统。该系统负责检查鼠标光标下的实体。如果CursorHoveringSpriteState处于Checking状态,则运行该系统。
fn cursor_hovering(
    window_query: Query<&Window>,
    camera_query: Query<(&Camera, &GlobalTransform)>,
    visible_entities_query: Query<&VisibleEntities>,
    sprite_query: Query<(&Transform, &SpriteBorder)>,
    border_asset: Res<Assets<BorderPolygon>>,
    picking_camera: Res<CursorHoveringCamera>, 
    mut cursor_on_event_writer: EventWriter<CursorOnSprite>,
){/*...*/}

依赖关系

~19–46MB
~725K SLoC