array.remove(0)删除多个元素

时间:2016-03-30 15:57:48

标签: java arrays libgdx

我正在使用LibGdx进行滚动游戏。

在render方法中,我从ArrayList<ArrayList<Enemy>> enemies;

获取了一些数据

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

因此,简而言之,我在此数组中添加和删除dinamically项。 不幸的是,删除步骤似乎正在消除超出应有的范围。

我会尝试下一个有效的代码,以便你能更好地解决。

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);
}

然后,从Processor类调用所有内容:

    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中的enemies.remove(0)方法删除的行数多于第一行,它一次删除2行或3行。我怎么处理这个?

2 个答案:

答案 0 :(得分:2)

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

还要考虑使用LinkedList,因为它更适合于在列表中间发生的删除操作。

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

答案 1 :(得分:1)

感谢@hoaz的宝贵建议!

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

在我的处理器课程中:

def create_profile(sender, instance, created, *args, **kwargs):
    # ignore if this is an existing User
    if not created:
        return
    UserProfile.objects.create(user=instance)
post_save.connect(create_profile, sender=User)

在更新方法中:

// variable:
private ArrayList<Enemy> enemiesRef;