【问题标题】:sfml/c++ - Using Vector for Multiple Enemy Classsfml/c++ - 对多个敌人类使用向量
【发布时间】:2023-03-23 19:13:01
【问题描述】:

我正在尝试游戏开发。我尝试了一个来自教程网站的示例,如下所示:

int number = 10;

std::vector<std::unique_ptr<enemy> > enemies1;

for (unsigned i = 0; i < number; ++i) {
    enemies1.emplace_back(std::unique_ptr<enemy>(new enemy(sf::Vector2f(100 * i + 1500, 1000), sf::Vector2f(15, 10), sf::Color(255, 255, 255, 0))));
}
    //update
    for (unsigned i = 0; i < number; ++i) {
            enemies1[i]->update();
        }
    //render
    for (unsigned i = 0; i < number; ++i) {
            window.draw(enemies1[i]->enemysprite);
        }

我正在使用矢量从我的敌人类别中创建多个敌人。一切都很好,我可以在屏幕上画出 10 个敌人,他们正在移动等等。但是如果我尝试像这样删除一个敌人:

    if (!enemies1.empty())
    {
        for (unsigned i = 0; i < number; ++i) {
            if (enemies1[i]->rect.getGlobalBounds().intersects(sprite.getGlobalBounds())) 
                enemies1.erase(enemies1.begin() + 1);
        }
    }

当程序开始发生碰撞时,一切都停止了。我的问题是创建多个敌人的最佳方法是什么,因为我需要在游戏中生成和删除它们,而我仍在学习。 我不知道我的实现是否正确。我想知道我该怎么办?在这段代码中,我无法从这个向量中删除敌人。 我感谢每一条建议。

【问题讨论】:

    标签: c++ class vector sfml


    【解决方案1】:

    这个循环:

    for (unsigned i = 0; i < number; ++i) {
        if (enemies1[i]->rect.getGlobalBounds().intersects(sprite.getGlobalBounds())) 
            enemies1.erase(enemies1.begin() + 1);
    }
    

    是有缺陷的,因为当您调用erase 时,所有后续数组条目都会下移1,因此下一次循环您访问错误的元素。此外,你跑出了数组的末尾。

    相反,您可以使用erase / remove idiom

    enemies.erase (std::remove_if (enemies.begin(), enemies.end(),
        [sprite] (const std::unique_ptr <enemy> &e)
            { return e->rect.getGlobalBounds().intersects(sprite.getGlobalBounds()); }, enemies.end());
    

    【讨论】:

    • 或者std::erase_if,如果你有C++20
    • 感谢您的建议并花费您的时间。我现在将搜索那个擦除删除成语。
    • enemies1.erase(std::remove_if(enemies1.begin(),enemy1.end(), [sprite](const std::unique_ptr &e) { return e->rect. getGlobalBounds().intersects(sprite.getGlobalBounds()); }),敌人1.end());使用此代码,我得到相同的错误程序正在停止
    • 这可能有多种原因。您是否考虑过在调试器中单步执行?
    • game.exe 中 0x00007FF6F5F64EB0 处未处理的异常:0xC0000005:访问冲突读取位置 0x0000000000000188。它说
    【解决方案2】:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多