Jumping and zig zag motion

This commit is contained in:
2025-11-26 23:07:19 +01:00
parent 3f07ca0ff6
commit 39d1306d93
3 changed files with 114 additions and 23 deletions
+89
View File
@@ -1,7 +1,12 @@
pub mod threads;
use std::{any::Any, sync::Arc};
use osmium::{entity::Component, renderer::Point};
pub struct Jumping(pub u16, pub u16);
pub struct ZigZag(pub u16);
pub struct Velocity(pub Point<i32>);
impl Component for Velocity {
@@ -33,3 +38,87 @@ fn apply_velocity(tick: u16, velocity: i32, x: &mut u16) -> bool {
}
false
}
impl Component for Jumping {
fn tick(&mut self, entity: &Arc<osmium::entity::Entity>, _tick: u16) {
let target = self.1;
let mut pos = entity.position();
// on first tick, start upward velocity
if self.0 == 0 {
std::thread::spawn({
let entity = entity.clone();
move || {
entity.update_component(|v: &mut Velocity| {
v.0.y = -150;
});
}
});
}
// If above the peak, fall down
if pos.y < target - 6 {
std::thread::spawn({
let entity = entity.clone();
move || {
entity.update_component(|v: &mut Velocity| {
v.0.y = 150;
});
}
});
}
// If we reached the ground, stop and remove component
if self.0 > 30 && pos.y >= target {
pos.y = target;
std::thread::spawn({
let entity = entity.clone();
move || {
entity.update_component(|v: &mut Velocity| {
v.0.y = 0;
});
entity.remove_component::<Jumping>();
}
});
}
self.0 += 1;
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
}
impl Component for ZigZag {
fn tick(&mut self, entity: &Arc<osmium::entity::Entity>, _tick: u16) {
let pos = entity.get_position();
if pos.x == 0 {
std::thread::spawn({
let entity = entity.clone();
move || {
entity.update_component(|v: &mut Velocity| {
v.0.x = 200;
});
}
});
}
if pos.x >= self.0 {
std::thread::spawn({
let entity = entity.clone();
move || {
entity.update_component(|v: &mut Velocity| {
v.0.x = -200;
});
}
});
}
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
}
+8 -20
View File
@@ -3,6 +3,9 @@ pub mod components;
use osmium::{renderer::Point, terminal};
fn main() {
let (term_width, term_height) = crossterm::terminal::size().unwrap();
let a = term_height - 3;
let engine = osmium::init();
let my_rect = engine.entity(|r| {
@@ -12,6 +15,9 @@ fn main() {
});
my_rect.component(components::Velocity(Point { x: 0, y: 0 }));
my_rect.component(components::ZigZag(term_width - 3));
my_rect.set_position(0, term_height - 3);
components::threads::tick(&engine);
components::threads::key(&engine);
@@ -21,26 +27,8 @@ fn main() {
move |e: &crossterm::event::Event| {
if let Some(key_event) = e.as_key_event() {
match key_event.code {
crossterm::event::KeyCode::Right => {
my_rect.update_component(|c: &mut components::Velocity| {
c.0.x = 100;
});
}
crossterm::event::KeyCode::Left => {
my_rect.update_component(|c: &mut components::Velocity| {
c.0.x = -100;
});
}
crossterm::event::KeyCode::Down => {
my_rect.update_component(|c: &mut components::Velocity| {
c.0.y = 100;
});
}
crossterm::event::KeyCode::Up => {
my_rect.update_component(|c: &mut components::Velocity| {
c.0.y = -100;
});
crossterm::event::KeyCode::Char(' ') => {
my_rect.component(components::Jumping(0, a));
}
_ => {}
}