2015-09-13 45 views
0

tl/dr:我已經將類內部的函數調用移動到類外部,並且函數停止工作。從外部調用封裝類成員函數時不加載SFML紋理

我已經跑到最困難的一年左右的問題,我一直在使用C++。我找不到任何東西來解釋這裏發生的事情,但說實話,我甚至很難制定一個SEO問題。

這裏基本操作相當簡單,

  1. 創建SF ::紋理和SF :: Sprite對象
  2. 加載紋理到SF :: Texture對象SF的
  3. 組紋理::雪碧紋理對象
  4. 顯示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。但在這兩種情況下,我都會收到紋理加載的消息。

回答

0

假設你實際渲染d_backgrounds,我認爲的錯誤是在這裏:

Loading_Screen::Loading_Screen(GameEngine *engine) 
{ 
    GameObject temp(engine, ObjectType::BACKGROUND); 
    d_backgrounds.push_back(temp); 
    temp.addtexture("textures//MenuBackGround.png"); 
} 

您正在創建一個GameObject對象。然後將的副本插入到容器中,並且稍後您嘗試的addtexture與插入的對象不同。

試試這個:

Loading_Screen::Loading_Screen(GameEngine *engine) 
{ 
    GameObject temp(engine, ObjectType::BACKGROUND); 
    temp.addtexture("textures//MenuBackGround.png"); 
    d_backgrounds.push_back(temp); 
} 

看着SFML API,TextureSprite同時擁有正確的拷貝構造函數,所以它應該是罰款這種方式。

+0

沒有沒有工作,同時我自己在玩弄它,並試圖讓d_backgrounds成爲一個指針向量,這可悲的是沒有解決問題。就像我說過的,我必須改變從工作到不工作的唯一變化就是addtexture函數從哪裏調用,在兩種情況下渲染都是相同的。 –

+0

無論如何這是錯誤的。您正在傳遞對象的副本,但未初始化紋理。當試圖使用指針時,你是否添加了這樣的對象? GameObject * tmp = new GameObject(...); temp-> addtexture(...); d_backgrounds.push_back(temp);我目前並沒有使用SFML api,但可能有些東西與精靈和紋理混爲一談,它們都是對象和複製構造函數。 – alesegdia

+0

我通過改變sf :: Texture和sf :: Sprite來固定它,使其被GameObject保持爲指針,從而消除處理GameObject時可能發生的任何複製。謝謝你的時間。 –

相關問題