lchzh3473 / sim-phi

Simulation of Phigros display with JavaScript Canvas API
https://lchzh3473.github.io/sim-phi/
GNU General Public License v3.0
284 stars 51 forks source link

有关Flick判定的问题 #2

Closed minecraftfen closed 1 year ago

minecraftfen commented 2 years ago

我在游玩sim-phi时发现,似乎只需要移动大于1个像素的距离,就可以判定为滑动(触摸反馈变红),这导致sim-phi中Filck时常可以当作蓝键点击,因为让人手从接触屏幕到离开产生的移动小于1像素比大于1像素还难。

我记得phigros的Flick判定应该比这更复杂一些:

minecraftfen commented 2 years ago

解决方案建议

滑动距离问题

我觉得应该可以在网页中放一个一个隐藏的SVG,每产生一个触控移动事件就把坐标加入SVG的Path数据中,然后用Path标签内建的求长度方法获取移动距离

例子(未调试,仅会意):

<svg id="filckbox"> <!-- 注意让这个的尺寸和触屏区域一样大 -->
    <path d="坐标列表" id="flick1">
    <path d="坐标列表" id="filck2">
    ...
</svg>
<script>
'use strict';
var flickbox=document.getElementById("flickbox");
function pointerdown(e){
    var obj=document.createElementNS("http://www.w3.org/2000/svg","path");
    obj.d="M"+e.x+","+e.y; // "M(x),(y)",表示提笔移动到点击位置,无空格
    e.target.obj=obj; // 别照着这个做,绝对行不通,不能多押
};
function pointermove(e){
    e.target.obj.d+="L"+e.x+","+e.y; // "L(x),(y)",表示落移动到移动位置,无空格
    if(e.target.obj.getTotalLength()>=25){ // 获取路径长度
        var flag_flick=true; // 触发flick判定
    };
};
function pointerup(e){
    flickbox.removeChild(e.target.obj);
};
</script>
minecraftfen commented 2 years ago

不过上面这个方法可能时空间复杂度相对求直线距离要大一些,我也不知道Phigros是求直线距离还是移动曲线长度的

minecraftfen commented 2 years ago

滑动范围应该可以用计算几何相交的方式实现(虽然我也不知道怎么实现hhh) 滑动重置的话,应该有一个flag就行,就像我上面提到的flag_flick,判定后把它重新放倒就可以了

lchzh3473 commented 2 years ago

我会考虑多种Flick判定方案,在后续版本同时进行测试:

lchzh3473 commented 1 year ago

结果方案:实时计算速度并指定触发/更新单个Flick的速度(对于不同物理尺寸的设备可能存在手感差异,但应该问题不大)