我目前正在为Android开发空气曲棍球模拟。对于多人游戏模式,我正在跟踪屏幕上的两个触摸事件,只要触摸点不能关闭,它就能很好地工作。
当两个手指关闭时,android只识别一个触摸事件,在两个点的中间。
更糟糕的是,安卓有时会在碰撞后弄乱ID。
我已经考虑过估算下一个接触点并手动分配ID,是否有人知道更好的方法,或者知道已经以编程方式解决过这个问题的人?
注意:我正在测试三星Galaxy S 3
答案 0 :(得分:6)
不一定是该问题的合理解决方案,但仍然是该应用程序的可能解决方案:
如果我没有完全弄错的话,空气曲棍球比赛不应该让对手闯入对方的比赛场地。如果我们假设一个厚边框穿过屏幕的中心(在纵向模式下),那么我将不被允许做任何超出该边界的事情,因此在我的手指到达边界线后没有任何意义。/ p>
将跟踪的触摸事件封装到有效的物理位置(如上所述)可能只会帮助您忽略无效点(假设物理位置不相交,即)。
你可能还需要跟踪触摸向量的方向:如果向量从屏幕中心向“你的结束”伸展,则可能是对手侵入手指或你自己的手指。在任何情况下都不应该影响冰球(也许)。
答案 1 :(得分:2)
这可能取决于您使用的设备,但我在华为X5中使用下面的代码并且它永远不会弄乱手指,即使它们相互接触或者我在屏幕上扭曲它们。 / p>
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;
}
};
请注意,我使用fingerId而不是pointerId来识别正确的手指,因为指针ID可能会在释放一根手指时发生变化。
希望它适合你。
答案 2 :(得分:2)
这是我看到它的方式。
触摸屏硬件为您提供了一个分辨率,低于该分辨率,两个触摸与一个触摸相同。这是你无法改变的。
现在的问题是,当两次接触合并时该怎么办? (这是可以通过编程方式进行测试的人可以想到的;例如,如果2个触摸点 - > 1触摸pt。并且prev touch pt 1足够接近prev touch pt 2 ...)。在你的情况下,我会沿着合并的触摸手势移动两个冰球,直到它们分开,然后返回单独的控制。
当然,我看到了几个问题,比如分裂后的哪个触控?也许有一个人在合并期间抬起手指。
如果发生合并,你可能让两位球员失去对冰球的控制权。当你的手撞到你的对手的时候,这可以模拟手腕的震动:)
我也喜欢@dbm的想法。
希望这会有所帮助。可能没有:)