Похоже, вы не используете правильную формулу для расстояния между двумя точками. См. http://www.purplemath.com/modules/distform.htm для полного объяснения.
Вы делаете это:
this.ballCollide = function(balli) {
if (Math.abs((this.x) - (balli.x)) < (2*radius - buffer)) {
if (Math.abs((this.y) - (balli.y)) < (2*radius - buffer)) {
// Do collision
}
}
};
Это квадратная ограничительная рамка, а не круглая. Чтобы получить круглую ограничительную рамку, вы можете сделать что-то вроде этого, основываясь на формуле на указанной веб-странице:
this.ballCollide = function(balli) {
var deltax = this.x - balli.x;
var deltay = this.y - balli.y;
if (Math.sqrt(deltax * deltax + deltay * deltay) < 2 * radius - buffer) {
// Do collision
}
};
См. http://jsfiddle.net/UzPg2/14/ для рабочего примера.
Обратите внимание, что идеальный круговой ограничивающий прямоугольник намного медленнее алгоритм, чем аппроксимация квадратного ограничивающего прямоугольника.
Следуя точке Джаррода Роберсона (идеальный круг всегда находится внутри идеального квадрата), вы бы сделали это, по сути, объединив свой исходный код с кодом, который я разместил, вот так (и вы могли бы объединить их оба в один условный переход, если ты хотел):
var deltax = this.x - balli.x;
var deltay = this.y - balli.y;
var dist = 2 * radius - buffer;
if (Math.abs(deltax) < dist && Math.abs(deltay) < dist) {
if (Math.sqrt(deltax * deltax + deltay * deltay) < dist) {
// Do collision
}
}
См. http://jsfiddle.net/UzPg2/21/ для рабочего примера (я оставил buffer
, поскольку ваша переменная называется 2, но лично я думаю, что она выглядит лучше со значением 1).
Есть также много других способов оптимизировать это для скорости, если вам нужно, но предложение Джаррода дает вам самый большой немедленный прирост скорости.