gamebridge: Twitch Control #2
|
@ -32,18 +32,18 @@ impl Lerper {
|
|||
let scalar = self.scalar;
|
||||
self.scalar = match scalar {
|
||||
_ if scalar == self.goal => self.goal,
|
||||
_ if scalar == self.max => {
|
||||
_ if scalar >= self.max => {
|
||||
self.extended_tick = now;
|
||||
scalar - 1
|
||||
},
|
||||
_ if scalar == self.min => {
|
||||
}
|
||||
_ if scalar <= self.min => {
|
||||
self.extended_tick = now;
|
||||
scalar - 1
|
||||
},
|
||||
scalar + 1
|
||||
}
|
||||
_ => {
|
||||
let t = (now - self.extended_tick) as f64 / self.lerp_time;
|
||||
lerp(self.scalar, 0, t)
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
if self.scalar >= self.max {
|
||||
|
@ -54,7 +54,6 @@ impl Lerper {
|
|||
return self.min;
|
||||
}
|
||||
|
||||
log::info!("before: {}, after: {}", scalar, self.scalar);
|
||||
self.scalar
|
||||
}
|
||||
|
||||
|
@ -87,13 +86,14 @@ mod test {
|
|||
use super::Lerper;
|
||||
let mut lerper = Lerper::init(15.0, 127, -128, 0);
|
||||
|
||||
for case in [(127, 3, 126), (100, 8, 66)].iter() {
|
||||
for case in [(127, 3, 126), (100, 8, 66), (-124, 8, -82)].iter() {
|
||||
let scalar = case.0;
|
||||
let now = case.1;
|
||||
let want = case.2;
|
||||
|
||||
lerper.update(scalar);
|
||||
assert_eq!(lerper.apply(now), want);
|
||||
let result = lerper.apply(now);
|
||||
assert_eq!(result, want);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -42,7 +42,7 @@ fn main() -> Result<()> {
|
|||
let mut vblank = File::open("vblank")?;
|
||||
let mut input = OpenOptions::new().write(true).open("input")?;
|
||||
|
||||
const STICK_LERP_TIME: f64 = 330.0; // 330 frames to lerp stick positions down to 0
|
||||
const STICK_LERP_TIME: f64 = 270.0; // 270 frames to lerp stick positions down to 0
|
||||
const BUTTON_LERP_TIME: f64 = 20.0; // 20 frames to lerp button inputs down to 0
|
||||
|
||||
let st = {
|
||||
|
@ -53,7 +53,7 @@ fn main() -> Result<()> {
|
|||
sticky: Lerper::init(STICK_LERP_TIME, 127, -128, 0),
|
||||
a_button: Lerper::init(BUTTON_LERP_TIME, 64, -1, 0),
|
||||
b_button: Lerper::init(BUTTON_LERP_TIME, 64, -1, 0),
|
||||
z_button: Lerper::init(BUTTON_LERP_TIME / 4.0, 64, -1, 0), // z button is special
|
||||
z_button: Lerper::init(BUTTON_LERP_TIME, 64, -1, 0),
|
||||
r_button: Lerper::init(BUTTON_LERP_TIME, 64, -1, 0),
|
||||
start: Lerper::init(BUTTON_LERP_TIME / 4.0, 64, -1, 0), // z button is special
|
||||
c_left: Lerper::init(BUTTON_LERP_TIME, 64, -1, 0),
|
||||
|
@ -93,8 +93,12 @@ fn main() -> Result<()> {
|
|||
|
||||
//data.stickx.update(data.controller[2] as i64);
|
||||
//data.sticky.update(data.controller[3] as i64);
|
||||
debug!("x before: {}", data.stickx.scalar);
|
||||
let mut stickx_scalar = data.stickx.apply(frame) as i8;
|
||||
debug!("x after: {}", data.stickx.scalar);
|
||||
debug!("y before: {}", data.sticky.scalar);
|
||||
let mut sticky_scalar = data.sticky.apply(frame) as i8;
|
||||
debug!("y after: {}", data.sticky.scalar);
|
||||
|
||||
let dist = stick_distance(stickx_scalar, sticky_scalar);
|
||||
if dist <= 10 {
|
||||
|
@ -106,30 +110,53 @@ fn main() -> Result<()> {
|
|||
|
||||
let mut hi = HiButtons::NONE;
|
||||
let mut lo = LoButtons::NONE;
|
||||
const BUTTON_PUSH_THRESHOLD: i64 = 16;
|
||||
const BUTTON_PUSH_THRESHOLD: i64 = 2;
|
||||
|
||||
// high buttons
|
||||
data.a_button.apply(frame);
|
||||
if data.a_button.pressed(BUTTON_PUSH_THRESHOLD) { hi = hi | HiButtons::A_BUTTON; }
|
||||
if data.a_button.pressed(BUTTON_PUSH_THRESHOLD) {
|
||||
hi = hi | HiButtons::A_BUTTON;
|
||||
}
|
||||
data.b_button.apply(frame);
|
||||
if data.b_button.pressed(BUTTON_PUSH_THRESHOLD) { hi = hi | HiButtons::B_BUTTON; }
|
||||
if data.b_button.pressed(BUTTON_PUSH_THRESHOLD) {
|
||||
hi = hi | HiButtons::B_BUTTON;
|
||||
}
|
||||
data.z_button.apply(frame);
|
||||
if data.z_button.pressed(BUTTON_PUSH_THRESHOLD) { hi = hi | HiButtons::Z_BUTTON; }
|
||||
if data.z_button.pressed(BUTTON_PUSH_THRESHOLD) {
|
||||
hi = hi | HiButtons::Z_BUTTON;
|
||||
}
|
||||
data.start.apply(frame);
|
||||
if data.start.pressed(BUTTON_PUSH_THRESHOLD) { hi = hi | HiButtons::START; }
|
||||
info!("start: {}", data.start.scalar);
|
||||
|
||||
if data.start.pressed(BUTTON_PUSH_THRESHOLD) {
|
||||
hi = hi | HiButtons::START;
|
||||
}
|
||||
data.r_button.apply(frame);
|
||||
if data.r_button.pressed(BUTTON_PUSH_THRESHOLD) { lo = lo | LoButtons::R_BUTTON; }
|
||||
if data.r_button.pressed(BUTTON_PUSH_THRESHOLD) {
|
||||
lo = lo | LoButtons::R_BUTTON;
|
||||
}
|
||||
data.c_up.apply(frame);
|
||||
if data.c_up.pressed(BUTTON_PUSH_THRESHOLD) { lo = lo | LoButtons::C_UP; }
|
||||
if data.c_up.pressed(BUTTON_PUSH_THRESHOLD) {
|
||||
lo = lo | LoButtons::C_UP;
|
||||
}
|
||||
data.c_down.apply(frame);
|
||||
if data.c_down.pressed(BUTTON_PUSH_THRESHOLD) { lo = lo | LoButtons::C_DOWN; }
|
||||
if data.c_down.pressed(BUTTON_PUSH_THRESHOLD) {
|
||||
lo = lo | LoButtons::C_DOWN;
|
||||
}
|
||||
data.c_left.apply(frame);
|
||||
if data.c_left.pressed(BUTTON_PUSH_THRESHOLD) { lo = lo | LoButtons::C_LEFT; }
|
||||
if data.c_left.pressed(BUTTON_PUSH_THRESHOLD) {
|
||||
lo = lo | LoButtons::C_LEFT;
|
||||
}
|
||||
data.c_right.apply(frame);
|
||||
if data.c_right.pressed(BUTTON_PUSH_THRESHOLD) { lo = lo | LoButtons::C_RIGHT; }
|
||||
if data.c_right.pressed(BUTTON_PUSH_THRESHOLD) {
|
||||
lo = lo | LoButtons::C_RIGHT;
|
||||
}
|
||||
|
||||
println!(
|
||||
"[ rust] {:02x}{:02x} {:02x}{:02x}",
|
||||
hi.bits(),
|
||||
lo.bits(),
|
||||
stickx_scalar as u8,
|
||||
sticky_scalar as u8
|
||||
);
|
||||
controller[0] = hi.bits() as u8;
|
||||
controller[1] = lo.bits() as u8;
|
||||
controller[2] = stickx_scalar as u8;
|
||||
|
|
|
@ -80,18 +80,19 @@ async fn run_loop(
|
|||
let chatline = msg.data.to_string();
|
||||
let chatline = chatline.to_ascii_lowercase();
|
||||
let mut data = st.write().unwrap();
|
||||
const BUTTON_ADD_AMT: i64 = 64;
|
||||
|
||||
match chatline.as_str() {
|
||||
"a" => data.a_button.add(1024),
|
||||
"b" => data.b_button.add(1024),
|
||||
"z" => data.z_button.add(1024),
|
||||
"r" => data.r_button.add(1024),
|
||||
"cup" => data.c_up.add(1024),
|
||||
"cdown" => data.c_down.add(1024),
|
||||
"cleft" => data.c_left.add(1024),
|
||||
"cright" => data.c_right.add(1024),
|
||||
"start" => data.start.add(1024),
|
||||
"up" => data.stickx.add(127),
|
||||
"a" => data.a_button.add(BUTTON_ADD_AMT),
|
||||
"b" => data.b_button.add(BUTTON_ADD_AMT),
|
||||
"z" => data.z_button.add(BUTTON_ADD_AMT),
|
||||
"r" => data.r_button.add(BUTTON_ADD_AMT),
|
||||
"cup" => data.c_up.add(BUTTON_ADD_AMT),
|
||||
"cdown" => data.c_down.add(BUTTON_ADD_AMT),
|
||||
"cleft" => data.c_left.add(BUTTON_ADD_AMT),
|
||||
"cright" => data.c_right.add(BUTTON_ADD_AMT),
|
||||
"start" => data.start.add(BUTTON_ADD_AMT),
|
||||
"up" => data.sticky.add(127),
|
||||
"down" => data.sticky.add(-128),
|
||||
"left" => data.stickx.add(-128),
|
||||
"right" => data.stickx.add(127),
|
||||
|
|
Loading…
Reference in New Issue