17个版本
0.6.3 | 2021年12月5日 |
---|---|
0.6.1 | 2020年6月6日 |
0.5.6 | 2020年6月5日 |
0.5.3 | 2020年5月31日 |
0.1.1 |
|
#318 in 游戏开发
125KB
2.5K SLoC
Joycon-rs
文档| 示例| 变更日志| 文档
通过蓝牙轻松高效地处理任天堂Switch Joy-Con的框架。
Joycon-rs
提供了查找、通信和操作Joy-Con的实用工具。请参阅文档注释以获取如何使用的详细说明。
Joycon-rs仍在开发中,并且目前还不完整。请注意,更新将包括一些破坏性的变化。请原谅我们正在清理灰尘!
设置
在macOS或Windows上,没有准备工作。
在linux上,
$ sudo apt-get install libudev-dev libusb-1.0-0-dev libfox-1.6-dev
使用方法
首先,在Cargo.toml
中添加依赖项
[dependencies]
joycon_rs = "*"
然后,在.rs
文件中使用预定义
use joycon_rs::prelude::*;
太好了!现在你可以在代码中使用Joycon-rs了。
接收报告
从简单的Joy-Con信号开始。如果你使用多个Joy-Con,mspc
会非常有帮助。
use joycon_rs::prelude::*;
let (tx, rx) = std::sync::mpsc::channel();
let _output = std::thread::spawn(move || {
// Push buttons or tilt the stick please.
// Stop with `Cmd + C` or `Ctrl + C`
while let Ok(message) = rx.recv() {
dbg!(message);
}
});
let manager = JoyConManager::get_instance();
let (managed_devices, new_devices) = {
let lock = manager.lock();
match lock {
Ok(m) => (m.managed_devices(),m.new_devices()),
Err(_) => unreachable!()
}
};
managed_devices.into_iter()
.chain(new_devices)
.flat_map(|dev| SimpleJoyConDriver::new(&dev))
.try_for_each::<_, JoyConResult<()>>(|driver| {
// Change JoyCon to Simple hid mode.
let simple_hid_mode = SimpleHIDMode::new(driver)?;
let tx = tx.clone();
// Spawn thread
std::thread::spawn( move || {
loop {
// Forward the report to the main thread
tx.send(simple_hid_mode.read_input_report()).unwrap();
}
});
Ok(())
})
.unwrap();
设置玩家灯
然后,让我们处理玩家灯。
use joycon_rs::prelude::{*, lights::*};
let (tx, rx) = std::sync::mpsc::channel();
let _output = std::thread::spawn(move || {
// Stop with `Cmd + C` or `Ctrl + C`
while let Ok(message) = rx.recv() {
dbg!(message);
}
});
let manager = JoyConManager::get_instance();
let (managed_devices, new_devices) = {
let lock = manager.lock();
match lock {
Ok(m) => (m.managed_devices(),m.new_devices()),
Err(_) => unreachable!()
}
};
managed_devices.into_iter()
.chain(new_devices)
.flat_map(|dev| SimpleJoyConDriver::new(&dev))
.try_for_each::<_, JoyConResult<()>>(|mut driver| {
// Set player lights
// [SL BUTTON] 📸💡📸💡 [SR BUTTON]
driver.set_player_lights(&vec![LightUp::LED1, LightUp::LED3], &vec![Flash::LED0, Flash::LED2]).unwrap();
tx.send(driver.get_player_lights()).unwrap();
Ok(())
})
.unwrap();
振动
use joycon_rs::prelude::*;
use std::convert::TryInto;
use std::ops::Deref;
use joycon_rs::joycon::joycon_features::JoyConFeature;
fn main() -> JoyConResult<()> {
// First, connect your Joy-Cons to your computer!
let manager = JoyConManager::get_instance();
let (managed_devices, new_devices) = {
let lock = manager.lock();
match lock {
Ok(manager) =>
(manager.managed_devices(), manager.new_devices()),
Err(_) => unreachable!(),
}
};
managed_devices.into_iter()
.chain(new_devices)
.inspect(|d| {
let lock = d.lock();
let device = match lock {
Ok(device) => device,
Err(e) => e.into_inner(),
};
let hid_device: JoyConResult<&HidDevice> = device.deref().try_into();
if let Ok(hid_device) = hid_device {
println!("{:?}", hid_device.get_product_string())
}
})
.try_for_each::<_, JoyConResult<()>>(|d| {
let mut driver = SimpleJoyConDriver::new(&d)?;
driver.enable_feature(JoyConFeature::Vibration)?;
// let rumble = Rumble::new(80.0,0.2);
let rumble = Rumble::new(300.0,0.9);
driver.rumble((Some(rumble), Some(rumble)))?;
Ok(())
})?;
Ok(())
}
更多示例
这里.
功能
您可以使用Joycon-rs
进行...
- 管理Joy-Con
- 连接/断开/重新连接
- 向/从Joy-Con发送/接收原始数据包(u8数组)
- 接收Joy-Con的输入
- 接收按键和摇杆方向(8个方向之一)在每次按键时。
- 接收按键、摇杆方向(模拟值)和6轴传感器,频率为60Hz。
- 获取/设置Joy-Con的状态
- 处理LED(玩家灯)
- 振动(震动)
- HOME灯
- 读取 Joy-Con / Pro 控制器颜色
- 读取工厂/用户校准数据
规划
- 接收 NFC/IR 数据
- 处理 Pro 控制器
许可
在 Apache 许可证 2.0 版下授权(LICENSE 或 http://www.apache.org/licenses/LICENSE-2.0)
贡献
我们乐意通过 GitHub pull requests 接受贡献。如果您在库中找到错误,如果能详细报告到 问题,以便可以重现,将不胜感激。
依赖项
~0.7–1.3MB
~23K SLoC