Android Multitouch Strange Behavior


  1. TwoNybble

    TwoNybble New Member

    After a lot of tinkering, I think I've finally come up with a good multitouch handling system for my android game. It makes use of Robert Greene's Input Pipeline, modified for use with multitouch. Right now, the code has a simple system that records which pointer ID is currently doing which action (right now just shooting and moving). Each pointer's state is kept in a Pointer class, which is just a simple encapsulation of whether it is down, and it's coordinates. The ID acts as the pointer array index.

    This seems like it should work well in practice, but in game it behaves very erratic. When recording the pointer actions in LogCat, oftentimes Android will send an "UP" action when the pointer remains down, or just before a number of "MOVE" actions by the pointer. Because my code believes the pointer is up, the game doesn't respond to it.

    This also happens with button presses like the shooting button. When the pointer comes down on the area (which right now is just simply the lower left region), Android will send multiple "UP" and "DOWN" actions even though the pointer remains down the whole time. I had a single touch movement system before and none of these problems happened.

    Is this just an issue with how I am reacting to the events? Should I handle POINTER_DOWN and DOWN separately? Or should I detect which pointers are moving after the "UP" action to see which ones really are down despite what Android says?

    Here's my current code in my thread which receives the input events from Android. Because it is a pipeline system, I have the events encapsulated in the InputObject which is somewhat similar to Robert Greene's. Maybe a new set of eyes can help me tell what's wrong? Thanks for any help!

    [HIGH]private int inx, iny;
    private int shootID;
    public boolean shooting = false;
    private int moveID;
    public boolean moveDown = false;

    private static final int MAX_POINTERS = 10;
    private Pointer[] pointers = new Pointer[MAX_POINTERS];

    public void inputTouch(InputObject in) {

    switch(in.action) {
    case MotionEvent.ACTION_DOWN:
    case MotionEvent.ACTION_POINTER_DOWN:
    pointers[in.pID].press(in.pX[in.actionIndex], in.pY[in.actionIndex]);
    //Log.i("D", "DOWN");
    break;
    case MotionEvent.ACTION_MOVE:
    for(int p = 0; p < in.pointCount; p++) {
    int id = in.pointerIDs[p];
    pointers[id].setCoord(in.pX[id], in.pY[id]);
    }
    //Log.i("D", "MOVE");
    break;
    case MotionEvent.ACTION_UP:
    case MotionEvent.ACTION_POINTER_UP:
    pointers[in.pID].release();

    if(shootID == in.pID) {
    shooting = false;
    }

    if(moveID == in.pID) {
    moveDown = false;
    }

    //Log.i("D", "UP");
    break;
    case MotionEvent.ACTION_CANCEL:
    default:
    break;
    }

    for(int ap = 0; ap < MAX_POINTERS; ap++) {
    if(pointers[ap].down) {
    if(pointers[ap].x < world.cam.pixelWidth / 4 &&
    pointers[ap].y > world.cam.pixelHeight - (world.cam.pixelHeight / 4)) {

    shootID = ap;
    shooting = true;
    } else {
    inx = pointers[ap].x;
    iny = pointers[ap].y;
    moveID = ap;
    moveDown = true;
    }
    }
    }

    StringBuilder sb = new StringBuilder();
    for(int j = 0; j < 3; j++) {
    sb.append("ID " + (j+1) + ": " + pointers[j].down + "[" + pointers[j].x + ", " + pointers[j].y + "]" + " | ");
    }
    //Log.i("D", sb.toString());
    }[/HIGH]

    Advertisement
    :
  2. TwoNybble

    TwoNybble New Member

    The problem seems to have resolved itself when I implemented historical events into the input objects. Although the historical events are supposedly only MOVE, I think some of the history code blocked some other events. In any case, the problem's been solved so this thread can be closed.
Loading...

Share This Page