2013-08-27 69 views
0

在libGDX InputProcessor的touchDown()中,我正在开发一种方法来为每个屏幕触摸创建一个新的TouchPoint矩形对象。libGDX InputProcessor:如何为每个android touch创建一个新对象?

我已经尝试把可创建为2的TouchPoint矩形的最大数量设置为约束条件;我只需要使用两个屏幕触摸。 touchDragged()中的每个唯一对象应该更新为其新的屏幕触摸位置,然后在touchUp()上删除。

我已经成功地为单个触摸创建了所需的结果,但不能用于多个屏幕触摸。对于第二次并发触摸,TouchPoint矩形对象从第一次触摸中消失,然后在第二次触摸位置显示。在第二次触摸的touchUp()后,对象会再次出现在第一次触摸的触摸位置。

  1. 哪段代码逻辑包含错误?
  2. 我该如何解决?

    /*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*/ 
    
    } 
    

此外,如果发生程序崩溃的第三屏幕触摸。
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.manytouches.controller.InputHandler.touchUp(InputHandler.java:104) 

感谢您的时间。

+0

不要创建touchpoint1和touchpoint 2一次又一次地在构造函数中创建它们,并且可以使用touchpoint1.set(x ,y,z)在输入处理器中 –

回答

0

应用检查

如果(指针< 2) .....

在润色和触摸拖动,以及...你在触摸完成事件越来越例外

而且您可以使用ArrayList中的接触点,所以当你触摸添加接触点下它在最后名单添加对象,因此这可能是因为这个......所以,在你的屏幕,而不是数组列表创建接触点的阵列

可以使代码通用的,而不是使用指针是否== 1或== 0你所能做的就是在inputprocessor创建接触点的阵列并指定值 接触点[指针] .SET(X,Y,Z) 这将使代码更具可读性,因为您在两种条件下都做同样的事情。

相关问题