Tuesday, 27 August 2013

libGDX InputProcessor: How to create one new object per android touch?

libGDX InputProcessor: How to create one new object per android touch?

Within the libGDX InputProcessor's touchDown() I am developing a way to
create a new TouchPoint rectangle object per screen touch.
I have tried put a constraint on the maximum number of TouchPoint
rectangles creatable to two; I only need to work with two screen touches.
Each unique object should be updated to its new screen touch location
within touchDragged(), then deleted on touchUp().
I have successfully been able to create the desired result for single
touches, but not for multiple screen touches. For the second concurrent
touch, the TouchPoint rectangle object disappears from the first touch,
then shows at the second touch location. Upon touchUp() of the second
touch, the object reappears at the touch location of the first touch.
Which piece of code logic contains the error?
How do I fix it?
/*experiment*/
public Vector3 tps[] = new Vector3[2];
/*experiment*/
@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
/*experiment*/
if(pointer < 2){
if(pointer == 0) {
Vector3 touchPosition1 = new Vector3();
tps[pointer] = touchPosition1;
tps[pointer].set(screenX, screenY, 0);
gameScreen.getWorldRenderer().getCamera().unproject(tps[pointer]);
touchPoint1 = new TouchPoint(52, 52, new Vector2(tps[pointer].x - 26,
tps[pointer].y - 26));
gameScreen.getWorld().getTouchPoints().add(touchPoint1);
Gdx.app.log("TOUCH DOWN", "pointer: " + pointer + " x: " +
tps[pointer].x + " y: " + tps[pointer].y);
}
if(pointer == 1) {
Vector3 touchPosition2 = new Vector3();
tps[pointer] = touchPosition2;
tps[pointer].set(screenX, screenY, 0);
gameScreen.getWorldRenderer().getCamera().unproject(tps[pointer]);
touchPoint2 = new TouchPoint(52, 52, new Vector2(tps[pointer].x - 26,
tps[pointer].y - 26));
gameScreen.getWorld().getTouchPoints().add(touchPoint2);
Gdx.app.log("TOUCH DOWN", "pointer: " + pointer + " x: " +
tps[pointer].x + " y: " + tps[pointer].y);
}
}
return false;
}
@Override public boolean touchUp(int screenX, int screenY, int pointer,
int button) { /experiment/
gameScreen.getWorld().getTouchPoints().removeIndex(pointer); //note:
dispose of unused vector3 objects //note: dispose of all other unused
objects /experiment/
return false;
}
@Override public boolean touchDragged(int screenX, int screenY, int
pointer) { /experiment/ tps[pointer].set(screenX, screenY, 0);
gameScreen.getWorldRenderer().getCamera().unproject(tps[pointer]);
for(TouchPoint tp: gameScreen.getWorld().getTouchPoints()) {
tp.moveRectangleToPosition(new Vector2(tps[pointer].x - 26,
tps[pointer].y - 26));
tp.updateRectangleBoundaries();
}
Gdx.app.log("TOUCH DRAGGING", "pointer: " + pointer + " x: " +
tps[pointer].x + " y: " + tps[pointer].y);
/*experiment*/
Furthermore, the program crashes if a third screen touch occurs.
LogCat:
08-27 14:08:31.808: W/dalvikvm(9988): threadid=11: thread exiting with
uncaught exception (group=0x41711438)
08-27 14:08:31.808: E/AndroidRuntime(9988): FATAL EXCEPTION: GLThread 40874
08-27 14:08:31.808: E/AndroidRuntime(9988):
java.lang.IndexOutOfBoundsException: 2
08-27 14:08:31.808: E/AndroidRuntime(9988): at
com.badlogic.gdx.utils.Array.removeIndex(Array.java:229)
08-27 14:08:31.808: E/AndroidRuntime(9988): at
com.multitasckq.controller.InputHandler.touchUp(InputHandler.java:104)
Thanks for your time.

No comments:

Post a Comment