summaryrefslogtreecommitdiff
path: root/src/hitbox.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/hitbox.rs')
-rw-r--r--src/hitbox.rs47
1 files changed, 35 insertions, 12 deletions
diff --git a/src/hitbox.rs b/src/hitbox.rs
index bd4170e..32f432f 100644
--- a/src/hitbox.rs
+++ b/src/hitbox.rs
@@ -1,17 +1,40 @@
use geometry::*;
-pub trait CircleHitbox {
- fn pos(&self) -> Vec2d;
- fn radius(&self) -> f64;
-
- /**
- * True if the point is inside the hitbox
- */
- fn touches_point(&self, point: Vec2d) -> bool {
- self.pos().distance(point) <= self.radius()
- }
+pub enum Hitbox {
+ Circle(CircleHitbox),
+ Point(PointHitbox)
+}
+
+pub struct CircleHitbox {
+ pub pos: Vec2d,
+ pub radius: f64
+}
+
+pub struct PointHitbox {
+ pub pos: Vec2d
+}
+
+impl Hitbox {
+ pub fn intersect(a: &Hitbox, b: &Hitbox) -> bool {
+ use self::Hitbox::*;
- fn touches_circle(&self, other: &CircleHitbox) -> bool {
- self.pos().distance_squared(other.pos()) <= (self.radius() + other.radius()).powi(2)
+ match (a, b) {
+ (Circle(x), Circle(y)) => circles_intersect(x, y),
+ (Circle(x), Point(y)) => circle_point_intersect(x, y),
+ (Point(x), Circle(y)) => circle_point_intersect(y, x),
+ (Point(x), Point(y)) => points_intersect(x, y)
+ }
}
}
+
+fn circles_intersect(x: &CircleHitbox, y: &CircleHitbox) -> bool {
+ x.pos.distance_squared(y.pos) <= (x.radius + y.radius).powi(2)
+}
+
+fn circle_point_intersect(x: &CircleHitbox, y: &PointHitbox) -> bool {
+ x.pos.distance_squared(y.pos) <= x.radius.powi(2)
+}
+
+fn points_intersect(x: &PointHitbox, y: &PointHitbox) -> bool {
+ x.pos == y.pos
+}