2017-10-20 4 views
-4

"엔터를"삭제하거나 "재생 영역"외부에 있거나 사용자가 볼 수있는 곳에서 벗어나면 내 엔터티를 삭제하려고합니다. 어떤 오류도 없지만 "killEdgeEntities"함수에서이 코드 샘플을 시도하고 게임을 시작하면 "if 문"이 직접 실행되는 것처럼 모든 것이 이미 죽어있을 것입니다. 그리고 아니, 나는 논쟁 밖에서 아무것도 산란하지 않습니다. 예를 들어 사용자 Ship은 화면 중간에 생성됩니다.C++ 오류에서 디버깅 할 수는 있지만 코드에 오류가 없습니다.

더 많은 정보가 필요하면 의견을 보내주세요.

void Invaders::killEdgeEntities() { 
EntityVector entities; 
for (EntityVector::iterator j = mEntities.begin(); j != mEntities.end(); j++) { 
    Entity *entity = *j; 
    // * Dödsgränser * 
    // Vänster: 
    if (entity->getPosition().getX() < -20) { 
     delete entity; 
    } 
    // Höger: 
    if (entity->getPosition().getX() > VGCDisplay::getWidth() + 20) { 
     delete entity; 
    } 
    // Upp: 
    if (entity->getPosition().getY() < -80) { 
     delete entity; 
    } 
    // Ner: 
    if (entity->getPosition().getY() > VGCDisplay::getHeight() + 20) { 
     delete entity; 
    } 

} 
mEntities = entities; 
} 
+1

'entities'는 빈 벡터입니다. 'mEntities = entities;'는'mEntities'를 빈 벡터로 만들고 이전 내용을 모두 누설합니다. '엔티티 '에 뭔가를 추가한다는 의미였습니까? –

+1

_ "30 분 안에 게시물을 보게 될 것"_ 짧은 시간에 나쁜 일이 어떻게 될지 놀랄 것입니다. – user0042

+1

게시물에 상당히 많은 내용이 포함되어 있습니다. [mcve]를 보여주고 누가 코드 게임에 대해 잘 모르는 사람이 누구인지 이해할 수있는 코드를 설명하는 것이 좋습니다. – user463035818

답변

1

실제로는 답변이 아닙니다. 우리가 진행하고있는 일을 해결할 수있는 충분한 코드를 게시하지 않았으므로 문제를 볼 수있을 정도로 게시했습니다.

if (entity->getPosition().getX() < -20) { 
    delete entity; 
} 
// Höger: 
if (entity->getPosition().getX() > VGCDisplay::getWidth() + 20) { 

x < -20과 엔티티를 삭제하면 어떻게됩니까? 당신은 이제 부동 포인터 (즉, 유효한 메모리를 가리키고 있지 않다) 인 다음 줄에서 그것을 액세스하려고 시도합니다 ... 그리고 충돌이 일어나기를 기다리고 있습니다.

+0

네가 무슨 말을하는지, 어쩌면 나는 if 문마다 for 루프를해야만 할까? 그 이후로 나는 다른 사람들과 간섭하지 않고있다. 나는 그것을 지금 시도 할 것이다 – fluxe

+0

@fluxe - 당신은'else if'로이 특별한 문제를 해결할 수있다. 그러나 여전히'mEntities'에 동일한 유효하지 않은 포인터가있을 수 있습니다. –

+0

또한 목록에서 포인터를 지우지 않습니다. 즉, 나중에 볼 수없는 충돌이 일어날 가능성이 있습니다. 가장 좋은 해결책은 스마트 포인터를 사용한 다음 목록 (삭제가 자동으로 수행됨) – UKMonkey

0

이 문제는 EntityVector "엔터티"에 대한 엔터티에 대해 push_back을 수행하는 끝에 다른 배치를 만들어 내 문제를 해결했습니다. 그리고 마지막으로 for 루프가 인라인인지 확인합니다 (평행선 같음).

void Invaders::killEdgeEntities() { 

    EntityVector entities; 
    for (EntityVector::iterator i = mEntities.begin(); i != mEntities.end(); i++) { 
     Entity *entity = *i; 
     // * Dödsgränser * 
     // Vänster: 
     if (entity->getPosition().getX() < -20) { 
      delete entity; 
     } 
     // Höger: 
     else if (entity->getPosition().getX() > VGCDisplay::getWidth() + 20) { 
      delete entity; 
     } 
     // Upp: 
     else if (entity->getPosition().getY() < -80) { 
      delete entity; 
     } 
     // Ner: 
     else if (entity->getPosition().getY() > VGCDisplay::getHeight() + 20) { 
      delete entity; 
     } 
     else { 
      entities.push_back(entity); 
     } 
    } 
    mEntities = entities; 
} 
관련 문제