Чтение положения щелчка мыши в Bevy
Я пытаюсь увидеть, где нажата мышь, чтобы выбрать своего персонажа. Я пробовал следующее
#[derive(Default)]
struct State { // Set up from example
mouse_button_event_reader: EventReader<MouseButtonInput>,
cursor_moved_event_reader: EventReader<CursorMoved>,
}
fn select_character(
mut state: ResMut<State>,
mouse_button_input_events: Res<Events<MouseButtonInput>>,
cursor_moved_events: Res<Events<CursorMoved>>,
) {
for (cursor_event, mouse_event) in state
.cursor_moved_event_reader
.iter(&cursor_moved_events)
.zip(
state
.mouse_button_event_reader
.iter(&mouse_button_input_events),
)
{
println!("{:?}", cursor_event);
println!("{:?}", mouse_event);
}
}
Это работает, но при нажатии на нее мышь должна двигаться. Есть ли способ получить позицию после нажатия мыши?
Редактировать:
я думал .find_latest
может сработать, заставив его вернуть последнюю Some
значение.
for event in state
.mouse_button_event_reader
.iter(&mouse_button_input_events)
{
let cursor_event = state
.cursor_moved_event_reader
.find_latest(&cursor_moved_events, |x| x.is_Some() // Not sure how to only return values that are Some(x)
);
println!("{:?}", event);
println!("{:?}", cursor_event);
}
2 ответа
Кажется, что .find_latest
для поиска следующего непрочитанного значения. Это означает, что вам, вероятно, также потребуется движение. Поскольку, скорее всего, последним событием был щелчок, движение уже было зафиксировано.
Я не могу обещать, что это идиоматично, поскольку мы все в этом новички, но решение есть:
Добавьте в структуру состояния две переменные с плавающей запятой. Затем, когда курсор перемещается, сохраните эту позицию. Когда щелкают мышью, вспомните эту информацию. Поскольку он становится частью ресурса (состояния), эта информация будет доступна для чтения и записи.
Реализовано
#[derive(Default)]
struct State { // Set up from example
mouse_button_event_reader: EventReader<MouseButtonInput>,
cursor_moved_event_reader: EventReader<CursorMoved>,
}
struct MouseLoc(Vec2);
fn select_character(
mut state: ResMut<State>,
mouse_pos: ResMut<MouseLoc>,
mouse_button_input_events: Res<Events<MouseButtonInput>>,
) {
for event in state
.mouse_button_event_reader
.iter(&mouse_button_input_events)
{
println!("event: {:?} position: {:?}", event, mouse_pos.0);
}
}
fn mouse_movement_updating_system(
mut mouse_pos: ResMut<MouseLoc>,
mut state: ResMut<State>,
cursor_moved_events: Res<Events<CursorMoved>>,
) {
for event in state.cursor_moved_event_reader.iter(&cursor_moved_events) {
mouse_pos.0 = event.position;
}
}
fn main() {
App::build()
.add_default_plugins()
...
.add_resource(MouseLoc(Vec2::new(0.0, 0.0)))
.add_system(mouse_movement_updating_system.system());
.add_system(position_mouse_click_system.system());
...
.run();
}
Вы можете использовать https://docs.rs/bevy/0.5.0/bevy/window/struct.Window.html#method.cursor_position
См. Также примеры (например, Contributors.rs), там вы можете узнать, как получить главное окно, и отсюда вы можете вызвать cursor_position.
Извините, я сейчас в дороге - уточню ответ позже