2017-10-20 154 views
-4

我试图“删除”/杀死我的实体,如果它们超出“playzone”范围或至少对用户可见。我没有得到任何错误,但是当我在函数“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

'实体'是一个空向量。 'mEntities = entities;'使'mEntities'成为一个空向量,也漏掉了它以前的所有内容。你是否想把某些东西添加到“实体”? –

+1

_“在30分钟内看着这个帖子”_你会很惊讶在如此短的时间内会有多糟糕。 – user0042

+1

你的帖子包含了一些mumbojumbo。你最好展示一个[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

这解决了我的问题,通过在实体上对实体进行push_back对EntityVector“实体”做一个批处理。最后在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; 
}