我试图做的只是让球从墙上反弹。一切正常,除了我希望能够提高运动速度的事实。从字面上看,速度是多少' x-value'被添加(以px为单位)到球的当前位置。问题是,当我增加var speed
时,球会浮出边界,因为篮球会通过球的界限和当前位置之间的差异来检查。
--------------------------------------更新-------- ---------------------------------
我已经使用了Mekka建议的技术,但仍然做错了什么。球不再漂浮在外面了,但有些东西会把它推出去#34;几个像素的界限/"不让球浮动几个像素以达到界限"。
我的新代码如下:
// the bounds-describing object
var border={
X:[8,302], // left and right borders in px
Y:[8,302], // top and bottom borders in px
indX:1, //border index for array Х
indY:0, //border index for array Y
changeInd:function(n){return this[n] = +!this[n]; } // function to change the index
};
if($("#ball").position().left + speed > border.X[1] || $("#ball").position().left + speed < border.X[0]){
var distX = "+=" + (border.X[border.indX] - $("#ball").position().left);
var distY = "-=" + ((border.X[border.indX] - $("#ball").position().left) * k);
$("#ball").css("left", distX);
$("#ball").css("top", distY);
border.changeInd("indX");
speed = -speed;
}
if($("#ball").position().top + k > border.Y[1] || $("#ball").position().top + k < border.Y[0]){
var distX = "+=" + ((border.Y[border.indY] - $("#ball").position().top) / k);
var distY = "+=" + (border.Y[border.indY] - $("#ball").position().top);
$("#ball").css("left", distX);
$("#ball").css("top", distY);
border.changeInd("indY");
k = -k;
}
另一个问题是我的代码的数学有时是不正确的,其原因我绝对无法弄清楚。要测试它,请以不同的速度尝试45度。 问题是:如何改进碰撞检查&#39;过程甚至应用其他一些技术来做到这一点? 整个代码可以在这里找到: http://jsfiddle.net/au99f/16/
答案 0 :(得分:3)
你非常接近!答案实际上是在你的问题中暗示的。您当前正在使用到边界的距离的绝对值来确定何时更改方向。这定义了一个“魔术区”,其中球可以改变大约6像素宽的方向(给定你的速度为3)。当你将速度提高到更高的速度(如10)时,你可以跳过这个神奇的区域。
更好的方法是测试下一次跳跃是否会将球完全置于界限之外。所以这个检查不是基于常数(如3),而是基于球本身的速度。你还可以看到球将走出界限多少,以确定球向相反方向移动多远。换句话说,如果您的速度是10,并且球在步骤8中距离右边缘3个像素,那么在步骤9中,球将从右边缘开始向左移动7个像素。警惕边缘情况(球可能正好落在边界上)。