bevy_mouse_tracking_plugin
Tracking the mouse in bevy
is kind of annoying.
You gotta use Events
, and EventReader
s, and even then, they only
get called when the mouse actually moves.
This crate aims to make this as easy as possible, by providing a static resource that tracks the mouse position every frame.
This crate also supports more complex use cases such as multiple cameras, which are discussed further down.
Basics
First, add the plugin to your app:
use *;
use MousePosPlugin;
new
.add_plugins
.add_plugin;
Now, you can access the resource in your System
s:
use MousePos;
...and don't forget to add the system to your app:
.add_plugin
.add_system;
This will print the screen-space location of the mouse on every frame.
However, we can do better than just screen-space: we support automatic
transformation to world-space coordinates via the [MousePosWorld
] resource.
use MousePosWorld;
This will print the world-space location of the mouse on every frame.
Note that this is only supported for two-dimensional, orthographic camera,
but pull requests for 3D support are welcome!
Multiple cameras
You may notice that if you try to use this plugin in an app that has multiple cameras, it crashes!
.add_plugins
.add_plugin
.add_startup_system
.run;
new
This panics with the following output:
thread 'main' panicked at 'cannot identify main camera -- consider adding the MainCamera component to one of the cameras', src\mouse_pos.rs:163:13
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
This is because the plugin doesn't know which of the two cameras to use when figuring out
the values of the MousePos
and MousePosWorld
resources. Let's take the panic message's advice.
commands.spawn_bundle
.insert; // added this line
commands.spawn_bundle;
Queries
If you want to get mouse tracking information relative to each camera individually,
simply query for a MousePos
or MousePosWorld
as a
component instead of as a resource.
// plugins omitted...
.add_system;
new
If you want the mouse position for a specific camera, you can add query filters as always.
Note that as of bevy 0.6
, the only way to tell the difference between a UI camera and
an orthographic camera is by checking for the Frustum
component.
use Frustum;
No main camera
Let's say you have multiple cameras in your app, and you want to treat them all equally,
without declaring any one of them as the main camera.
Change the plugin to this:
.add_plugins
.add_plugin // SingleCamera -> MultiCamera
.add_startup_system
// ...
new
Now, you can add as many cameras as you want, without having to worry about marking any
of them as the main camera.
Note that MousePos
and MousePosWorld
will no longer be accessible as global resources
-- you can only access them by Query
ing camera entities.
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.
Crate name
As a final aside: the name of this crate is intentionally verbose.
This is because I didn't want to steal a crate name, especially 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
:
[]
= { = "bevy_mouse_tracking_plugin", = "..." }
License: MIT