我有一堆轴对齐的矩形,定义如下:
function Rect(x,y,w,h) {
this.x = x;
this.y = y;
this.w = w;
this.h = h;
this.halfWidth = this.w*0.5;
this.x1 = this.x - this.halfWidth;
this.x2 = this.x + this.halfWidth;
}
轴的原点(0,0)是左上角。 水平移动通过以下功能实现:
Rect.prototype.moveX = function(dx){
this.x += dx;
this.x1 = this.x - this.halfWidth;
this.x2 = this.x + this.halfWidth;
};
在游戏循环中,在碰撞检查期间,我得到了,例如:
rect[1].x2 = 115.57166301905819; rect[2].x1 = 166.1619546484768;
沿x轴的最终距离计算如下:
dx = -50.590291629418616
这意味着,rect[2]
可以向左移动最大dx
个单位,即:
来自:rect[2].x = 341.1619546484768
致:rect[2].x = 290.5716630190582
现在,有时,函数moveX会导致错误的计算:
rect[2].x1 = rect[2].x - 175; // 175 is halfWidth
rect[2].x1 = 115.57166301905818 // <- less than 115.57166301905819
...这意味着,最后,rect[1]
和rect[2]
相互交叉(不需要的结果)。
有任何解决此问题的提示吗?