Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/jojojet/bevy-mouse-tracking
A plugin for effortless mouse tracking in the bevy game engine.
https://github.com/jojojet/bevy-mouse-tracking
bevy bevy-engine rust
Last synced: 2 months ago
JSON representation
A plugin for effortless mouse tracking in the bevy game engine.
- Host: GitHub
- URL: https://github.com/jojojet/bevy-mouse-tracking
- Owner: JoJoJet
- Created: 2021-01-12T15:35:34.000Z (almost 4 years ago)
- Default Branch: main
- Last Pushed: 2024-02-24T06:35:51.000Z (11 months ago)
- Last Synced: 2024-10-04T12:49:01.403Z (3 months ago)
- Topics: bevy, bevy-engine, rust
- Language: Rust
- Homepage:
- Size: 160 KB
- Stars: 27
- Watchers: 1
- Forks: 11
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# bevy_mouse_tracking_plugin
[![CI](https://github.com/JoJoJet/bevy-mouse-tracking/actions/workflows/ci.yml/badge.svg)](https://github.com/JoJoJet/bevy-mouse-tracking/workflows/ci.yml)
[![bevy_mouse_tracking on crates.io](https://img.shields.io/crates/v/bevy_mouse_tracking_plugin.svg)](https://crates.io/crates/bevy_mouse_tracking_plugin)
[![bevy_mouse_tracking docs](https://img.shields.io/badge/docs-docs.rs-orange.svg)](https://docs.rs/bevy_mouse_tracking_plugin)## Versions
| Bevy Version | Crate Version |
|--------------|---------------|
| 0.12 | 0.7 |
| 0.11 | 0.6 |
| 0.9 | 0.5 |
| 0.8 | 0.4 |
| 0.7 | 0.2.1 |
| 0.6 | 0.2.0 |
| main branch | main branch |This crate aims to make mouse tracking both effortless and explicit.
Tracking is opt-in and handled opaquely by this plugin.The mouse can be tracked on a per-camera basis by querying for tracking components.
Additionally, a global resource is maintained that tracks the main camera, if applicable.## Basics
```rust
use bevy::prelude::*;
use bevy_mouse_tracking_plugin::prelude::*;// First, add the plugin to your `App`.
App::new()
.add_plugins((DefaultPlugins, MousePosPlugin))
.add_systems(Startup, setup)
.add_systems(Update, dbg_mouse)
// ...fn setup(mut commands: Commands) {
commands
// Spawn a camera bundle
.spawn(Camera2dBundle::default())
// Opt in to mouse tracking.
// `InitMouseTracking` is a command that adds the mouse tracking
// component to the camera with a correct initial value.
.add(InitMouseTracking);
}// Now, we can track the mouse position by querying for it.
use bevy_mouse_tracking_plugin::MousePos;
fn dbg_mouse(mouse: Query<&MousePos>) {
// This will print the screen-space location of the mouse on every frame.
eprintln!("{}", *mouse.single());
// If we did `mouse.iter()` instead, this will naturally work for multiple cameras.
}
```Having to call `Query::single` is a bit annoying, and potentially error-prone.
Instead, we can specify a main camera, which the plugin will treat specially.```rust
use bevy_mouse_tracking_plugin::MainCamera;fn setup(mut commands: Commands) {
commands
// Spawn a camera with tracking.
.spawn(Camera2dBundle::default())
.add(InitMouseTracking)
// Add a component to mark it as the main camera.
.insert(MainCamera);
}// Now that we've specified the main camera, we can get the mouse position using a global resource.
fn dbg_mouse(mouse: Res) {
// This will print the screen-space location of the mouse on every frame.
eprintln!("{}", *mouse);
}
```## World-space
We can do better than just screen-space: this crate supports automatic
transformation to world-space coordinates via [`MousePosWorld`]
-- this is can be accessed as either a component or a resource.```rust
use bevy_mouse_tracking_plugin::MousePosWorld;fn setup(mut commands: Commands) {
commands
.spawn(Camera2dBundle::default())
// Opt in to world-space mouse tracking.
// This will automatically opt into screen-space tracking.
.add(InitWorldTracking)
// ...
}// Getting the world-space position using a query.
fn dbg_world_single(mouse: Query<&MousePosWorld>) {
// This will print the world-space position of the mouse on every frame.
eprintln!("{}", *mouse.single());
}// Getting it using the resource.
fn dbg_world_res(mouse: Res) {
eprintln!("{}", *mouse);
}
```Note that this is only supported for two-dimensional, orthographic cameras,
but pull requests for 3D support are welcome!If you do not specify a [`MainCamera`], the [`MousePos`] and [`MousePosWorld`]
resources will still exist, but they will always be zero.## Mouse motion
This crate supports a resource that tracks mouse motion, via [`MouseMotionPlugin`].
The motion can be accessed from any system in a [`MouseMotion`] resource.[`Res`]: bevy::ecs::system::Res
## Crate name
As a final aside: the name of this crate is intentionally verbose,
since it is very likely that this crate will eventually be made redundant by future updates to Bevy.
I recommend renaming the crate in your `Cargo.toml`:```toml
[dependencies]
mouse_tracking = { package = "bevy_mouse_tracking_plugin", version = "..." }
```License: MIT