improved velocity algorithm

This commit is contained in:
2025-06-30 08:31:28 -05:00
parent bbaa9d09e1
commit 921bfa27c1
2 changed files with 50 additions and 28 deletions
+49 -27
View File
@@ -9,36 +9,58 @@ use crate::{
pub struct VelocityExtension; pub struct VelocityExtension;
impl Extension for VelocityExtension { impl VelocityExtension {
fn render(&self, _widget: &Arc<Widget>) { fn apply_velocity(ticks: u16, velocity: i32, x: &mut u16) {
if let Some(velocity) = _widget.get::<Velocity>() { if velocity.abs() != 0 && ticks as i32 % (1000 / velocity.abs()) == 0 {
if let Some(mut t) = _widget.get::<Transform>() { if velocity > 0 {
match &mut t.x { *x += 1;
Position::Const(x) => { } else if velocity < 0 {
if velocity.0 > 0 { *x -= 1;
*x += 1;
} else if velocity.0 < 0 {
*x -= 1;
}
}
_ => {}
}
match &mut t.y {
Position::Const(y) => {
if velocity.1 > 0 {
*y += 1;
} else if velocity.1 < 0 {
*y -= 1;
}
}
_ => {}
}
_widget.set_component(t);
} }
} }
} }
} }
impl VelocityExtension {
fn apply_velocity_xy(ticks: u16, widget: &Arc<Widget>) {
if let Some(velocity) = widget.get::<Velocity>() {
if let Some(mut t) = widget.get::<Transform>() {
match &mut t.x {
Position::Const(x) => Self::apply_velocity(ticks, velocity.0, x),
_ => {}
}
match &mut t.y {
Position::Const(y) => Self::apply_velocity(ticks, velocity.1, y),
_ => {}
}
widget.set_component(t);
}
}
}
}
impl Extension for VelocityExtension {
fn init(&self, widgets: &Vec<Arc<Widget>>) {
std::thread::spawn({
let widgets = widgets.clone();
move || {
let mut tick = 0;
loop {
for widget in &widgets {
Self::apply_velocity_xy(tick, widget);
}
if tick > 1000 {
tick = 0;
} else {
tick += 1;
}
std::thread::sleep(std::time::Duration::from_millis(1));
}
}
});
}
}
component!(Velocity(pub i32, pub i32)); component!(Velocity(pub i32, pub i32));
+1 -1
View File
@@ -15,7 +15,7 @@ fn main() {
screen screen
.draw(format!("Hello, World!")) .draw(format!("Hello, World!"))
.component(Transform::new()) .component(Transform::new())
.component(Velocity(1, 0)) .component(Velocity(100, 0))
.component(OnTick(|w| { .component(OnTick(|w| {
if let Some(mut v) = w.get::<Velocity>() { if let Some(mut v) = w.get::<Velocity>() {
if let Some(t) = w.get::<Transform>() { if let Some(t) = w.get::<Transform>() {