【发布时间】:2015-10-14 10:41:08
【问题描述】:
我有一个简单的功能,用户可以点击并拖动相机。相机移动时略微平滑,但我不知道有什么简单的方法可以在相机赶上鼠标位置后停止相机。
我确定这只是一个简单的数学逻辑错误,但目前相机只是永远浮动。
这是我的功能:
function drag(evt,el){
clearInterval(timer);
if(evt.button == 2){ //right click and drag
mousePos = {};
mousePos.x = evt.offsetX / scale;
mousePos.y = evt.offsetY / scale;
function update(e){
var difx = mousePos.x - (e.offsetX/scale),
dify = mousePos.y - (e.offsetY/scale);
var targetX = camera.x + difx;
var targetY = camera.y + dify;
//update for next mouse movement
mousePos.x = e.offsetX / scale;
mousePos.y = e.offsetY / scale;
function smooth(){ // the problems lay here
if(camera.x != targetX){
camera.x += (difx * lerp);
}
if(camera.y != targetY){
camera.y += (dify * lerp);
}
}
timer = setInterval(smooth,16);
}
function clear(){
el.removeEventListener('mousemove', update, false);
this.removeEventListener('mouseup', clear, false);
}
el.addEventListener('mousemove',update,false);
document.body.addEventListener('mouseup',clear,false);
}}
我有代码在这里http://jsfiddle.net/bbb9q2c3/如果您单击并拖动然后放开框将继续移动,因为我当前的代码似乎没有检测到相机何时到达它的目标。
我能做些什么来解决这个问题?
【问题讨论】:
-
我玩了一会儿,但没有得到有效的解决方案。这是我注意到的一些事情。相机永远不会与目标完全匹配。我建议添加一个缓冲区并检查它是否在界限内。其次,我使用 setTimeout 而不是 setInterval,这样一旦满足平滑,我使用 clearTimeout,这样函数就不会无限期地运行。
-
有没有办法保证它会达到目标位置,也许使用某种 deltaTime 情况?
-
您是否在没有在 mousemove 上清除过它的情况下调用
setInterval()?坏主意... -
@Kaiido 哦,我忘了补充!感谢您发现它。
-
@Dave 如果 delta 为负测试以查看位置是否小于目标,以及是否为正测试以查看位置是否大于目标。
标签: javascript animation math camera