2个不稳定版本
0.2.0 | 2024年6月20日 |
---|---|
0.1.0 | 2024年5月30日 |
1105 在 游戏开发
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可见的实体被检查。
此插件为您的项目添加了什么?
添加此插件时,您的项目将添加以下内容
- 一个资源,用于标记用于检查的相机。是的,只允许一个相机。如果您需要同时检查多个相机,我很抱歉。
#[derive(Resource)]
pub struct CursorHoveringCamera{
pub entity: Option<Entity>,
}
- 一个资产,用于存储边多边形数据。多边形由一系列顶点定义。
#[derive(Asset, TypePath, Debug)]
pub struct BorderPolygon{
pub points: Vec<Vec2>,
}
- 一个封装BorderPolygon句柄的组件类型。您应将此组件附加到要检查的实体上。
#[derive(Component)]
pub struct SpriteBorder{
pub polygon: Handle<BorderPolygon>,
}
- 一个事件类型。当插件发现鼠标光标下的实体时,会发出一个包含实体的CursorOnSprite事件。
#[derive(Event)]
pub struct CursorOnSprite{
pub entity: Entity,
}
- 一个状态,用于标记检查函数是否正在运行。您可以将状态更改为Idling以暂停检查。
#[derive(States, Debug, Clone, Copy, Eq, PartialEq, Hash, Default)]
pub enum CursorHoveringSpriteState{
#[default]
Checking,
Idling,
}
- 一个更新系统。该系统负责检查鼠标光标下的实体。如果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