首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sprite和Sprite碰撞错误的SFML向量

Sprite和Sprite碰撞错误的SFML向量
EN

Stack Overflow用户
提问于 2020-08-20 00:19:29
回答 1查看 90关注 0票数 1

我正在用C++和SFML做一个游戏,我有一个严重的问题。我想做的是,当我的玩家(也就是人类特征)与一个项目发生冲突,则只应擦除该项目。例如,当玩家与“鸡”项目发生冲突时,只有“鸡”项目应该被删除,而不是其他项目。然而,当我运行我的程序时,当播放器与“鸡”项发生冲突时,其他项都会被删除。我也不知道为什么。我真的需要你的帮助。尽管我的英语很差,但还是要感谢你的阅读!

下面是我的代码:

代码语言:javascript
复制
     #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;
}
EN

回答 1

Stack Overflow用户

发布于 2020-08-20 00:32:16

代码语言:javascript
复制
    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的名称,以避免将来出现这种情况。下面是你解决这个问题的方法:

代码语言:javascript
复制
    // 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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63491138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档