标题描述了一切,我正在尝试做一个基于磁贴的引擎,但我无法继续,因为我无法找到纹理超出范围的位置。
谢谢。
我的代码:
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);
}
答案 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::Texture
,sf::Texture
将指向原始sf::Sprite