【问题标题】:SFML Vector of sprites and Sprite Collision Error精灵的 SFML 向量和精灵碰撞错误
【发布时间】:2023-03-19 14:09:01
【问题描述】:

我正在使用 C++ 和 SFML 制作游戏,但我遇到了一个严重的问题。 我想要做的是,当我的玩家(又名人类角色)与一个项目发生碰撞时,只有那个项目应该被删除。例如,当玩家与 'chicken' 项目碰撞时,只有 'chicken' 项目应该被删除,而不是其他项目。 但是,当我运行我的程序时,当玩家与“鸡”项目发生碰撞时,其他项目都会被删除。我不知道为什么。我真的需要你的帮助。尽管我的英语很差,但感谢您的阅读!

这是我的代码:

     #include <SFML/Graphics.hpp>
     ...
     using namespace std;
     using namespace sf;
     ...

     int main () {
     ...

     //item Sprites

     Texture bombTex;
     bombTex.loadFromFile("images/bomb.png");
     Sprite bomb;
     ...
     Texture bomb2Tex;
     bomb2Tex.loadFromFile("images/bomb_2.png");
     Sprite bomb_2;
     ...
     Texture cakeTex;
     cakeTex.loadFromFile("images/cake.png");
     Sprite cake;
     ...
     Texture coffeeTex;
     coffeeTex.loadFromFile("images/coffee.png");
     Sprite coffee;
     ...
    Texture chickenTex;
    chickenTex.loadFromFile("images/chicken.png");
    Sprite chicken;
    ...
    Texture pizzaTex;
    pizzaTex.loadFromFile("images/pizza.png");
    Sprite pizza;

    //item array (I made an item array to display & render various items in the game screen.)
    Sprite item[10];
    item[0] = bomb;
    item[1] = coffee;
    item[2] = bomb_2;
    item[3] = chicken;
    item[4] = pizza;

    std::vector<Sprite> items;
    items.push_back(Sprite(item[4]));

    ...

   while (window.isOpen())
  {   ...
      ...
    for (size_t i = 0; i < items.size(); i++)
    {
        if (humanArr[index].getGlobalBounds().intersects(item[i].getGlobalBounds())) 
        //humanArr[index] is a player Sprite.
        {
            ...
            items.erase(items.begin());
        }
     }
    ...
   window.clear();
    ...
   for (size_t i = 0; i < items.size(); i++)
        {
            window.draw(item[i]);
        }

    ...
   window.display();
   }
   return 0;
}

【问题讨论】:

    标签: c++ sfml


    【解决方案1】:
        for (size_t i = 0; i < items.size(); i++)
        {
            // first problem: you are accessing item[i] instead of items[i]
            if (humanArr[index].getGlobalBounds().intersects(item[i].getGlobalBounds())) 
            {
                ...
                items.erase(items.begin()); // <---------- second problem is here
            }
         }
    

    您不是在擦除正在迭代的项目,而是在擦除第一个项目。您还访问了错误的数组。我建议更改 item 的名称以避免将来发生这种情况。以下是您解决此问题的方法:

        // Pull human bounds out of the loop so that we dont' access them each
        // iteration.
        const humanBounds = humanArr[index];
        for (auto iter = items.begin(); iter != items.end();)
        {
            if (humanBounds.intersects(iter->getGlobalBounds()))
            {
                iter = items.erase(iter); 
            }
            else
            {
                ++iter;
            }
        }
    

    更多信息请参见std::vector::erase

    【讨论】:

    • 感谢您的回答!我真的很感激。但是,现在它在第一个碰撞项目上运行良好,我的意思是,第一个项目在与玩家碰撞时很好地擦除,但它不适用于后续项目。准确地说,即使与玩家发生碰撞,以下项目也不会被删除。此外,它会导致最后一个代码出现异常错误:'for (size_t i = 0; i
    猜你喜欢
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多