0

C++/DirectX でゲームを作成していますが、スプライトの保存で問題が発生しました。現在、スプライトを作成してベクターに保存できます。これを 1 つのスプライトに対して行うと、完全に機能します。しかし、別のスプライトを挿入しようとすると、前のスプライトのテクスチャ プロパティが削除されます。ブレークポイントのスクリーンショットとコードをいくつか含めます。

私が疑う問題は、オブジェクトがベクターに配置されておらず、スプライトの作成に使用される一時オブジェクトに依存していることです。ここにいくつかのスクリーンショットがあります:

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

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 に答える