summaryrefslogtreecommitdiff
path: root/composeApp/src/commonMain/kotlin/coffee/liz/ecs/physics/CollisionTick.kt
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)
                }
            }
        }
    }
}