由于超出范围,SFML / C ++ Sprite被显示为白色框,不知道在哪里

时间:2015-08-28 00:24:22

标签: c++ scope sfml

标题描述了一切,我正在尝试做一个基于磁贴的引擎,但我无法继续,因为我无法找到纹理超出范围的位置。

谢谢。

我的代码:

ImageManager.h

#pragma once

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

class ImageManager{
    std::vector<sf::Texture> textureList;
public:

    void AddTexture(sf::Texture);
    sf::Texture getIndex(int index) const;
};

ImageManager.cpp

#include "imageManager.h"

void ImageManager::AddTexture(sf::Texture texture){
    textureList.push_back(texture);
}

sf::Texture ImageManager::getIndex(int index) const{
    return textureList[index];
}

Tile.h

#pragma once

#include <SFML/Graphics.hpp>
#include <memory>

class Tile{
    sf::Sprite sprite;

public:
    Tile(sf::Texture texture);

    void draw(int x, int y, sf::RenderWindow* rw);
};

Tile.cpp

#include "Tile.h"

Tile::Tile(sf::Texture texture){
    sprite.setTexture(texture);
}

void Tile::draw(int x, int y, sf::RenderWindow* rw){
    sprite.setPosition(x, y);
    rw->draw(sprite);
}

2 个答案:

答案 0 :(得分:1)

您的构造函数将原始纹理的副本作为参数,该纹理在作用域的末尾处死亡。改为使用(const)引用。

此外,ImageManager会在其矢量调整大小时复制纹理,因此所有精灵都会丢失纹理。使用std::vector<std::shared_ptr<sf::Texture>>或使用Thor的资源管理器(或实际上任何其他好的库)。

答案 1 :(得分:1)

为未来读者添加Hiura的答案,重要的是要记住y只是指向sf::Sprite的指针以及一些绘图信息。如果sf::Texture a sf::Texture指向被销毁,则sf::Sprite不再具有要使用的纹理信息。正如Hiura所说,sf::Sprite的构造函数复制了传递给它的Tile,将sf::Texture指向副本,然后销毁副本,使sf::Sprite没有{sf::Sprite 1}}。通过将引用传递给sf::Texturesf::Texture将指向原始sf::Sprite