summaryrefslogtreecommitdiff
path: root/game_server/src/collide.rs
blob: 4217e7f1199e6fbdcef88ce6e224f174d3db9595 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
use crate::maths::{Vec2, Box, RBox};

pub trait Collide<Rhs> {
    fn collides(&self, other: &Rhs) -> bool;
}

impl Collide<Vec2> for Vec2 {
    fn collides(&self, other: &Self) -> bool {
        self == other
    }
}

impl Collide<Vec2> for Box {
    fn collides(&self, other: &Vec2) -> bool {
        self.pos < other && other < self.pos + self.size 
    }
}

impl Collide<Box> for Box {
    fn collides(&self, other: &Self) -> bool {
        self.collides(other.pos)
        || self.collides(other.pos + Vec2{x: other.x, y: 0})
        || self.collides(other.pos + Vec2{x: 0, y: other.y})
        || self.collides(other.pos + other.size)

        || other.collides(self.pos)
        || other.collides(self.pos + Vec2{x: self.x, y: 0})
        || other.collides(self.pos + Vec2{x: 0, y: self.y})
        || other.collides(self.pos + self.size)
    }
}

impl Collide<Vec2> for RBox {
    fn collides(&self, other: &Vec2) -> bool {
        let dx = self.size.x;
        let dy = self.size.y;
        let len = f32::sqrt(dx*dx+dy*dy);
        dx /= len;
        dy /= len;

        let dax = other.x - self.p1.x;
        let day = other.y - self.p1.y;
        
        let dot = dax * dx + day * dy;
        let px = self.pos.x + dx * dot;
        let py = self.pos.y + dy * dot;
       
        if !(self.pos < px && px < self.pos + self.size) {
            return false; 
        } 

        let ddx = other.x-px; 
        let ddy = other.y-py;
        let manhattenDistance = ddx + ddy;

        manhattenDistance < self.w 
    }
}

impl Collide<Box> for RBox {
    fn collides(&self, other: &Box) -> bool {
        self.collides(other.pos)
        || self.collides(other.pos + Vec2{x: other.x, y: 0})
        || self.collides(other.pos + Vec2{x: 0, y: other.y})
        || self.collides(other.pos + other.size)
        
        || other.collides(self.pos)
        || other.collides(self.pos + Vec2{x: self.x, y: 0})
        || other.collides(self.pos + Vec2{x: 0, y: self.y})
        || other.collides(self.pos + self.size)
        
    }
}