스프라이트를 유지하기 위해 LPD3DXSPRITE를 사용하여 스프라이트 클래스를 만들었습니다. 벡터에서 사용하기 전까지는 환상적입니다. 이 문제는 벡터가 복사본을 만들고 다른 스프라이트를 삭제할 때 발생합니다. 그렇게되면, 소멸자를 호출하는데,이 소멸자는 LPD3DXSPRITE 객체의 해제를 요구합니다. 이 개체가 파괴되면 복사본에서 더 이상 호출 할 수 없으며 메모리 오류가 발생합니다.C++ Direct X 스프라이트 클래스, 벡터 문제
어떻게이 문제를 해결할 수 있습니까? 원본을 가리키는 포인터가있는 솔루션을 생각하고 포인터를 가리 키지 않으면 포인터가 null이되어 소멸자가 스프라이트를 죽여야한다는 것을 나타내지 만 비트가 미친 것처럼 보입니다.
다음 코드 중 일부를 포함했습니다. 또한 나는 여전히 C++ (나는 직업에 의한 C# 프로그래머이다.)를 배우고 있기 때문에 만약 당신이 미쳐있는 것을 보았다면 나를 떠나지 않고 알려주 길 바란다. 내가 전화를 어디에
Sprite.h
#ifndef SPRITE_H
#define SPRITE_H
#include <d3dx9.h>
//
class Sprite
{
private:
LPD3DXSPRITE sprite;
Sprite.cpp 여기
#include "sprite.h"
// Copy constructor
Sprite::Sprite(Sprite &_copy)
{
center = _copy.center;
color = _copy.color;
matrix = _copy.matrix;
position = _copy.position;
rotation = _copy.rotation;
scale = _copy.scale;
sourceRect = _copy.sourceRect;
sprite = _copy.sprite;
texture = _copy.texture;
}
// Full constructor which fully initializes the sprite.
Sprite::Sprite(LPDIRECT3DDEVICE9 _device, LPDIRECT3DTEXTURE9 _texture)
{
Initialize(_device,_texture);
}
Sprite::~Sprite()
{
sprite->Release();
}
// Initializes values and creates the sprite
void Sprite::Initialize(LPDIRECT3DDEVICE9 _device, LPDIRECT3DTEXTURE9 _texture)
{
Initialize();
// Set our variables
texture = _texture;
// If we don't succeed throw an error so we know things
// got ****ed up somehow
if (!SUCCEEDED(D3DXCreateSprite(_device, &sprite)))
{
throw("Sprite creation failed");
}
SetCenter();
SetSourceRect();
}
// Sets initial values for the sprite
void Sprite::Initialize()
{
// Sets variable to default
}
이다.
Testground.h
#ifndef TESTGROUND_H
#define TESTGROUND_H
#include "Console.h"
#include "Log.h"
#include "sprite.h"
#include <string>
#include "Animation.h"
#include <map>
#include <vector>
class TestGround
{
private:
std::vector<Sprite> sprites;
그리고 여기가 Testground.cpp
Testground.cpp
#include "TestGround.h"
TestGround::TestGround(LPDIRECT3DDEVICE9 _device)
{
sprites.emplace_back(_device, tBank["TestTexture"]);
질문을 편집하고 문제와 관련없는 모든 코드를 제거하십시오. 이것은 코드 리뷰를위한 장소가 아닙니다 :) – MichaelHouse
실제 코드가 없으므로 지난 번에 소리를 지르므로 여기에 적절한 절차가 무엇인지 확실하지 않습니다. 나는 단지 올바른 절차가 무엇인지는 옳지 않다. –
문제를 재현하는 데 필요한 최소한의 코드 만 있으면됩니다. 코드가 컴파일되기 때문에 인큐베이터 등이 올바른지 알 수 있다고 생각할 수 있습니다. – MichaelHouse