2013-05-08 36 views
0

我在C++/DirectX中創建了一個遊戲,並且遇到了存儲子畫面的問題。目前,我可以創建一個精靈,然後將它存儲在一個矢量中,這對於一個精靈來說是完美的。但是,當我插入另一個精靈時,之前精靈的紋理屬性被刪除。我將包含一些屏幕截圖以及一些代碼。將類存儲在向量中C++

我懷疑的問題是對象沒有放入向量中,而是依賴於用於創建精靈的臨時對象。下面是一些截圖:

https://www.dropbox.com/s/g5xdlaqf35w6q57/1.png

https://www.dropbox.com/s/xmcyv611nqc27xc/2.png

而且一些代碼:

// d2World.h 
class d2World 
{ 
public: 
    // Some functions 
    vector<d2Sprite> spritesList; 
    // More stuff 

private: 
    d2Sprite *tempSprite; 
    // Other private variables 
}; 

// d2World.h 
// Some other functions 

// A new object is created by re-assigning it 
tempSprite = new d2Sprite(); 

// When a the sprite is completed, add it to the vector 
spritesList.push_back(*tempSprite); 

// More stuff here 

我不明白的是爲什麼它只是受着紋理財產?

感謝您的幫助。

編輯: 下面是d2Sprite類的頭代碼:

class d2Sprite 
{ 
public: 
    d2Sprite(void); 
    ~d2Sprite(void); 
    void Load(LPDIRECT3DTEXTURE9 tex); 
    void Position(int x, int y); 

    int x, y, frame, frameW, frameH, columns; 
    float Rotation; 

    D3DXVECTOR3 GetPosition(); 

    D3DXVECTOR2 Scale; 
    D3DXVECTOR2 Center; 
    D3DXVECTOR2 Translation; 

    LPDIRECT3DTEXTURE9 texture; 

    D3DCOLOR colour; 
}; 
+0

'd2Sprite'的定義是什麼?你能把它壓縮成一個能證明問題的小例子嗎? – 2013-05-08 16:53:13

+0

這裏是d2Sprite類:'類d2Sprite \t { \t公共: \t \t d2Sprite(無效); \t \t〜d2Sprite(void); \t \t void Load(LPDIRECT3DTEXTURE9 tex); \t \t void Position(int x,int y); \t \t INT的x,y,框架,框架原理,frameH,列; \t \t浮動旋轉; \t \t \t \t D3DXVECTOR3爲getPosition(); \t \t D3DXVECTOR2量表; \t \t D3DXVECTOR2 Center; \t \t D3DXVECTOR2翻譯; \t \t LPDIRECT3DTEXTURE9質感; \t \t D3DCOLOR color; \t};'這是你在做什麼? – Antony 2013-05-08 16:54:49

+0

請通過編輯您的問題添加額外的代碼,代碼在評論中無法閱讀。 – 2013-05-08 16:57:03

回答

2

您正在創建d2Sprite的副本,並LPDIRECT3DTEXTURE9似乎是一個指針......

spritesList.push_back(*tempSprite); 

爲什麼你用新的創建d2Sprite,然後將它們複製到矢量,你可能應該有一個

vector<d2Sprite*> spritesList; 

和指針複製到矢量

spritesList.push_back(tempSprite); 

然後調用刪除向量中的項目時,你不需要他們了。

+0

OMG IT WORKS !!!!非常感謝你。如果我住在葡萄牙,我會給你買一隻熊!我花了幾個小時試圖讓它工作,但它很簡單。 :) – Antony 2013-05-08 17:52:41

+0

@OnlyAntony,:) – 2013-05-09 09:32:02

0

沒有看到d2Sprite的完整定義,我只能猜測紋理屬性受到影響的原因是d2Sprite要麼沒有正確的拷貝構造函數,要麼根本沒有拷貝構造函數,以及編譯器提供的默認拷貝構造函數不正確地複製texture屬性。

將對象插入到STL容器中時,它實際上會插入對象的副本,而不是對象本身。如果你不想要副本,考慮讓容器保持指向對象的指針(這樣只有指針本身被複制,而不是對象)。

+0

謝謝你的回答。 – Antony 2013-05-08 17:52:59

0

這只是一個猜測,因爲沒有足夠的代碼顯示知道肯定。這是我認爲正在發生的事情:

d2Sprite沒有拷貝構造函數,矢量包含d2Sprite對象,而不是指針。當臨時對象tempSprite被添加到向量中時,它被複制,所以原始指針LPDIRECT3DTEXTURE9被逐位複製。

我在這裏猜測你正在刪除或覆蓋臨時對象tempSprite。當臨時被刪除或覆蓋時,矢量中的d2Sprite現在有一個指向釋放內存的LPDIRECT3DTEXTURE9。這會導致紋理丟失。請注意,它可能會一直顯示正確,直到內存被覆蓋,通常在下一次內存分配完成時。當創建下一個d2Sprite時,將分配內存,並且您的(已釋放的)DIRECT3DTEXTURE9對象可能會在此時被覆蓋。

一般來說,像這樣的問題,可如果使用RAII,特別是智能指針一樣的boost :: shared_ptr的或(在C++ 11)的std :: shared_ptr的避免。正確使用時,RAII會處理這些分配的內存使用期限問題。沒有RAII,必須跟蹤所有分配的資源的生命週期。