2014-11-02 5 views
0

어제 게시 된 두 게임의 충돌, 적과 총알에 대한 도움을 요청했습니다.충돌로 인한 removeAt() 관련 문제

는 해결책이었다 : 지금 지점에게 총알이 적 교차 할 때마다 얻을로

foreach (Enemy enemy in enemies) 
    foreach (Bullet bullet in bullets) 
     if (bullet.boundingBox.Intersects(enemy.boundingBox)) 
     { 
      score += 1; 
     } 

그리고 물론

이이 점수를 현명했다. 이 문제는 두 개체를 모두 파괴해야 할 때 발생합니다 (모든 개체가 아니라 교차 된 개체 모두). 내 첫번째 생각은 지금처럼 RemoveAt을() 함수를 사용하는 것이 었습니다 :
if (bullet.boundingBox.Intersects(enemy.boundingBox)) 
    { 
     score += 1; 
     removeAt(); 
    }  

그러나 일반적으로이 같은 "RemoveAt을 (내가)"로 인덱스로 사용되는 때문에이 작동하지 않을 물론

. 나는 다음과 같이 두 목록 내부를 나는 상단을 참조 코드의 전체 덩어리를 복용하고 배치하려고 :

for (int i = bullets.Count - 1; i >= 0; i--) 
{ 
    bullets[i].Update(delta); 

    //Bullets being destroyed upon leaving 
    if (bullets[i].position.Y < 0) 
      bullets.RemoveAt(i); 

    foreach (Enemy enemy in enemies) 
     foreach (Bullet bullet in bullets) 
      if (bullet.boundingBox.Intersects(enemy.boundingBox)) 
      { 
       bullets.RemoveAt(i); 
      } 
} 

게임은이 시점에서 실행할 수 있지만 총알이 충돌하자마자 충돌합니다 적. 오류 "System.InvalidOperationException은"선 "foreach는 (총알 총알 총알)에서 발생합니다. 여기에서 어디로 가야

솔직히 모르는, 그래서 어떤 도움에 감사드립니다.

+0

이 코드는 한 줄을 지우면 작동하는 것처럼 보입니다. 'foreach (bullet bullet in bullets)'. 그것을 제거하고 그것이 원래 의도했던 것과 똑같이 실행되는지보십시오. – rileywhite

답변

3

이유 당신이 위에 열거 한 상태에서 bullets에서 요소를 제거하기 때문에 이것에 대한 것이 참조 :.. 그런 다음에 두 곳이

for (int i = bullets.Count - 1; i >= 0; i--) 

당신은 내가에서 총알의 수를 저장하고, 그것을 모든 시간을 단축하여 로직이 글 머리 기호를 제거하는 코드이므로 bullets의 수를 변경합니다. ify 배열을 열거하고 있습니다.

가능한 해결책은 의견에서 Jason이 지적한 바를 정확하게 수행 할 수 있습니다. 클래스에 bool Delete 속성을 추가 한 다음 RemoveAt을 호출하는 대신 Delete 플래그를 true로 설정합니다. 코드는 다음과 같습니다.

for (int i = bullets.Count - 1; i >= 0; i--) 
{ 
    bullets[i].Update(delta); 

    //Bullets being destroyed upon leaving 
    if (bullets[i].position.Y < 0) 
    { 
     bullets[i].Delete = true; 
    } 

    foreach (Enemy enemy in enemies) 
    { 
     if (bullets[i].boundingBox.Intersects(enemy.boundingBox)) 
     { 
      bullets[i].Delete = true; 
     } 
    } 
} 

bullets.RemoveAll(b => b.Delete); 

희망이 도움이 되었기 때문에, 행운을 빕니다!

+0

글 머리 기호가 화면에서 나왔을 때 "foreach (총알 글 머리 기호) 줄에 이전에받은 것과 같은 오류가 나타납니다? – Paulie

+0

@phantom 글자 그대로 창을 통해 내 노트북을 던지려는 것입니다. 왜이 기능이 작동하지 않습니까? ! 내가 쓸모 없기 때문에 당신의 도움을 정말로 바란다. 나는 여전히 정확히 같은 줄에 오류가있다. 내 머리를하고있다. – Paulie

+0

@PaulP 나에게 주변 코드의 일부/전부를 붙여 넣을 수있는 쪽지를 보내라. . 질문에서 적은 양을 기반으로 오류가 무엇인지 알 수는 없습니다. – phantom

0

종종 개체 제거를 위해 새 컬렉션을 유지 관리하고 처리가 완료된 후에 제거하는 것이 좋습니다. 내가 따라하기 쉽고 컨트롤 속성의 추가 의심스럽지 않습니다. 이와 비슷합니다 ....

List<Bullet> expiredBullets = new List<Bullet>(); 

for (int i = bullets.Count - 1; i >= 0; i--) 
{ 
    bullets[i].Update(delta); 

    if (bullets[i].position.Y < 0) 
    { 
    expiredBullets.Add(bullets[i]); 
    } 
} 

foreach(Bullet expiredBullet in expiredBullets) 
{ 
    bullets.Remove(expiredBullet); 
} 
관련 문제