summaryrefslogtreecommitdiff
path: root/src/hitbox.rs
diff options
context:
space:
mode:
authorJustin Worthe <justin@worthe-it.co.za>2018-09-12 22:22:13 +0200
committerJustin Worthe <justin@worthe-it.co.za>2018-09-12 22:22:13 +0200
commit0d40cefa158f6273c37d6f1eacce50ffb637a523 (patch)
tree205935678c31e0b75d5eacfb8066c21c9de7e5d5 /src/hitbox.rs
parent38caea2a14bb3c205e4c42daa9f11f0f60550360 (diff)
Mostly implemented capsules
WIP: This is in SORE need of unit tests
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
+}