diff --git a/pong/src/collision.rs b/pong/src/collision.rs index ffceae1..a0b9e5c 100644 --- a/pong/src/collision.rs +++ b/pong/src/collision.rs @@ -26,7 +26,7 @@ pub mod collision { if !has_collision { continue; } - collisions.push(Collision(obj.id, other.id)) + collisions.push(Collision(obj.id(), other.id())) } if i >= objs.len() { break; @@ -75,18 +75,18 @@ pub mod collision { CollisionHandler {} } pub fn handle(&self, obj_a: &mut dyn GameObject, obj_b: &dyn GameObject) { - if !obj_a.is_static { - obj_a.vel.reflect(&obj_b.orientation); - if obj_b.vel != Vector::zero() { - let mut adjusted = obj_b.vel.clone(); + if !obj_a.is_static() { + obj_a.vel_mut().reflect(&obj_b.orientation()); + if *obj_b.vel() != Vector::zero() { + let mut adjusted = obj_b.vel().clone(); adjusted.normalize(); - obj_a.vel.add(&adjusted); + obj_a.vel_mut().add(&adjusted); } } - let mut b_to_a = obj_a.pos.clone(); - b_to_a.sub(&obj_b.pos); + let mut b_to_a = obj_a.pos().clone(); + b_to_a.sub(&obj_b.pos()); b_to_a.normalize(); - obj_a.pos.add(&b_to_a); + obj_a.pos_mut().add(&b_to_a); } } } diff --git a/pong/src/game_field.rs b/pong/src/game_field.rs index e26c667..7e2f5f3 100644 --- a/pong/src/game_field.rs +++ b/pong/src/game_field.rs @@ -103,7 +103,7 @@ impl Field { ball.obj.update_pos() } - let mut objs: Vec = vec![]; + let mut objs: Vec> = vec![]; objs.extend( self.players .clone() diff --git a/pong/src/game_object.rs b/pong/src/game_object.rs index 270216a..1c95e27 100644 --- a/pong/src/game_object.rs +++ b/pong/src/game_object.rs @@ -5,14 +5,18 @@ pub mod game_object { use crate::geom::shape::ShapeType; pub trait GameObject { + fn id(&self) -> u16; + fn pos(&self) -> &Vector; + fn pos_mut(&mut self) -> &mut Vector; + fn orientation(&self) -> &Vector; fn update_pos(&mut self); - fn vel(&self) -> &Vector; - fn set_vel_x(&mut self, x: f64); - fn set_vel_y(&mut self, y: f64); fn bounding_box(&self) -> BoundingBox; + fn vel(&self) -> &Vector; + fn vel_mut(&mut self) -> &mut Vector; + fn is_static(&self) -> bool; } - #[derive(Clone, Debug, PartialEq)] + // #[derive(Clone, Debug, PartialEq)] pub struct DefaultGameObject { pub id: u16, geom: Box, @@ -26,6 +30,22 @@ pub mod game_object { } impl GameObject for DefaultGameObject { + fn id(&self) -> u16 { + self.id + } + + fn pos(&self) -> &Vector { + self.geom.center() + } + + fn pos_mut(&mut self) -> &mut Vector { + self.geom.center_mut() + } + + fn orientation(&self) -> &Vector { + self.geom.orientation() + } + fn update_pos(&mut self) { let vel = self.vel(); let center = self.geom.center_mut(); @@ -41,22 +61,20 @@ pub mod game_object { orientation.y = updated_orientation.y; } + fn bounding_box(&self) -> BoundingBox { + self.geom.bounding_box() + } + fn vel(&self) -> &Vector { &self.physics.vel() } - fn set_vel_x(&mut self, x: f64) { - let vel = self.physics.vel_mut(); - vel.x = x; + fn vel_mut(&mut self) -> &mut Vector { + self.physics.vel_mut() } - fn set_vel_y(&mut self, y: f64) { - let vel = self.physics.vel_mut(); - vel.y = y; - } - - fn bounding_box(&self) -> BoundingBox { - self.geom.bounding_box() + fn is_static(&self) -> bool { + self.physics.is_static() } } } diff --git a/pong/src/geom.rs b/pong/src/geom.rs index d78c212..748b647 100644 --- a/pong/src/geom.rs +++ b/pong/src/geom.rs @@ -315,7 +315,7 @@ pub mod shape { } fn bounding_box(&self) -> BoundingBox { - BoundingBox::create(&self.center(), self.radius * 2, self.radius * 2) + BoundingBox::create(&self.center(), self.radius * 2., self.radius * 2.) } } }