我正在为Android开发一个空气曲棍球模拟器。在多人游戏模式下,我要跟踪屏幕上的两个触摸事件,只要触摸点不太接近,这种方法就能正常工作。
![Normal Touch](https://istack.dev59.com/4Cn1k.webp)
但是当这两个手指靠得太近时,Android只会识别到一个触摸事件,位于两点之间的中心位置。
更糟糕的是,Android有时在碰撞后混淆ID。
我已经考虑过估计下一个触摸点并手动分配ID,但是否有更好的方法或已经有人通过编程解决了这个问题呢?
注意:我是在三星 Galaxy S3上进行测试的。
我正在为Android开发一个空气曲棍球模拟器。在多人游戏模式下,我要跟踪屏幕上的两个触摸事件,只要触摸点不太接近,这种方法就能正常工作。
但是当这两个手指靠得太近时,Android只会识别到一个触摸事件,位于两点之间的中心位置。
更糟糕的是,Android有时在碰撞后混淆ID。
我已经考虑过估计下一个触摸点并手动分配ID,但是否有更好的方法或已经有人通过编程解决了这个问题呢?
注意:我是在三星 Galaxy S3上进行测试的。
虽然这不是解决问题的合乎逻辑的方法,但却是一种可能的应用解决方案:
如果我没有弄错,气球曲棍球游戏不应该允许对手侵入到彼此的游戏场地。如果我们假设在屏幕中央(竖屏模式)横跨一道厚厚的边框,那么我就不能越过那个边界线去做什么事情,因此在达到边界线后追踪我的手指就没有意义了。
将跟踪到的触摸事件封装成有效的物理位置可能会有所帮助,以忽略无效点(前提是物理位置不相交)。
您还需要跟踪触摸向量的方向:如果向量从屏幕中心延伸到“您的一端”,则可能是对手侵入的手指或您自己返回的手指。在任何情况下,它们都不应影响曲棍球(也许)。
这可能取决于您使用的设备,但我在华为X5上使用以下代码时,即使手指相互接触或我将它们扭曲到屏幕上,也不会出现混乱。
private static PointF touchScreenStartPtArr[] = new PointF[10];
private static PointF touchScreenStopPtArr[] = new PointF[10];
private static PointF touchScreenCurrPtArr[] = new PointF[10];
OnTouchListener onTouchListenerMulti = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction() & MotionEvent.ACTION_MASK;
int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
int fingerId = event.getPointerId(pointerIndex);
switch (action) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_POINTER_DOWN:
touchScreenStartPtArr[fingerId].x = event.getX(pointerIndex);
touchScreenStartPtArr[fingerId].y = event.getY(pointerIndex);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
case MotionEvent.ACTION_CANCEL:
touchScreenStopPtArr[fingerId].x = event.getX(pointerIndex);
touchScreenStopPtArr[fingerId].y = event.getX(pointerIndex);
break;
case MotionEvent.ACTION_MOVE:
int pointerCount = event.getPointerCount();
for (int i = 0; i < pointerCount; i++) {
touchScreenCurrPtArr[fingerId].x = event.getX(i);
touchScreenCurrPtArr[fingerId].y = event.getY(i);
}
break;
}
return true;
}
};
我这样理解。
触摸屏硬件会给你提供一个分辨率,低于该分辨率时两个触点会被认为是一个。这是不可改变的。
现在的问题是,当两个触点合并时怎么办?(这可以通过编程进行测试;例如,如果 2 个触点 -> 1 个触点,且前一个触点 1 足够接近于前一个触点 2 ...)。在您的情况下,我会沿着合并的触摸手势移动两个 pucks 直到它们分离,然后返回单独的控制。
当然,我还看到了一些问题,比如在拆分后哪个触点控制哪个 puck?也许有一个人在合并期间抬起了他们的手指。
如果出现合并,则可以使双方玩家失去对自己的 puck 的控制。这可以模拟手腕撞击对手时的震动 :)
我也喜欢 @dbm 的想法。
希望这能有所帮助。可能没有:)