summaryrefslogtreecommitdiff
path: root/src/hitbox.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/hitbox.rs')
-rw-r--r--src/hitbox.rs27
1 files changed, 25 insertions, 2 deletions
diff --git a/src/hitbox.rs b/src/hitbox.rs
index 32f432f..75cc89b 100644
--- a/src/hitbox.rs
+++ b/src/hitbox.rs
@@ -2,7 +2,8 @@ use geometry::*;
pub enum Hitbox {
Circle(CircleHitbox),
- Point(PointHitbox)
+ Point(PointHitbox),
+ Capsule(CapsuleHitbox)
}
pub struct CircleHitbox {
@@ -14,6 +15,11 @@ pub struct PointHitbox {
pub pos: Vec2d
}
+pub struct CapsuleHitbox {
+ pub line: LineSegment,
+ pub radius: f64
+}
+
impl Hitbox {
pub fn intersect(a: &Hitbox, b: &Hitbox) -> bool {
use self::Hitbox::*;
@@ -22,7 +28,12 @@ impl Hitbox {
(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)
+ (Point(x), Point(y)) => points_intersect(x, y),
+ (Capsule(x), Capsule(y)) => capsules_intersect(x, y),
+ (Capsule(x), Circle(y)) => capsule_circle_intersect(x, y),
+ (Circle(x), Capsule(y)) => capsule_circle_intersect(y, x),
+ (Capsule(x), Point(y)) => capsule_point_intersect(x, y),
+ (Point(x), Capsule(y)) => capsule_point_intersect(y, x),
}
}
}
@@ -38,3 +49,15 @@ fn circle_point_intersect(x: &CircleHitbox, y: &PointHitbox) -> bool {
fn points_intersect(x: &PointHitbox, y: &PointHitbox) -> bool {
x.pos == y.pos
}
+
+fn capsules_intersect(x: &CapsuleHitbox, y: &CapsuleHitbox) -> bool {
+ true //TODO
+}
+
+fn capsule_circle_intersect(x: &CapsuleHitbox, y: &CircleHitbox) -> bool {
+ x.line.distance(y.pos) <= x.radius + y.radius
+}
+
+fn capsule_point_intersect(x: &CapsuleHitbox, y: &PointHitbox) -> bool {
+ x.line.distance(y.pos) <= x.radius
+}