diff options
Diffstat (limited to 'src/collision.cpp')
-rw-r--r-- | src/collision.cpp | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/src/collision.cpp b/src/collision.cpp new file mode 100644 index 0000000..b747a90 --- /dev/null +++ b/src/collision.cpp | |||
@@ -0,0 +1,97 @@ | |||
1 | #include "collision.h" | ||
2 | |||
3 | bool Collision::operator<(const Collision& other) const | ||
4 | { | ||
5 | // Most important is the type of collision | ||
6 | if (type_ != other.type_) | ||
7 | { | ||
8 | return (static_cast<int>(type_) > static_cast<int>(other.type_)); | ||
9 | } | ||
10 | |||
11 | // Next, categorize the collisions arbitrarily based on direction | ||
12 | if (dir_ != other.dir_) | ||
13 | { | ||
14 | return (static_cast<int>(dir_) < static_cast<int>(other.dir_)); | ||
15 | } | ||
16 | |||
17 | // We want to process closer collisions first | ||
18 | if (axis_ != other.axis_) | ||
19 | { | ||
20 | switch (dir_) | ||
21 | { | ||
22 | case Direction::left: | ||
23 | case Direction::up: | ||
24 | { | ||
25 | return (axis_ < other.axis_); | ||
26 | } | ||
27 | |||
28 | case Direction::right: | ||
29 | case Direction::down: | ||
30 | { | ||
31 | return (axis_ > other.axis_); | ||
32 | } | ||
33 | } | ||
34 | } | ||
35 | |||
36 | // Order the remaining attributes arbitrarily | ||
37 | return std::tie(collider_, lower_, upper_) < | ||
38 | std::tie(other.collider_, other.lower_, other.upper_); | ||
39 | } | ||
40 | |||
41 | bool Collision::isColliding( | ||
42 | double x, | ||
43 | double y, | ||
44 | int w, | ||
45 | int h) const | ||
46 | { | ||
47 | int right = x + w; | ||
48 | int bottom = y + h; | ||
49 | |||
50 | switch (dir_) | ||
51 | { | ||
52 | case Direction::left: | ||
53 | case Direction::right: | ||
54 | { | ||
55 | if (!((bottom > lower_) && (y < upper_))) | ||
56 | { | ||
57 | return false; | ||
58 | } | ||
59 | |||
60 | break; | ||
61 | } | ||
62 | |||
63 | case Direction::up: | ||
64 | case Direction::down: | ||
65 | { | ||
66 | if (!((right > lower_) && (x < upper_))) | ||
67 | { | ||
68 | return false; | ||
69 | } | ||
70 | |||
71 | break; | ||
72 | } | ||
73 | } | ||
74 | |||
75 | switch (dir_) | ||
76 | { | ||
77 | case Direction::left: | ||
78 | { | ||
79 | return (axis_ >= x); | ||
80 | } | ||
81 | |||
82 | case Direction::right: | ||
83 | { | ||
84 | return (axis_ <= right); | ||
85 | } | ||
86 | |||
87 | case Direction::up: | ||
88 | { | ||
89 | return (axis_ >= y); | ||
90 | } | ||
91 | |||
92 | case Direction::down: | ||
93 | { | ||
94 | return (axis_ <= bottom); | ||
95 | } | ||
96 | } | ||
97 | } | ||