2013-10-23 76 views
1

我試圖將所有紋理存儲在數組中。但圖像沒有得到返回它似乎這裏是我的代碼C++無法返回sf :: Texture

我假設我的loadTex和loadSpri函數將返回並將他們的數據存儲在我所做的數組中,但它似乎不是這樣工作,因爲當我運行遊戲他們不出現,只是空白。我的代碼可能很糟糕,但我很初學者還是並試圖獲得的東西

掛起這裏的render.cpp

#include "render.h" 



texandsprite render::textures[5]; 


sf::Texture loadTex(std::string); 
sf::Sprite loadSpri(sf::Texture); 

//Function to start the game 
void render::start() 
{ 


_mainWindow.create(sf::VideoMode(1024, 768, 32), "A New Life"); 

textures[1].tex = loadTex("civilian.png"); 
textures[1].spri = loadSpri(textures[1].tex); 
GameLoop(); 

} 



void render::GameLoop() 
{ 


sf::Event event; 

//Load(1, "civilian.png"); 
float x = 0; 
float y = 0; 

    while(_mainWindow.isOpen()) 
    { 

     while (_mainWindow.pollEvent(event)) 
     { 
      //Check the type of event 
      switch (event.type) 
      { 
        //window closed 
       case sf::Event::Closed: 
        _mainWindow.close(); 

        break; 

       case sf::Event::KeyPressed: 
        switch(event.key.code) 
        { 

         case sf::Keyboard::Up: 
          --y; 
          break; 

         case sf::Keyboard::Down: 
          y += 5; 
          break; 

         case sf::Keyboard::Right: 
          ++x; 
          break; 

         case sf::Keyboard::Left: 
          --x; 
          break; 
        } 



        break; 


       default: 

        break; 
      } 

     } 

    _mainWindow.clear(sf::Color::White); 

    //Draw everything here 
    //_mainWindow.draw(...); 
    textures[1].spri.setPosition(x,y); 

    _mainWindow.draw(textures[1].spri); 

    //End the current frame 
    _mainWindow.display(); 


    } 
} 
sf::RenderWindow render::_mainWindow; 

sf::Texture render::loadTex(std::string filename) 
{ 
sf::Texture temptex; 

if(!temptex.loadFromFile(filename)) 
{ 
    std::cout << "Error: could not load image" << filename << std::endl; 
} 
std::cout << filename << " Loaded" << std::endl; 


return temptex; 
} 

sf::Sprite render::loadSpri(sf::Texture temptex) 
{ 
sf::Sprite tempspri; 

tempspri.setTexture(temptex); 

return tempspri; 
} 

這裏的render.h

#ifndef RENDER_H_INCLUDED 
#define RENDER_H_INCLUDED 

#include "SFML/Window.hpp" 
#include "SFML/Graphics.hpp" 
#include <iostream> 
struct texandsprite 
{ 
    sf::Texture tex; 
    sf::Sprite spri; 
}; 


class render 
{ 
public: 
    static void start(); 
    //Here will go a list of all moving entities 
    static texandsprite textures[5]; 
    //Here will go a list of all nonmoving entities 
    //static 

private: 

    static void GameLoop(); 
    static void Rendering(); 
    static sf::Texture loadTex(std::string); 
    static sf::Sprite loadSpri(sf::Texture); 

    static sf::Texture texture; 
    static sf::Sprite sprite; 
    static sf::RenderWindow _mainWindow; 
}; 


#endif // RENDER_H_INCLUDED 

回答

3
sf::Sprite render::loadSpri(sf::Texture temptex) 
{ 
    sf::Sprite tempspri; 

    tempspri.setTexture(temptex); 

    return tempspri; 
} 

這與sf::Texture as class member doesn't work?非常相關。看看my answer there吧。

會發生什麼情況是您的精靈設置爲顯示temptex,但是此函數在函數返回時被銷燬,因爲它被按值傳遞給該函數。

您可以使用參考sf::Texture來解決此問題。


有關您的評論的更多詳情如下。我簡化了一些你的情況和代碼,以強調理解真正重要的東西。

像下面這樣產生一個紋理,如loadTexture()很好,因爲只有返回的副本可供用戶訪問 - 他不能設置精靈使用原始紋理,因此他不會遭受白方格綜合徵。

sf::Texture loadTexture(std::string name) 
{ 
    sf::Texture ret; 
    if (!ret.loadFromFile(name)) { doSomethingAboutIt(); } 
    return ret; 
} 

關於loadSprite()功能,您可以使用一個const裁判sf::Texture爲遵循,以防止任何副本,因此白方的問題。

sf::Sprite loadSprite(sf::Texture const& tex) 
{ 
    sf::Sprite ret(tex); 
    return ret; 
} 

但仍然有一個缺陷:你有你如何存儲由loadTexture()返回的質地要小心!這個紋理的生命週期應該和你的精靈的壽命一樣長。您的代碼上面(和下面的參考)應該工作然後:

void render::start() 
{ 
    _mainWindow.create(sf::VideoMode(1024, 768, 32), "A New Life"); 

    textures[1].tex = loadTexture("civilian.png"); 
    textures[1].spri = loadSprite(textures[1].tex); 
    GameLoop(); 
} 
+0

我知道白方的問題,我想我知道爲什麼發生了。是因爲當你在一個函數中創建紋理時,它只是在本地爲該函數創建的,所以當該函數結束時,分配給它的資源被釋放了嗎?這是正確的嗎?你能給我一個代碼示例,我不完全理解你會怎麼做呢?謝謝 – Joshua

+0

@Joshua是的,就是這樣。我已更新我的答案以回答您的評論。 ;-) – Hiura