【问题标题】:Removing Sprites from vector in sfml 2.1从 sfml 2.1 中的向量中删除精灵
【发布时间】:2014-07-26 14:03:19
【问题描述】:

我正在尝试从矢量中删除精灵,但无济于事,我不知道出了什么问题(VS 2010 与 SFML 2.1)。它根本无法编译。任何提示表示赞赏。

就是这一行,好像有问题:

SpriteVector.erase(std::remove(SpriteVector.begin(), SpriteVector.end(), SpriteIt), SpriteVector.end());

完整代码:

#include <SFML/Graphics.hpp>
#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
    sf::RenderWindow mMainWindow(sf::VideoMode(1200, 900), "Map");
    mMainWindow.setFramerateLimit(60);

    sf::RectangleShape rect;
    rect.setSize(sf::Vector2f(1500, 500));
    sf::Texture unittexture;
    unittexture.loadFromFile("sprite.png");

    std::vector<sf::Sprite> SpriteVector;
    std::vector<sf::Sprite>::iterator SpriteIt;

    while (mMainWindow.isOpen())
    {
        sf::Event event;
        while (mMainWindow.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
            {
                mMainWindow.close();
            }
            else if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::A)   
            {
                sf::Sprite newSprite;
                newSprite.setTexture(unittexture);
                newSprite.setPosition(mMainWindow.mapPixelToCoords(sf::Vector2i(sf::Mouse::getPosition(mMainWindow).x-50,sf::Mouse::getPosition(mMainWindow).y-50))); 
                SpriteVector.push_back(newSprite);
            }
            else if (event.type == sf::Event::MouseButtonPressed && event.mouseButton.button == sf::Mouse::Right)
                    {
                    //  sf::Vector2f mousecoords(mMainWindow.mapPixelToCoords(sf::Vector2i(event.mouseButton.x, event.mouseButton.y)));     
                    //  SpriteVector.remove_if([=](sf::Sprite newSprite){return newSprite.getGlobalBounds().contains(mousecoords); });     //example code that would work with a list

                        SpriteVector.erase(std::remove(SpriteVector.begin(), SpriteVector.end(), SpriteIt), SpriteVector.end());           // This doesn't work and I don't know why.
                    }
        }   
    mMainWindow.clear();
    mMainWindow.draw(rect);

        for(auto &SpriteIt = SpriteVector.begin();SpriteIt != SpriteVector.end();++SpriteIt)
        {
            mMainWindow.draw(*SpriteIt);
        }
        mMainWindow.display();


    }

    return 0;
}

错误日志:

bei Anpassung der Argumentliste '(sf::Sprite, const std::_Vector_iterator<_Myvec>)'
1>          with
1>          [
1>              _Myvec=std::_Vector_val<sf::Sprite,std::allocator<sf::Sprite>>
1>          ]
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm(1829): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "_FwdIt std::_Remove<sf::Sprite*,_Ty>(_FwdIt,_FwdIt,const _Ty &)".
1>          with
1>          [
1>              _FwdIt=sf::Sprite *,
1>              _Ty=std::_Vector_iterator<std::_Vector_val<sf::Sprite,std::allocator<sf::Sprite>>>
1>          ]
1>          c:\users\bogdan\documents\visual studio 2010\projects\spielkarte bev\sfmltest\main.cpp(40): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "_FwdIt std::remove<std::_Vector_iterator<_Myvec>,std::_Vector_iterator<_Myvec>>(_FwdIt,_FwdIt,const _Ty &)".
1>          with
1>          [
1>              _FwdIt=std::_Vector_iterator<std::_Vector_val<sf::Sprite,std::allocator<sf::Sprite>>>,
1>              _Myvec=std::_Vector_val<sf::Sprite,std::allocator<sf::Sprite>>,
1>              _Ty=std::_Vector_iterator<std::_Vector_val<sf::Sprite,std::allocator<sf::Sprite>>>
1>          ]

【问题讨论】:

  • 发布有关构建错误的问题时,请在问题中包含完整且未经编辑的错误日志。请编辑您的问题以包含它们,并指出错误在包含的来源中的位置。
  • 错误日志是外文的,晦涩难懂,比较长。我真的应该发布它吗?
  • 您可以暂时将语言更改为英语,构建以获取错误,然后再改回来。
  • 嗯,我认为这是不可能的,因为发行版是基于语言的,而我没有英文版。

标签: c++ sfml


【解决方案1】:

您将类型 SpriteIt 作为最后一个参数传递给 remove,而不是您要从容器中删除的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 2014-02-16
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多