-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcollision.odin
More file actions
71 lines (56 loc) · 1.31 KB
/
Copy pathcollision.odin
File metadata and controls
71 lines (56 loc) · 1.31 KB
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
package main
CollisionSystem :: struct{
colliders:[dynamic]Collider,
}
collision_system:^CollisionSystem
Collider :: struct{
using rect:Rect,
ref:EntityRef,
}
_collision_system_init :: proc(){
collision_system = new(CollisionSystem)
collision_system.colliders = make([dynamic]Collider)
}
_collision_system_update :: proc(){
}
collision :: proc(rect:Rect, $T:typeid, ignoreInd:=-1) -> ^T{
for collider,i in collision_system.colliders{
if i == ignoreInd do continue
if rects_overlap(rect, collider) && typeid_of(T) == collider.ref.entityType{
return entity_get(collider.ref, T)
}
}
return nil
}
collider_make :: proc(rect:Rect, ref:EntityRef) -> int{
append(&collision_system.colliders, Collider{
rect,
ref
})
return len(collision_system.colliders) - 1
}
collider_get :: proc(ind:int) -> ^Rect{
return &collision_system.colliders[ind].rect
}
move_and_collide :: proc(speed:Vec2, rect:^Rect){
newRect := rect^
signSpeed := sign(speed)
absSpeed := abs(speed)
//vertical movement
for i in 0..<absSpeed.y{
newRect.y += signSpeed.y
if collision(newRect, Block) != nil{
newRect.y -= signSpeed.y
break
}
}
//horizontal movement
for i in 0..<absSpeed.x{
newRect.x += signSpeed.x
if collision(newRect, Block) != nil{
newRect.x -= signSpeed.x
break
}
}
rect.pos = newRect.pos
}