我正在使用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行。我怎么处理这个?
答案 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;