2012-12-03 201 views
1

有一個問題,當我試圖在繪製循環中繪製精靈時,它不會繪製 在這個類的構造函數中,我設置了精靈。在繪製循環中繪製精靈

構造我:

texture.loadFromFile("img1.png"); 
sprite.setTexture(texture); 

精靈和質感是在頭文件

我做了一些實驗,如果我在抽籤循環它的工作原理使用texture.loadFromFile();。 但是我不得不每秒重新載入60次圖片。

void PlayerReceiver::draw(sf::RenderWindow & rw){ 
     //texture.loadFromFile("mario.png"); 

     //std::cout<<texture.getSize().y<<std::endl; 

      rw.draw(sprite); 

    } 

謝謝你的回答。

+0

有一個這樣的網頁:http://www.sfml-dev.org/tutorials/1.4/graphics-sprite.php我的猜測是你每次銷燬對象,因此需要重新加載,因爲內存不會'不存在了 – Caribou

+2

我palantir告訴我要麼'spirte'或'紋理'在本地定義 – 2012-12-03 15:23:09

+0

問題是它不會畫循環(但我不明白爲什麼它應該工作),如果我把這個只是在我的主要海峽,它工作正常。 很好的答案謝謝你們生病了試試 –

回答

1

有一個問題,當我試圖繪製一個精靈在繪製循環它不會繪製在這個類的構造函數我設置精靈。

從我對這個問題的理解中,您想要在構造函數中加載紋理和精靈,並且當您嘗試從繪製循環中繪製它時它不工作。

我有一個程序,它在構造函數中加載紋理,它運行良好,所以我想象的是錯誤的(我不確定,因爲我沒有看到上面的帖子中有六行程序)是紋理和精靈對象沒有在類級別上定義。

下面是我使用一個紋理對象我的頭文件:

class GraphPaper 
{ 
    public: 
     GraphPaper(); 
     ~GraphPaper(); 
     bool isObjectLoaded(); 
     sf::Sprite getSprite(); 

    private: 
     void load(std::string filename); 
     bool isLoaded; 

     sf::Texture texture; 
     sf::Sprite sprite; 

     const std::string file = "images/Graph-Paper.png"; 
}; 

質地和精靈對象都列在一個類範圍的級別作爲私有成員,並通過getter方法進行訪問。

下面是該類別(改變了一下,更好地滿足你想要做的事情)構造函數:

#include "GraphPaper.h" 

GraphPaper::GraphPaper() //: isLoaded(false) 
{ 
    if (texture.loadFromFile(file) == false) 
     isLoaded = false; 
    else 
    { 
     texture.setRepeated(true); 
     sprite.setTexture(texture); 
     isLoaded = true; 
    } 
    //load(file); 
    assert(isObjectLoaded()); 
} 

此我簡單地畫我的「GraphPaper」對象之後。

mainWindow.draw(paper.getSprite()); 

我已經有權訪問它,因爲我在我的MainWindow頭文件中定義了一個名爲「paper」的「GraphPaper」對象。

#pragma once 
#include "GraphPaper.h" 
#include "stdafx.h" 

class MainWindow 
{ 
    public: 
     void close(); 
     void start(); 
     void moveCamera(sf::Event); 

    private: 
     bool leftMousePressed, rightMousePressed, isExiting; 
     int r, g, b, mouseX, mouseY; 

     GraphPaper paper; 

     const sf::Color white = sf::Color(255, 255, 255); 

     sf::RenderWindow mainWindow; 
     sf::View view; 
}; 

假設這是你想要做的,那麼你的問題可能在頭文件中。任何在類級上定義的對象,一旦加載,在類本身被銷燬之前不會被銷燬。也許你需要確保你沒有銷燬構造函數所在的類的引用。例如,如果您在循環內創建類的實例,那麼循環結束類對象的時刻將被銷燬。

+0

Annnnd,jsut意識到這就像3歲。好吧。 – Acejhm

+0

但這是一個很好的答案,可能會幫助別人,所以不是完全浪費! – Mogsdad

0

只是一個假設:你在你的construtor有這樣的:

PlayerReceiver::PlayerReceiver() 
{ 
    sf::Texture texture; 
    texture.loadFromFile("img1.png"); 
    sprite.setTexture(texture); 
} 

這樣紋理對象被銷燬的構造結束之後。 spritetexture都必須是該類的成員,以便在玩家本身被銷燬之前不會被銷燬。

如果這不是你的問題,那麼請發佈更多的代碼。