通过单击并取消单击libgdx java来渲染多行

时间:2015-10-12 18:02:32

标签: java libgdx

我试图允许玩家点击按住然后拖动并放开,这将完成从你点击的地方到你放手的地方画一条线。但是我似乎无法弄清楚如何保持渲染的线条。每次单击拖动然后放开它都会正确绘制线条,然后在尝试绘制另一条线时消失。这是输入侦听器的代码,它获取位置

    @Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
    if(button == Buttons.LEFT){
        buttonPositions[0].x = screenX;
        buttonPositions[0].y = screenY;
        projector.unproject(buttonPositions[0]);
    }
    return false;
}

@Override
public boolean touchUp(int screenX, int screenY, int pointer, int button) {
    if(button == Buttons.LEFT){
        buttonPositions[1].x = screenX;
        buttonPositions[1].y = screenY;
        projector.unproject(buttonPositions[1]);
        lineDraws.add(buttonPositions);
    }
    return false;
}

buttonPositions是一个Vector2 size 2的数组,因此您可以添加点击的位置和放开的位置,然后arraylist lineDraws存储Vector2数组,然后我尝试遍历此列表并像这样呈现它

    public void render(float delta){
    if(!tutOver){
        startTutorial();
    }



    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    renderer.begin();
    for(int i = 0; i < listener.getPositionsList().size() - 1; i+=2){
        renderer.line(listener.getPositionsList().get(i)[0], listener.getPositionsList().get(i + 1)[1]);

    }
    renderer.end();

}

我不知道该做什么,i+=2是这样它将绘制前两个坐标然后是下两个坐标。非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

首先使用Array<> libgdx类而不是ArrayList - 它更方便。

您的问题似乎是 touchDown touchUp 方法。每次你改变

的值
    buttonPositions[0].x
    buttonPositions[0].y
    buttonPositions[1].x
    buttonPositions[1].y

因此,即使您将其添加到集合,您也会覆盖前一个

此外,我认为你不需要数组矢量数组 - 这是非常复杂的结构吗?相反,只使用数组向量,然后像现在一样进行2到2的迭代。

    //the listener class
    Array<Vector2> lineDraws = new Array<Vector2>();

    ...

    //touchDown class
    lineDraws.add(new Vector2(screenX, screenY));

    projector.unproject( new Vector2(startX, startY) );

    //consider adding some flag here to prevent two pointers touch (when holding finger, touching with another)

    //touchUp
    projector.unproject( new Vector2(screenX, screenY) );
    lineDraws.add(new Vector2(screenX, screenY));

    ...

    //the screen class render method
    for(int i = 0; i < listener.lineDraws.size - 1; i+=2)
    {
        renderer.line(listener.lineDraws.get(i), listener.lineDraws.get(i + 1));

}