我目前正在使用带有Direct3D的C ++,并试图改变我的资产存储。
现在我的资产存储为“vector textureList”,并使用枚举定义获得。
我想通过使用STL map类使类更开放。但是,我以前从未使用过这门课,而且我遇到了一些我根本不理解的问题。
我刚刚做了一些非常简单的测试,目前有以下内容:
#include <d3d9.h>
#include <d3dx9.h>
#include <map>
#include <string>
#pragma comment (lib, "d3d9.lib")
#pragma comment (lib, "d3dx9.lib")
using namespace std;
class Assets
{
private:
typedef std::map<string, IDirect3DTexture9*> TexMap;
TexMap textureList;
public:
IDirect3DTexture9* LoadTexture(IDirect3DDevice9* pd3dDevice, LPCWSTR file, string key)
{
//load a texture from file
IDirect3DTexture9* tex;
//D3DXCreateTextureFromFile(pd3dDevice, file, &tex);
D3DXCreateTextureFromFileEx(pd3dDevice, file, 512, 512, 0, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0xFF000000, NULL, NULL, &tex);
//store the loaded texture to a vector array
textureList.insert(TexMap::value_type(key, tex));
return S_OK;
}
}
当我尝试运行此操作时,出现“Debug Assertion Failed”错误,表达式为“map / set iterators incompatible”
我只是觉得我已经在代码中将其设为简单,但仍然看不到类似示例中的错误。
我还将代码运行为:
#include <d3d9.h>
#include <d3dx9.h>
#include <map>
#include <string>
#pragma comment (lib, "d3d9.lib")
#pragma comment (lib, "d3dx9.lib")
using namespace std;
class Assets
{
private:
typedef std::map<int, int> TexMap;
TexMap textureList;
public:
IDirect3DTexture9* LoadTexture(IDirect3DDevice9* pd3dDevice, LPCWSTR file, string key)
{
//load a texture from file
IDirect3DTexture9* tex;
//D3DXCreateTextureFromFile(pd3dDevice, file, &tex);
D3DXCreateTextureFromFileEx(pd3dDevice, file, 512, 512, 0, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0xFF000000, NULL, NULL, &tex);
//store the loaded texture to a vector array
//textureList.push_back(tex);
textureList.insert(TexMap::value_type(3, 4));
return S_OK;
}
}
就这样它只是使用整数而我仍然得到同样的错误。
答案 0 :(得分:0)
错误实际上可能非常基本 - D3DXCreateTextureFromFileEx
希望为其最后一个参数键入IDirect3DTexture9*
,但您要为其指定类型IDirect3DTexture9**
。也就是说,改变
D3DXCreateTextureFromFileEx(..., &tex);
到
D3DXCreateTextureFromFileEx(..., tex);