触摸屏幕时对象产生的问题[LibGDX]

时间:2016-05-08 17:44:50

标签: java android libgdx

在我的游戏中,有不同大小的陨石雨。我试图制作它,以便如果你触摸一个更大的陨石,它将被移除(从一个阵列),一个较小的陨石物体将把它放在同一个地方,因为更大的陨石去除。

我遇到的问题是,如果你碰到一颗更大的陨石,它会被移除并经过所有其他陨石类型,直到它变成最小的陨石并完全消失......所有这些都在同一个触摸中。我显然不想要那个。不知道如何解决这个问题。

这是处理输入的代码:

private void handleInput() {
    Iterator<FallingItem> iter = items.meteorites.iterator();
    while (iter.hasNext()) {

        FallingItem item = iter.next();

        if (Gdx.input.justTouched()) {

            gameCam.unproject(touchPoint.set(Gdx.input.getX(), Gdx.input.getY(), 0));

            if (item.getClass() == SmallMeteorite.class && item.getBounds().contains(touchPoint.x, touchPoint.y)) { 

                meteoriteDestroyed.play(0.5f); //play sound
                iter.remove(); //removes item from array when it's no longer needed
                item.dispose(); //dispose meteorite texture to clear up memory
                score += 20; //add to score

            } else if (item.getClass() == MediumMeteorite.class && item.getBounds().contains(touchPoint.x, touchPoint.y)) { 

                meteoriteDestroyed.play(0.5f);
                iter.remove();
                item.dispose();
                score += 10;

                items.meteorites.add(new SmallMeteorite(item.getBounds().getX(), item.getBounds().getY()));

            } else if (item.getClass() == LargeMeteorite.class && item.getBounds().contains(touchPoint.x, touchPoint.y)) {

                meteoriteDestroyed.play(0.5f);
                iter.remove();
                item.dispose();
                score += 10;

                items.meteorites.add(new MediumMeteorite(item.getBounds().getX(), item.getBounds().getY()));

            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您将这些项目添加到数组中,以便它们仍然可以进行迭代。相反,您需要以某种方式标记它们,以便在迭代后可以更改它们。有几种方法可以做到这一点。

一种方法是保留单独的列表。在执行此循环之前清除它,然后将需要用较小的项替换的项添加到单独的列表中。当循环在主列表上完成时,您可以迭代单独的列表以将较小的版本添加到主列表中。

但是LibGDX有一种更简单的方法。使用LibGDX的SnapshotArray类,而不是使用List来存储你的陨石。它允许您迭代列表的副本,因此您对阵列的更改不会生效,直到您完成迭代:

FallingItem[] array = snapshotArray.begin();
for (int i=0; i<snapshotArray.size; i++){ //important to use snapshotArray.size, not array.length
    FallingItem item = array[i];
  //...
        //if (something) {snapshotArray.removeIndex(i, true); snapshotArray.add(new Something());}
}
array.end();

但是在你尝试之前,想想你是否真的需要为SmallMeteorite,MediumMeteorite等提供单独的类。确实存在过度封装这样的事情。如果这些对象的行为相同但只是具有不同的参数,则它们应该是一个类,其参数被修改为表示不同的大小。然后,您只需要更改其参数,而不是在数组中删除和替换它们。

旁注:您检查justTouched并在循环内而不是在循环内执行unproject是浪费的。那里有很多冗余的重复。