tl/dr:我已經將類內部的函數調用移動到類外部,並且函數停止工作。從外部調用封裝類成員函數時不加載SFML紋理
我已經跑到最困難的一年左右的問題,我一直在使用C++。我找不到任何東西來解釋這裏發生的事情,但說實話,我甚至很難制定一個SEO問題。
這裏基本操作相當簡單,
- 創建SF ::紋理和SF :: Sprite對象
- 加載紋理到SF :: Texture對象SF的
- 組紋理::雪碧紋理對象
- 顯示SF ::雪碧
所有4個步驟去內的一個功能很好,但因爲我的目標是構建遊戲引擎我開始將它封裝到更大的類中。
我創建了一個GameEngine類並讓它處理第4步。經過一些更正後,這個過程很順利。
然後我創建了一個GameObject類來處理前三個步驟,我只需要做一個'用戶'的框架就是創建對象並告訴它渲染,這也起作用。
然後,當我將第2步的函數調用從對象的構造函數移動到對象的外部時,我遇到了一個障礙。
舊版本: class GameObject { ObjectType d_type; GameEngine * d_engine;
sf::Texture d_texture;
sf::Sprite d_sprite;
bool isactive;
public:
GameObject(GameEngine *engine, ObjectType type);
void addtexture(std::string textpath);
void render();
和
GameObject::GameObject(GameEngine *engine, ObjectType type)
:
d_type(type),
d_engine(engine),
d_texture(),
d_sprite(),
isactive{false}
{
addtexture("textures//MenuBackGround.png"); //<- problematic line
d_sprite.setTexture(d_texture);
}
void GameObject::addtexture(std::string textpath)
{
if(!d_texture.loadFromFile(textpath))
{
cout << "couldn't load texture in\n";
} else
{
cout << "did load texture\n";
}
}
這個作品,我看到紋理我在窗口中創建apear。如果我現在創建一個類Loadingscreen:
class Loading_Screen : public Base_State
{
std::vector<GameObject> d_backgrounds;
public:
Loading_Screen(GameEngine *engine);
virtual ~Loading_Screen();
與實施:
Loading_Screen::Loading_Screen(GameEngine *engine)
{
GameObject temp(engine, ObjectType::BACKGROUND);
d_backgrounds.push_back(temp);
temp.addtexture("textures//MenuBackGround.png");
}
我只看到一個blackscreen。但在這兩種情況下,我都會收到紋理加載的消息。
沒有沒有工作,同時我自己在玩弄它,並試圖讓d_backgrounds成爲一個指針向量,這可悲的是沒有解決問題。就像我說過的,我必須改變從工作到不工作的唯一變化就是addtexture函數從哪裏調用,在兩種情況下渲染都是相同的。 –
無論如何這是錯誤的。您正在傳遞對象的副本,但未初始化紋理。當試圖使用指針時,你是否添加了這樣的對象? GameObject * tmp = new GameObject(...); temp-> addtexture(...); d_backgrounds.push_back(temp);我目前並沒有使用SFML api,但可能有些東西與精靈和紋理混爲一談,它們都是對象和複製構造函數。 – alesegdia
我通過改變sf :: Texture和sf :: Sprite來固定它,使其被GameObject保持爲指針,從而消除處理GameObject時可能發生的任何複製。謝謝你的時間。 –