blob: bc34ac12c185d809096d6fcd20944218f9535e2b (
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
|
package coffee.liz.ecs.physics
import coffee.liz.ecs.Rect
import coffee.liz.ecs.World
internal class CollisionTick<Outside>(
private val collisionResolver: CollisionResolver<Outside>
) {
fun runTick(world: World<Outside>) {
// Eh, fast enough for now. Don't need to do any fancy collision detection. There's always later to improve if
// it's that bad.
world.query(Collidable::class, Position::class).forEach { a ->
world.query(Collidable::class, Position::class).forEach { b ->
val aHitBoxes = a.get(Position::class).let { pos -> a.get(Collidable::class).hitboxes.map {
Rect(pos.vec2, it.dimensions)
}}
val bHitBoxes = b.get(Position::class).let { pos -> b.get(Collidable::class).hitboxes.map {
Rect(pos.vec2, it.dimensions)
}}
val collisionDetected = aHitBoxes.any { a -> bHitBoxes.any { b -> a.overlaps(b) } }
if (collisionDetected) {
collisionResolver.resolveCollision(world, a, b)
}
}
}
}
}
|