2017-10-20 61 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; 
} 
相關問題