-
Notifications
You must be signed in to change notification settings - Fork 0
/
collision.py
42 lines (34 loc) · 1.32 KB
/
collision.py
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
import math
from collections import defaultdict
class NewPos:
def __init__(self, x, y, r):
self.radius = r
self.y = y
self.x = x
new_pos = NewPos(0,0,0)
class CollisionsResolver:
@staticmethod
def resolve_collisions(game_objects):
collisions = CollisionsResolver._get_collisions_dict(game_objects)
for object in collisions.keys():
object.handle_collisions(collisions[object])
@staticmethod
def are_collided(first, second_x, second_y, second_radius):
new_pos.x = second_x
new_pos.y = second_y
new_pos.radius = second_radius
return CollisionsResolver._are_collided(first, new_pos)
@staticmethod
def _are_collided(first, second):
distance = math.sqrt((first.x - second.x) ** 2 + (first.y - second.y) ** 2)
return distance <= first.radius + second.radius
@staticmethod
def _get_collisions_dict(game_objects):
collisions = defaultdict(list)
for i in range(len(game_objects)):
for j in range(i + 1, len(game_objects)):
first, second = game_objects[i], game_objects[j]
if CollisionsResolver._are_collided(first, second):
collisions[first].append(second)
collisions[second].append(first)
return collisions