【问题标题】:array.remove(0) removing more than one elementarray.remove(0) 移除多个元素
【发布时间】:2016-03-30 15:57:47
【问题描述】:

我正在使用 LibGdx 开发一款滚动游戏。

在渲染方法中,我从ArrayList<ArrayList<Enemy>> enemies; 获取一些数据

我将 ArrayList 添加到enemies,然后我将它传递给一个在屏幕上迭代和绘制的方法。当屏幕上不再可见时,该方法还处理整行的删除。

所以,简而言之,我从这个数组中添加和删除动态项目。 不幸的是,删除步骤似乎比它应该删除的更多。

接下来我会尝试放一个有效的代码,以便您更好地理解。

public class Enemy extends ... implements .. {
    [getters and setters]
}

public class GameRenderer {
    ...
    // Enemies
    ArrayList<ArrayList<Enemy>> enemies;
    ...

    private void drawEnemies(float delta) {

        // Get Enemy Array
        for (int i = 0; i < enemies.size(); i++) {

            for (Enemy enemy : enemies.get(i)) {
                drawEnemy(enemy, delta);
            }
        }

    }

    public void addEnemiesToArray(ArrayList<Enemy> enemiesRow) {
        enemies.add(enemiesRow);
    }
}

private boolean drawEnemy(Enemy enemy, float delta) {
    // get info from enemy and draw
    if (enemy.getY() <= 0)
        enemies.remove(0);
}

然后,一切都从处理器类中调用:

    public void update(float delta) {

    [methods...]

    switch (mRace.getRaceState()) {

        case RUNNING:
            mRace.update(delta, 1);
            if (enemyReference.canSpawnNewLine() && enemyReference.getY() < 350) {
                enemyReference.setCanSpawnNewLine(false);
                spawnNewLine();
            }
            break;

    }

    mRenderer.render(mRace.getRaceState(), mRace.getOldRaceState(), delta);
}

public void spawnNewLine() {
    ArrayList<Enemy> enemies = getEnemiesArray(numOfEnemies(), 0);
    enemyReference = enemies.get(0);
    mRenderer.addEnemiesToArray(enemies);
}

我的问题是drawEnemy 中的enemys.remove(0) 方法删除的不止第一行,它一次删除2 或3 行。我该如何处理?

【问题讨论】:

  • 您能否添加一些源代码,显示每个列表元素(行)是什么类型,如何创建它并将其添加到列表中,然后解释您如何知道除了某个其他列表元素0 也已被删除。
  • 您是否尝试过使用调试器单步执行您的程序? remove(0) 只会删除列表的第一个元素,而不会删除任何其他元素。
  • 请看一下,我已经重写了我的问题。对不起,这是漫长的一天

标签: java arrays libgdx


【解决方案1】:

很有可能同时添加和删除行,并发问题?没有看到实现就很难说。

还可以考虑使用LinkedList,因为它可以更好地针对列表中间发生的删除操作进行优化。

Collections#synchronizedList 可能有助于解决并发问题。

【讨论】:

    【解决方案2】:

    感谢@hoaz 的宝贵建议!

    我已经找到了解决问题的方法,我处理了渲染方法之外的行的删除。

    在我的处理器类中:

    // variable:
    private ArrayList<Enemy> enemiesRef;
    

    在更新方法中:

    switch (mRace.getRaceState()) {
    
            case RUNNING:
                mRace.update(delta, 1);
                if (enemyReference.canSpawnNewLine() && enemyReference.getY() < 350) {
                    enemyReference.setCanSpawnNewLine(false);
                    spawnNewLine();
                }
                // This handle the removing
                if (enemiesRef.get(0).getEnd() <= 0) {
                    mRenderer.removeFirst();
                    enemiesRef.remove(0);
                }
                break;
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 2020-04-24
      • 2013-02-07
      • 2013-04-22
      相关资源
      最近更新 更多