0

Так что мне нужно обнаружить столкновение нескольких объектов, которые хранятся в двух разных массивах или массивах. Я подтвердил, что сам метод обнаружения столкновений работает нормально. Проблема в том, что сталкивающиеся объекты должны исчезнуть и быть удалены из массива, и я не уверен, как это сделать.Обнаружение конфликтов между объектами в массивах

public class GamePanel extends PApplet{ 
private boolean myRunningStatus; 
private final int HEIGHT = 700; 
private final int WIDTH = 1200; 
private final int SHOT_SPEED = -20; 
private int numStars = 0, numEnemies = 0; 
private Hero hero; 
private Enemy[] enemies; 
private List <Star> stars; 

public GamePanel(){ 
    myRunningStatus = true; 
    createEnemies(); 
    createStars(); 
    createHero(); 
    updateEnemies(); 
} 

public void createEnemies(){ 
    enemies = new Enemy[10]; 
    for (int i=0; i<enemies.length; i++){ 
     enemies[i] = new Enemy(random(1, WIDTH), random(1, HEIGHT), 5, 20); 
    } 
} 

public void createHero(){ 
    hero = new Hero(mouseX, mouseY); 
} 

public void createStars(){ 
    stars = new ArrayList <Star>(); 
} 

public Star generateStar(){ 
    Star star = new Star(hero.getHeroX(), hero.getHeroY()); 
    return star; 
} 


public void setup(){ 
    background(255); 
    size(WIDTH, HEIGHT); 
    hero.render(this); 
} 

public void draw(){ 
if(myRunningStatus){ 
    background(255); 
    hero.render(this); 
for(int i=0; i<enemies.length; i++){ 
    enemies[i].render(this); 
    enemies[i].move(); 
} 
    for(int i=0; i<stars.size(); i++){ 
     if(stars.get(i) != null){ 
      stars.get(i).render(this); 
      stars.get(i).move(SHOT_SPEED); 
      if(stars.get(i).getYPos() < 0){ 
       stars.remove(i); 
     } 
    } 
} 
} 
} 

//this is the method I'm using to find the collisions between the objects and remove them 
public void updateEnemies(){ 
    for(int i=0; i<enemies.length; i++){ 
    for(int j=0; j<stars.size(); j++){ 
     if(enemies[i].starHit(stars.get(j))){ 
      stars.set(j, null); 
      enemies[i] = null; 
     } 
     } 
    } 
} 


public void mouseMoved(){ 
if(myRunningStatus){ 
    hero.setHeroX(mouseX); 
    hero.setHeroY(mouseY); 
    } 
} 

public void mouseClicked(){ 
    for (int i=0; i<10;){ 
      stars.add(i, generateStar()); 
      break; 
    } 
} 

ответ

1

Вместо того чтобы устанавливать вещи равными null, было бы лучше, чтобы удалить их прямо из списка. Я бы использовал ArrayList для enemies и stars, а затем позвонил list.remove(i) во время обнаружения столкновения. Не забывайте, что это изменит размер списка, поэтому вам нужно будет делать i-- каждый раз, когда вы удаляете элемент для компенсации.

Кроме того, это меня смутило. Вы можете установить элементы enemies равен нулю:

if(enemies[i].starHit(stars.get(j))){ 
     stars.set(j, null); 
     enemies[i] = null; 
    } 

Но не проверять его здесь, так что ты не должен получать неработающими?

for(int i=0; i<enemies.length; i++){ 
    enemies[i].render(this); 
    enemies[i].move(); 
} 
Смежные вопросы