0

所以我需要檢測存儲在兩個不同數組或arrayLists中的多個對象的衝突。我已確認碰撞檢測方法本身運行正常。問題是碰撞的對象應該會消失並從數組中移除,我不知道如何去解決這個問題。檢測數組中對象之間的衝突

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的,倒不如從列表中徹底刪除。我會爲enemiesstars使用ArrayList,然後在衝突檢測期間調用list.remove(i)。不要忘記,這將改變列表的大小,所以每次移除要補償的元素時都必須執行i--

此外,這使我困惑。您可以設置爲null的enemies元素:

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

但是這裏不檢查,所以你不應該會得到的NPE?

for(int i=0; i<enemies.length; i++){ 
    enemies[i].render(this); 
    enemies[i].move(); 
}