Java 数组。删除(0)删除多个元素
我正在用LibGdx做一个滚动游戏 在render方法中,我从Java 数组。删除(0)删除多个元素,java,arrays,libgdx,Java,Arrays,Libgdx,我正在用LibGdx做一个滚动游戏 在render方法中,我从ArrayList获取一些数据 我以友好的方式将ArrayList添加到敌人,然后将其传递给一个在屏幕上迭代和绘制的方法。当整行在屏幕上不再可见时,该方法还处理删除整行的操作 因此,简而言之,我从这个数组中添加和删除了DINAMICALY项。 不幸的是,删除步骤似乎删除的内容比应该删除的多 下一步我将尝试输入一个有效代码,以便您能够更好地理解 public class Enemy extends ... implements .. {
ArrayList获取一些数据代码>
我以友好的方式将ArrayList添加到敌人
,然后将其传递给一个在屏幕上迭代和绘制的方法。当整行在屏幕上不再可见时,该方法还处理删除整行的操作
因此,简而言之,我从这个数组中添加和删除了DINAMICALY项。
不幸的是,删除步骤似乎删除的内容比应该删除的多
下一步我将尝试输入一个有效代码,以便您能够更好地理解
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);
}
公共类扩展。。。实现。。{
[接球手和接球手]
}
公共类游戏渲染器{
...
//敌人
ArrayList敌人;
...
私人银行(浮动三角洲){
//获取敌人阵型
for(int i=0;i 如果(敌方.getY()很可能同时添加和删除行,那么并发性问题?很难说没有看到实现
也考虑使用<代码> LIKEDLIST/CODE >,因为它对列表中间出现的删除操作进行了更好的优化。
集合#synchronizedList
可能有助于解决并发问题。感谢@hoaz的宝贵建议
我已经找到了解决问题的方法,我处理了在渲染方法之外删除行的问题
在我的处理器类中:
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);
}
// variable:
private ArrayList<Enemy> enemiesRef;
//变量:
私人ArrayList 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;
}
开关(mRace.getRaceState()){
案件审理:
mRace.update(delta,1);
if(enemyReference.canspawnewline()&&enemyReference.getY()<350){
enemyReference.setCanSpawnNewLine(false);
换行符();
}
//此手柄用于拆卸
如果(enemiesRef.get(0).getEnd(),您可以添加一些源代码,显示每个列表元素(行)的类型,如何创建并将其添加到列表中,然后解释如何知道除0之外的某个其他列表元素也已被删除。您是否尝试过使用调试器单步执行程序?remove(0)
将只删除列表中的第一个元素,而不会删除任何其他元素。请看一看,我已重写了我的问题。很抱歉,这是漫长的一天