51 lines
1.3 KiB
Rust
51 lines
1.3 KiB
Rust
use sdl2::rect::Rect;
|
|
|
|
|
|
pub struct Camera {
|
|
x: i32,
|
|
y: i32,
|
|
width: u32,
|
|
height: u32,
|
|
bounding: Rect
|
|
}
|
|
|
|
impl Camera {
|
|
pub fn new(x: i32, y: i32, width: u32, height: u32, bounding: Rect) -> Camera {
|
|
Camera {
|
|
x: x,
|
|
y: y,
|
|
width: width,
|
|
height: height,
|
|
bounding: bounding
|
|
}
|
|
}
|
|
|
|
pub fn center(&mut self, object: &Rect) {
|
|
let mut x = (object.x() + object.width() as i32 / 2) - (self.width as i32 / 2);
|
|
let mut y = (object.y() + object.height() as i32 / 2) - (self.height as i32 / 2);
|
|
|
|
if x < self.bounding.x() {
|
|
x = self.bounding.x();
|
|
} else if x + self.width as i32 > self.bounding.width() as i32 {
|
|
x = (self.bounding.width() - self.width) as i32;
|
|
}
|
|
|
|
if y < self.bounding.y() {
|
|
y = self.bounding.y();
|
|
} else if y + self.height as i32 > self.bounding.height() as i32 {
|
|
y = (self.bounding.height() - self.height) as i32;
|
|
}
|
|
|
|
self.x = x;
|
|
self.y = y;
|
|
}
|
|
|
|
pub fn to_relative_rect(&self, rect: &Rect) -> Rect {
|
|
Rect::new(rect.x() - self.x, rect.y() - self.y, rect.width(), rect.height())
|
|
}
|
|
|
|
pub fn to_rect(&self) -> Rect {
|
|
Rect::new(self.x, self.y, self.width, self.height)
|
|
}
|
|
}
|