2013-05-08 112 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,必须跟踪所有分配的资源的生命周期。