collide-2d-aabb-tilemap v1.0.0
collide-2d-aabb-tilemap
Determines whether a moving axis-aligned bounding box collides with a tilemap, and prevents intersection.
Based off collide-2d-tilemap. The key difference is that this module provides a non-destructive API, and doesn't depend on aabb-2d.
Example
Example usage:
var collideAabbTilemap = require('collide-2d-aabb-tilemap')
var tilemap = [
[ 0, 0, 0, 1 ],
[ 1, 0, 0, 1 ],
[ 1, 0, 0, 1 ],
[ 1, 1, 1, 1 ]
]
// (0,0) - (16,16)
var player = [0, 0, 16, 16]
// collideAabbTilemap(field, size of tile in pixels, [width, height])
collide = collideAabbTilemap(my_tilemap, 32, [4, 4])
my_game_event_loop(function(dt) {
var vec = get_player_input() * dt
collide(player, vec, function(moveAxis, moveDir, tileIdx, tileCoords) {
// true => solid
return tileIdx > 0
})
})The algorithm used is taken from this article. Detection and correction is applied on each X and Y axis separately.
Usage
var collide = collideAabbTilemap(array, tilesize, dimensions)
Produces a collide(aabb, vec2, oncollide) function.
array may be a single-dimension array (or
ndarray) of integers OR a function
of the form fn(tileX, tileY) -> integer.
tilesize are the pixel dimensions of a tile.
dimensions is a size 2 array of integers, [width, height]. If it is not
provided, the map will be assumed to be square.
var offset = collide(aabb, moveDelta, onCollide)
Attempt to advance aabb by moveDelta against the aforementioned tilemap.
Non-destructive.
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 [x, y].
onCollide is a callback function, taking the following arguments:
moveAxis: an integer representing the axis of movement.0(X) or1(Y).moveDir: either -1 or 1, denoting the direction of the movement.tileIdx: the tile integer data of the tile a candidate collision has been detected against.tileCoords: a size 2 array of tile coordinates.
If the callback returns a truthy value, the tile will be treated as solid, and no further tiles will be checked along this axis.
License
MIT
10 years ago