【问题标题】:C++ SFML returning all sprites from mapC++ SFML 从地图返回所有精灵
【发布时间】:2016-07-30 16:02:51
【问题描述】:

目前我的代码有问题。我什么都试过了。 image is here 我希望有一个人可以帮助我 :)。顺便说一句,我是 C++ 新手

【问题讨论】:

  • 给this看看
  • 你能告诉我我的代码有什么问题吗?
  • 您正在迭代 sprites.comp_value,它是地图中精灵的比较函数,在这种情况下没有意义。我建议尝试:for (auto sprite : sprites) 它将遍历键。然后您可以使用sprite.second 访问这些值。这是假设您使用的是 STL 地图容器。
  • @Petar Putar Visnjic 您能否将您的代码作为文本添加到您的问题中,这样它会立即可见并且可以搜索。另外,请说明问题所在。
  • @PeterG。从标题来看,OP 正在尝试获取一个集合(此处为 vector),其中包含其 sprites 集合中的所有精灵,这似乎是一个集合或地图。

标签: c++ visual-studio sfml


【解决方案1】:

for each 不是有效的 C++;从 C++11 开始,正确的表达式是 for (<type> <variable> : <collection>)

在这里,您还尝试通过sprites.value_comp 访问元素集合,这是一个函数,在这里没有意义。

假设sprites 是一个std::set 容器,您可以这样迭代它:

for (auto sprite : sprites) {
    // sprite is the value you're looking for
}

如果您改用std::map,请使用相同的循环,但sprite 不会包含您的sf::Sprite,而是它的密钥,您需要使用sprite.second 来访问精灵。

请注意,auto 关键字让编译器确定变量的类型。

如果您的编译器不支持 C++11,则需要执行以下操作:

std::set<sf::Sprite>::iterator it;
for (it = sprites.begin(); it != sprites.end(); ++it)
{
    // Access each sprite using *it (the star is necessary here)
}

std::map:

// Replace "keyType" with the type of the keys, such as int or std::string
std::map<keyType, sf::Sprite>::iterator it;    for (it = sprites.begin(); it != sprites.end(); ++it)
{
    // Access each sprite using it->second
}

但是,如果您只是想将 std::set 转换为 std::vector,则有更简单的方法:

std::vector <sf::Sprite> sprites_c2;
std::copy(sprites.begin(), sprites.end(), std::back_inserter(sprites_c2));

对于std::map,没有任何单行版本,因此您必须如上所述使用循环进行迭代。

【讨论】:

  • 请注意,还有一种更简单的方法,假设您只是想将std::set 转换为std::vector:只需创建一个空向量并添加std::copy(sprites.begin(), sprites.end(), std::back_inserter(sprites_c2));
【解决方案2】:
#include <SFML\Graphics.hpp>

std::map<std::string, sf::Sprite> sprites;

void addSprite(std::string sprite_name, sf::Texture sprite_texture) {

    sf::Sprite sprite;

    sprite.setTexture(sprite_texture);

    sprites[sprite_name] = sprite;

}

sf::Sprite getSprite(std::string sprite_name) {

    return sprites[sprite_name];
}

std::vector<sf::Sprite> getSprites() {

    std::vector<sf::Sprite> sprites_c2;

    for each (sf::Sprite sprite in sprites.value_comp) {

        sprites_c2.emplace_back(sprite);

    }

    return sprites_c2;
}

【讨论】:

  • 下次您可能想编辑您的原始帖子;本部分适用于试图回答您问题的人。
猜你喜欢
  • 2019-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-19
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多