use sdl2::rect::{Point, Rect}; use sdl2::render::Canvas; use sdl2::video::Window; use crate::physics::PhysBody; use crate::physics::PhysVec; use crate::Camera; use crate::Drawable; use crate::ShipKind; use crate::SpriteAtlas; pub struct Ship { pub body: PhysBody, kind: ShipKind, scale: u32, } impl Ship { pub fn new(kind: ShipKind) -> Self { Ship { body: PhysBody::new(), kind, scale: 2, } } } impl Drawable for Ship { fn position(&self) -> PhysVec { return self.body.pos; } fn draw( &self, canvas: &mut Canvas, sa: &SpriteAtlas, c: &Camera, ) -> Result<(), String> { let win_size = PhysVec::from(canvas.window().size()); let draw_pos = self.screen_position(canvas, &c); // Don't draw if off screen if draw_pos.x < 0.0 || draw_pos.x > win_size.x || draw_pos.y < 0.0 || draw_pos.y > win_size.y { return Ok(()); } let sprite = sa.get(self.kind.sprite()); let mut dest_rect_0 = Rect::new(0, 0, 120 / self.scale, 270 / self.scale); dest_rect_0.center_on(Point::new( 120 / (2 * self.scale) as i32, 270 / (2 * self.scale) as i32, )); // set the current frame for time dest_rect_0.set_x(draw_pos.x.round() as i32); dest_rect_0.set_y(draw_pos.y.round() as i32); // copy the frame to the canvas canvas.copy_ex( &sprite.texture, Some(sprite.rect), Some(dest_rect_0), self.body.angle.to_degrees(), // angle Point::new(120 / (2 * self.scale) as i32, 270 / (2 * self.scale) as i32), // center false, false, )?; return Ok(()); } }