前言:html
我有一个html格式的2048游戏,能够用键盘上下左右操做,可是放到手机上就抓瞎了。因而想修改一下代码,将键盘事件改为手机触屏事件。html5
html5 的touch事件算法
html5支持touch事件,虽然功能很少,兼容性也不是很好,可是好在不用其余库并且逻辑简单以便于封装本身的功能spa
说明:.net
元素监听开始滑动事件,获取初始的x,y坐标值。监听滑动事件在滑动过程当中监听x,y坐标的值变化。监听中止滑动事件,得到最后的x,y坐标值。而后计算x,y坐标值的变化趋势。code
若是x/y的绝对值大于2,说明在x轴上走了更长的路,也就是说应该是左右滑动。若是x大于0,则说明最后的位置在起始位置的右边,不然左边,对应右滑和左滑。htm
同理,若是y/x的绝对值大于2,说明y轴上走了更长的路,应该是上下滑动。若是y小于0,说明起始位置在最后位置的下面,因此应该是上滑。反之同理。blog
注意:坐标轴应该是从(0,0)开始向右下增长;而后这个x和y的比例只是说明一下向左向右偏移的程度。也能够设置为一半对一半。游戏
问题:事件等到中止滑动以后才响应,看起来有些滞后,体验不是很好,这个看后面能不能调整算法来作,若是在滑动过程当中就计算偏移量得出滑动趋势,会有一次滑动触发屡次的滑动事件的问题,使反映过于灵敏,若是按着转圈,游戏就会抽风。事件
var fromx=0.0,fromy=0.0,endx=0.0,endy=0.0,x=0.0,y = 0.0; var panel = document.getElementById("gamePanel"); panel.addEventListener("touchstart",function(event){ if (event.targetTouches.length == 1) { var touch = event.targetTouches[0]; fromx = touch.screenX; console.log(fromx); fromy = touch.screenY; } }); panel.addEventListener("touchmove",function(event){ if (event.targetTouches.length == 1) { event.preventDefault(); var touch = event.targetTouches[0]; endx = touch.screenX; endy = touch.screenY; } }); panel.addEventListener("touchend",function(event){ event.preventDefault(); var move = false; x = endx - fromx; y = endy - fromy; console.log(x); console.log(y); if(Math.abs(x/y)>=2.0 && x>=0.0 ){ //right move = rightAction(); }else if(Math.abs(x/y)>=2.0 && x<=0.0){ //left move = leftAction(); }else if(Math.abs(y/x)>=2.0 && y<=0.0){ //上 move = upAction(); }else if(Math.abs(y/x) >=2.0 && y>=0.0){ //下 move = downAction(); }
}
参考资料: