# noffle/collide-2d-aabb-aabb

💥 Determines whether a moving axis-aligned bounding box (AABB) collides with other AABBs.
Switch branches/tags
Nothing to show
Fetching latest commit…
Cannot retrieve the latest commit at this time.
 Failed to load latest commit information. test Nov 24, 2015 LICENSE Nov 24, 2015 README.md Oct 1, 2016 index.js Nov 24, 2015 package.json Nov 24, 2015

# collide-2d-aabb-aabb

Determine whether a moving axis-aligned bounding box (AABB) collides with other AABBs.

`collide-2d-aabb-aabb` provides methods for testing an AABB against either

1. a single AABB, or
2. a set of AABBs

in 2D space.

## Usage: Test vs Single AABB

```var collideSingle = require('collide-2d-aabb-aabb').single

var player = [0, 0, 16, 16]
var motion = [5, 5]
var crate = [18, 1, 32, 32]

var offset = collideSingle(player, motion, crate)
console.log(offset)```

outputs

``````[2, 5]
``````

## Usage: Test vs Set of AABBs

```var collideSet = require('collide-2d-aabb-aabb').set

var player = [0, 0, 16, 16]
var motion = [5, 5]
var crates = [
[18, 1, 32, 32]
[7, 19, 32, 32]
]

function getCrate (cb) {
cb(crates[0])
cb(crates[1])
cb(null)
}

var offset = collideSet(player, motion, getCrate, onCollide)
console.log(offset)

function onCollide (box, axis, dir) {
console.log(box, axis, dir)
}```

outputs

``````[18, 1, 32, 32], 0, 1
[7, 19, 32, 32], 1, 1
[2, 3]
``````

Detection and correction is applied on each X and Y axis separately, resulting in 0-2 calls to `onCollide`.

## API

```var single = require('collide-2d-aabb-aabb').single
var set = require('collide-2d-aabb-aabb').set```

### var offset = single(aabb, moveDelta, aabb2)

Attempt to advance `aabb` by `moveDelta` against the impeding `aabb2`. Non-destructive.

If there is no collision, `offset == moveDelta`. Otherwise, it will be shorter in one or both axes.

`aabb` and `aabb2` are assumed to be a size 4 array of the form `[x, y, width, height]`.

`moveDelta` is assumed to be a `gl-matrix`-style `vec2` or array `[x, y]`.

### var offset = set(aabb, moveDelta, getAabb, onCollide)

Attempt to advance `aabb` by `moveDelta` against the set of impeding AABBs provided by the `getAabb` function. Non-destructive.

`getAabb` is assumed to be a function with a single parameter, `cb`, which is called to give size 4 arrays (of the form `[x, y, width, height]`) to check collisions against. You must call `cb(null)` to indicate `getAabb` is finished providing values.

If there is no collision, `offset == moveDelta`. Otherwise, it will be shorter in one or both axes.

`aabb` is assumed to be a size 4 array of the form `[x, y, width, height]`.

`moveDelta` is assumed to be a `gl-matrix`-style `vec2` or array `[x, y]`.

`onCollide` is a callback function, taking the following arguments:

• `aabb`: the size 4 array that the collision took place against. Will be === to the array provided by `getAabb`.
• `moveAxis`: an integer representing the axis of movement. `0` (X) or `1` (Y).
• `moveDir`: either -1 or 1, denoting the direction of the movement.

## Installation

``````\$ npm install collide-2d-aabb-aabb
``````