72 lines
2.4 KiB
JavaScript
72 lines
2.4 KiB
JavaScript
//http://gamedev.stackexchange.com/questions/13774/how-do-i-detect-the-direction-of-2d-rectangular-object-collisions
|
|
var collision = new Collision();
|
|
|
|
var RIGHT = { x: 1, y: 0};
|
|
var LEFT = { x: -1, y: 0};
|
|
var UP = { x: 0, y: -1};
|
|
var DOWN = { x: 0, y: 1};
|
|
|
|
function Collision(){
|
|
|
|
this.onCollisionChange = function(ojb1, obj2, size, callback) {
|
|
var isColliding = false;
|
|
setInterval(
|
|
function(){
|
|
var beforeStatus = isColliding;
|
|
isColliding = collision(obj1, obj2, size);
|
|
if (beforeStatus != isColliding) callback();
|
|
}, 100);
|
|
}
|
|
|
|
this.isCollidingDirection = function(obj1, obj2, direction, offset){
|
|
switch(direction){
|
|
case LEFT: return collision.containsLeft(obj1, obj2, SIZE, offset); break;
|
|
case RIGHT: return collision.containsRight(obj1, obj2, SIZE, offset); break;
|
|
case UP: return collision.containsUp(obj1, obj2, SIZE, offset); break;
|
|
case DOWN: return collision.containsDown(obj1, obj2, SIZE, offset); break;
|
|
default: console.log("Undefined direction");
|
|
}
|
|
}
|
|
|
|
this.contains = function(obj, p, size){
|
|
var contains = p.x > obj.x && p.x < (obj.x + size) &&
|
|
p.y > obj.y && p.y < (obj.y + size);
|
|
return contains;
|
|
}
|
|
|
|
this.collision = function(obj1, obj2, size){
|
|
return obj1.x <= (obj2.x + size)
|
|
&& obj2.x <= (obj1.x + size)
|
|
&& obj1.y <= (obj2.y + size)
|
|
&& obj2.y <= (obj1.y + size)
|
|
}
|
|
|
|
this.containsLeft = function(obj1, obj2, size, offset){
|
|
return this.contains(obj1, addCoords(middlePoints(obj2, size).left, offset) , size);
|
|
}
|
|
this.containsRight = function(obj1, obj2, size, offset){
|
|
return this.contains(obj1, addCoords(middlePoints(obj2, size).right, offset), size);
|
|
}
|
|
this.containsUp = function(obj1, obj2, size, offset){
|
|
return this.contains(obj1, addCoords(middlePoints(obj2, size).top, offset), size);
|
|
}
|
|
this.containsDown = function(obj1, obj2, size, offset){
|
|
return this.contains(obj1, addCoords( middlePoints(obj2, size).bottom, offset), size);
|
|
}
|
|
|
|
var addCoords = function(point, offset) {
|
|
return p(point.x + offset.x, point.y + offset.y);
|
|
}
|
|
|
|
var middlePoints = function(obj, size){
|
|
var middleX = (obj.x + obj.x + size) / 2; //(obj.x *2 + size) / 2; ?
|
|
var middleY = (obj.y + obj.y + size) / 2;
|
|
return {
|
|
left: p(obj.x, middleY),
|
|
right: p(obj.x + size , middleY),
|
|
top: p(middleX, obj.y),
|
|
bottom: p(middleX, obj.y + size),
|
|
}
|
|
}
|
|
}
|