0

我正在用 C++/DirectX 创建游戏,但遇到了存储精灵的问题。目前我可以创建一个精灵,然后将它存储在一个矢量中,为一个精灵执行此操作非常有效。但是,当我插入另一个精灵时,前一个精灵的纹理属性会被删除。我将包括一些断点的屏幕截图和一些代码。

我怀疑的问题是对象没有被放入向量中,而是依赖于用于创建精灵的临时对象。以下是一些截图:

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;
};
4

3 回答 3

2

您正在创建 d2Sprite 的副本,而 LPDIRECT3DTEXTURE9 似乎是一个指针......

spritesList.push_back(*tempSprite);

为什么要使用 new 创建 d2Sprite,然后将它们复制到向量中,您可能应该有一个

vector<d2Sprite*> spritesList;

并将指针复制到向量

spritesList.push_back(tempSprite);

然后当您不再需要它们时,对向量中的项目调用 delete 。

于 2013-05-08T17:02:47.980 回答
0

这只是一个猜测,因为没有足够的代码可以确定。这是我认为正在发生的事情:

d2Sprite 没有复制构造函数,并且向量包含 d2Sprite 对象,而不是指针。当临时对象 tempSprite 添加到向量中时,它被复制,因此原始指针 LPDIRECT3DTEXTURE9 被逐位复制。

我在这里猜测您正在删除或覆盖临时对象 tempSprite。当临时被删除或覆盖时,向量中的 d2Sprite 现在有一个指向已释放内存的 LPDIRECT3DTEXTURE9。这将导致纹理丢失。请注意,它可能会一直正确显示,直到内存被覆盖,通常是在下一次内存分配完成时。当创建下一个 d2Sprite 时,将分配内存,并且您的(已经释放的)DIRECT3DTEXTURE9 对象可能会在那时被覆盖。

一般来说,如果使用 RAII,尤其是诸如 boost::shared_ptr 或(在 C++ 11 中)std::shared_ptr 之类的智能指针,则可以避免此类问题。如果使用得当,RAII 会处理这些类型的分配内存寿命问题。如果没有 RAII,必须跟踪所有已分配资源的生命周期。

于 2013-05-08T18:01:30.643 回答
0

没有看到 的完整定义d2Sprite,我只能猜测纹理属性受到影响的原因是d2Sprite没有正确的复制构造函数,或者根本没有复制构造函数,并且默认的复制构造函数由编译器没有正确地复制纹理属性。

当您将对象插入 STL 容器时,它实际上插入了对象的副本,而不是对象本身。如果您不想要副本,请考虑使容器保存指向对象的指针(以便仅复制指针本身,而不是对象)。

于 2013-05-08T17:04:20.403 回答