我正在编写一个在屏幕上有两个软d-pad的应用程序。我很难尝试捕获和理解两个同时触摸的所有触摸事件,因为每个ACTION_MOVE事件都表明id等于0。
我所拥有的是两个“触摸”物体,当触摸时它们会通过管道进入碰撞检测系统。记住我有两个d-pad,两者都需要能够同时控制。
有没有人有任何建议。这是我的onTouchEvent方法。请记住,可能很难理解上下文,因为我使用cusomt'touch'游戏对象与d-pad进行碰撞检测。
@Override
public void onTouchEvent(MotionEvent e)
{
int index = e.getActionIndex();
int action = MotionEventCompat.getActionMasked(e);
// Get the index of the pointer associated with the action.
//index = MotionEventCompat.getActionIndex(e);
int id = e.getPointerId(index);
if(touch1.pointerID<0)
touch1.pointerID = id;
else
touch2.pointerID = id;
switch(action)
{
case MotionEvent.ACTION_DOWN:
{
if(id == touch1.pointerID)
{
touch1.setCollideable(true);
touch1.getPosition().x = e.getX(index)*GameWorldProperties.getWidthRatio();
touch1.getPosition().y = e.getY(index)*GameWorldProperties.getHeightRatio();
}
else if(id==touch2.pointerID)
{
touch2.setCollideable(true);
touch2.getPosition().x = e.getX(index)*GameWorldProperties.getWidthRatio();
touch2.getPosition().y = e.getY(index)*GameWorldProperties.getHeightRatio();
}
break;
}
case MotionEvent.ACTION_POINTER_DOWN:
{
if(id == touch1.pointerID)
{
touch1.setCollideable(true);
touch1.getPosition().x = e.getX(index)*GameWorldProperties.getWidthRatio();
touch1.getPosition().y = e.getY(index)*GameWorldProperties.getHeightRatio();
}
else if(id==touch2.pointerID)
{
touch2.setCollideable(true);
touch2.getPosition().x = e.getX(index)*GameWorldProperties.getWidthRatio();
touch2.getPosition().y = e.getY(index)*GameWorldProperties.getHeightRatio();
}
break;
}
case MotionEvent.ACTION_UP:
{
if(id == touch1.pointerID)
{
touch1.setCollideable(false);
touch1.pointerID = -1;
touch1.getPosition().x = e.getX(index)*GameWorldProperties.getWidthRatio();
touch1.getPosition().y = e.getY(index)*GameWorldProperties.getHeightRatio();
}
else if(id==touch2.pointerID)
{
touch2.setCollideable(false);
touch2.pointerID = -1;
touch2.getPosition().x = e.getX(index)*GameWorldProperties.getWidthRatio();
touch2.getPosition().y = e.getY(index)*GameWorldProperties.getHeightRatio();
}
break;
}
case MotionEvent.ACTION_POINTER_UP:
{
if(id == touch1.pointerID)
{
touch1.setCollideable(false);
touch1.pointerID = -1;
touch1.getPosition().x = e.getX(index)*GameWorldProperties.getWidthRatio();
touch1.getPosition().y = e.getY(index)*GameWorldProperties.getHeightRatio();
}
else if(id==touch2.pointerID)
{
touch2.setCollideable(false);
touch2.pointerID = -1;
touch2.getPosition().x = e.getX(index)*GameWorldProperties.getWidthRatio();
touch2.getPosition().y = e.getY(index)*GameWorldProperties.getHeightRatio();
}
break;
}
case MotionEvent.ACTION_MOVE:
{
Log.d("pointer",String.format("Move index=%s id=%s", index,id));
for(int i=0;i<e.getPointerCount();i++)
{
Log.d("pointer",String.format("i=%s id=%s",i,e.getPointerId(i)));
touch1.setCollideable(true);
touch1.getPosition().x = e.getX(i)*GameWorldProperties.getWidthRatio();
touch1.getPosition().y = e.getY(i)*GameWorldProperties.getHeightRatio();
touch2.setCollideable(true);
touch2.getPosition().x = e.getX(i)*GameWorldProperties.getWidthRatio();
touch2.getPosition().y = e.getY(i)*GameWorldProperties.getHeightRatio();
}
break;
}
default:
{
break;
}
}
答案 0 :(得分:1)
希望这会有所帮助。这是来自Beginning Android Game Programming book。
public boolean onTouch(View v, MotionEvent event) {
synchronized (this) {
int action = event.getAction() & MotionEvent.ACTION_MASK;
int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
int pointerId = event.getPointerId(pointerIndex);
TouchEvent touchEvent;
switch (action) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_POINTER_DOWN:
touchEvent = touchEventPool.newObject();
touchEvent.type = TouchEvent.TOUCH_DOWN;
touchEvent.pointer = pointerId;
touchEvent.x = touchX[pointerId] = (int) (event
.getX(pointerIndex) * scaleX);
touchEvent.y = touchY[pointerId] = (int) (event
.getY(pointerIndex) * scaleY);
isTouched[pointerId] = true;
touchEventsBuffer.add(touchEvent);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
case MotionEvent.ACTION_CANCEL:
touchEvent = touchEventPool.newObject();
touchEvent.type = TouchEvent.TOUCH_UP;
touchEvent.pointer = pointerId;
touchEvent.x = touchX[pointerId] = (int) (event
.getX(pointerIndex) * scaleX);
touchEvent.y = touchY[pointerId] = (int) (event
.getY(pointerIndex) * scaleY);
isTouched[pointerId] = false;
touchEventsBuffer.add(touchEvent);
break;
case MotionEvent.ACTION_MOVE:
int pointerCount = event.getPointerCount();
for (int i = 0; i < pointerCount; i++) {
pointerIndex = i;
pointerId = event.getPointerId(pointerIndex);
touchEvent = touchEventPool.newObject();
touchEvent.type = TouchEvent.TOUCH_DRAGGED;
touchEvent.pointer = pointerId;
touchEvent.x = touchX[pointerId] = (int) (event
.getX(pointerIndex) * scaleX);
touchEvent.y = touchY[pointerId] = (int) (event
.getY(pointerIndex) * scaleY);
touchEventsBuffer.add(touchEvent);
}
break;
}
return true;
}
}