如何绘制跟随手指从开始演员到另一个演员Libgdx的箭头

时间:2017-04-08 20:13:12

标签: android libgdx scene2d

我的游戏中有两张桌子。当我点击第一个表格中的一个单元格时,我想绘制一个跟随我的手指的箭头,以便我可以将箭头从第二个表格移动到表格单元格。我需要能够知道哪个是最初的单元格,哪个是最后一个单元格(箭头开始的位置和箭头完成的位置)。如果用户将手指从屏幕上移开并且不在桌面上,我不希望发生任何事情。

DataView dv = new DataView();
dv.Table = dt;
dv.Filter = "CompanyName='abc'";
listView.ItemsSource = dv;

我该怎么做?

2 个答案:

答案 0 :(得分:0)

希望这会有所帮助。

Actor startFromActor = null; // Variable outside of method

public void foo() {
    // smt before
    ArrayList<Actor> myActor = new ArrayList<Actor>();
    ArrayList<Actor> anotherActor = new ArrayList<Actor>();
    // fill array with my actors
    Table firstTable = new Table();
    Table secondTable = new Table();

    for (int i = 0; i < 7; i++) {
        final Actor curActor = myActor.get(i);
        firstTable.add(curActor);
        curActor.addListener(new ActorGestureListener() {
            public void touchDown(InputEvent event, float x, float y, int pointer, int button) {
                if (pointer > 0) return false; // For only one finger
                startFromActor = curActor;
                // draw arrow that follows finger
            }
       });
    }
    for (int i = 0; i < 7; i++) {
        final Actor curActor = anotherActor.get(i);
        secondTable.add(curActor);
        curActor.addListener(new ActorGestureListener() {
            public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
                if (pointer > 0) return false; // For only one finger
                if (startFromActor != null) {
                    // do something
                    // startActor - actor from first table
                    // curActor - actor from second table

                    startFromActor = null; // do not forget to null-setting
                }
            }
       });
    }
}

如果您需要从一个表到另一个表的两个方向,则应为每个touchUp设置touchDownActor个事件,然后检查谁是开始和结束演员的所有者;

答案 1 :(得分:0)

您可以使用 libgdx 中的内置 Mesh 实用程序绘制箭头:

在初始化时构建 Mesh

建议只构建一个网格(通常在 init ),然后在运行时重复使用(渲染)它,次数与应用程序所需的箭头一样多。对于构建网格的目的,可以使用 MeshbuilderArrowShapeBuilder。示例:

MeshBuilder meshbuilder = new MeshBuilder();
meshbuilder.begin(VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal, GL20.GL_TRIANGLES);
ArrowShapeBuilder.build(
   meshbuilder,
   0,0,0 /* Starting xyz */
   5,5,0 /* Ending xyz */
   0.1f, /* percentage of arrow head */
   0.1f, /* percentage of stem thickness */
   10 /* divisions, basically level of detail */
);
Mesh debug_arrow = meshbuilder.end();

通过上面的内容构建了一个可渲染的网格。

将箭头渲染到您的应用

此步骤非常简单,前提是 Batch 已经可用:

debug_arrow.render(batch.getShader(), GL20.GL_TRIANGLES);

然后由舞台投影矩阵设置箭头的位置。 Batch 应该可用,至少渲染阶段有一个到 getBatch()

注意:网格参数不一定总是GL20.GL_TRIANGLES,但meshbuilder.begindebug_arrow.render中的参数必须匹配。