Implement multiplayer #2
66
src/input.rs
66
src/input.rs
|
@ -22,19 +22,23 @@ pub struct GamepadInfo {
|
|||
pub trait Mappings {
|
||||
fn mapping_names(&self) -> HashMap<VBKey, Vec<String>>;
|
||||
fn clear_mappings(&mut self, key: VBKey);
|
||||
fn clear_all_mappings(&mut self);
|
||||
fn use_default_mappings(&mut self);
|
||||
}
|
||||
|
||||
pub struct GamepadMapping {
|
||||
buttons: HashMap<Code, VBKey>,
|
||||
axes: HashMap<Code, (VBKey, VBKey)>,
|
||||
default_buttons: HashMap<Code, VBKey>,
|
||||
default_axes: HashMap<Code, (VBKey, VBKey)>,
|
||||
}
|
||||
|
||||
impl GamepadMapping {
|
||||
fn for_gamepad(gamepad: &Gamepad) -> Self {
|
||||
let mut buttons = HashMap::new();
|
||||
let mut default_buttons = HashMap::new();
|
||||
let mut default_button = |btn: Button, key: VBKey| {
|
||||
if let Some(code) = gamepad.button_code(btn) {
|
||||
buttons.insert(code, key);
|
||||
default_buttons.insert(code, key);
|
||||
}
|
||||
};
|
||||
default_button(Button::South, VBKey::A);
|
||||
|
@ -44,10 +48,10 @@ impl GamepadMapping {
|
|||
default_button(Button::Start, VBKey::STA);
|
||||
default_button(Button::Select, VBKey::SEL);
|
||||
|
||||
let mut axes = HashMap::new();
|
||||
let mut default_axes = HashMap::new();
|
||||
let mut default_axis = |axis: Axis, neg: VBKey, pos: VBKey| {
|
||||
if let Some(code) = gamepad.axis_code(axis) {
|
||||
axes.insert(code, (neg, pos));
|
||||
default_axes.insert(code, (neg, pos));
|
||||
}
|
||||
};
|
||||
default_axis(Axis::LeftStickX, VBKey::LL, VBKey::LR);
|
||||
|
@ -57,7 +61,12 @@ impl GamepadMapping {
|
|||
default_axis(Axis::DPadX, VBKey::LL, VBKey::LR);
|
||||
default_axis(Axis::DPadY, VBKey::LD, VBKey::LU);
|
||||
|
||||
Self { buttons, axes }
|
||||
Self {
|
||||
buttons: default_buttons.clone(),
|
||||
axes: default_axes.clone(),
|
||||
default_buttons,
|
||||
default_axes,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn add_button_mapping(&mut self, key: VBKey, code: Code) {
|
||||
|
@ -112,6 +121,16 @@ impl Mappings for GamepadMapping {
|
|||
!keys.is_empty()
|
||||
});
|
||||
}
|
||||
|
||||
fn clear_all_mappings(&mut self) {
|
||||
self.axes.clear();
|
||||
self.buttons.clear();
|
||||
}
|
||||
|
||||
fn use_default_mappings(&mut self) {
|
||||
self.axes = self.default_axes.clone();
|
||||
self.buttons = self.default_buttons.clone();
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
|
@ -162,23 +181,15 @@ impl Mappings for InputMapping {
|
|||
!keys.is_empty()
|
||||
});
|
||||
}
|
||||
|
||||
fn clear_all_mappings(&mut self) {
|
||||
self.keys.clear();
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct MappingProvider {
|
||||
device_mappings: Arc<RwLock<HashMap<DeviceId, Arc<RwLock<GamepadMapping>>>>>,
|
||||
sim_mappings: HashMap<SimId, Arc<RwLock<InputMapping>>>,
|
||||
gamepad_info: Arc<RwLock<HashMap<GamepadId, GamepadInfo>>>,
|
||||
}
|
||||
|
||||
impl MappingProvider {
|
||||
pub fn new() -> Self {
|
||||
let mut mappings = HashMap::new();
|
||||
|
||||
let mut p1_mappings = InputMapping::default();
|
||||
let p2_mappings = InputMapping::default();
|
||||
fn use_default_mappings(&mut self) {
|
||||
self.keys.clear();
|
||||
let mut default_key = |code, key| {
|
||||
p1_mappings.add_keyboard_mapping(key, PhysicalKey::Code(code));
|
||||
self.keys.insert(PhysicalKey::Code(code), key);
|
||||
};
|
||||
default_key(KeyCode::KeyA, VBKey::SEL);
|
||||
default_key(KeyCode::KeyS, VBKey::STA);
|
||||
|
@ -194,6 +205,23 @@ impl MappingProvider {
|
|||
default_key(KeyCode::ArrowLeft, VBKey::LL);
|
||||
default_key(KeyCode::ArrowDown, VBKey::LD);
|
||||
default_key(KeyCode::ArrowRight, VBKey::LR);
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct MappingProvider {
|
||||
device_mappings: Arc<RwLock<HashMap<DeviceId, Arc<RwLock<GamepadMapping>>>>>,
|
||||
sim_mappings: HashMap<SimId, Arc<RwLock<InputMapping>>>,
|
||||
gamepad_info: Arc<RwLock<HashMap<GamepadId, GamepadInfo>>>,
|
||||
}
|
||||
|
||||
impl MappingProvider {
|
||||
pub fn new() -> Self {
|
||||
let mut mappings = HashMap::new();
|
||||
|
||||
let mut p1_mappings = InputMapping::default();
|
||||
p1_mappings.use_default_mappings();
|
||||
let p2_mappings = InputMapping::default();
|
||||
|
||||
mappings.insert(SimId::Player1, Arc::new(RwLock::new(p1_mappings)));
|
||||
mappings.insert(SimId::Player2, Arc::new(RwLock::new(p2_mappings)));
|
||||
|
|
|
@ -50,6 +50,17 @@ impl InputWindow {
|
|||
mappings: &RwLock<T>,
|
||||
bind_message: &str,
|
||||
) {
|
||||
ui.horizontal(|ui| {
|
||||
if ui.button("Use defaults").clicked() {
|
||||
mappings.write().unwrap().use_default_mappings();
|
||||
self.now_binding = None;
|
||||
}
|
||||
if ui.button("Clear all").clicked() {
|
||||
mappings.write().unwrap().clear_all_mappings();
|
||||
self.now_binding = None;
|
||||
}
|
||||
});
|
||||
ui.separator();
|
||||
let mut names = {
|
||||
let mapping = mappings.read().unwrap();
|
||||
mapping.mapping_names()
|
||||
|
|
Loading…
Reference in New Issue