2014-02-07 4 views
0

Я взял рабочий класс CSprite из моего старого проекта DirectX 11.0, который я построил с помощью Visual Studio 2010. Я немного изменил его, я извлек некоторые переменные, getter & setter и поместил его в новый класс с именем CObject. Теперь я хочу построить с Visual Studio 2012.DirectX 11 Нарушение доступа

Но теперь я получаю каждый раз, когда я пытаюсь создать объект CSprite с «Нарушение прав доступа» ошибка из Visual Studio:

Необработанное исключение при 0x010A74A8 в двигатель. exe: 0xC0000005: Доступ к определению места нарушения доступа 0x00000000.

Кажется, я не могу создать какой-либо объект интерфейса DirectX 11, и если я хочу прочитать объект Visual Studio, просто скажите «Невозможно прочитать память».

Исходник:

Object.h

#ifndef __OBJECT_H__ 
#define __OBJECT_H__ 

#include "../DX11Core/DX11Util.h" 

class CObject 
{ 
public: 
    CObject(); 
    ~CObject(){} 

    void SetStatus(STRING _status) { m_status = _status; } 
    void SetTag(STRING _tag)   { m_tag = _tag; } 
    void SetPosition(float _x, float _y, float _z) { SetPosition(XMFLOAT3(_x, _y, _z)); } 
    void SetPosition(XMFLOAT3 _pos) { m_position = _pos; } 
    void SetRotation(float _rot)  { m_fRotation = _rot; } 
    void SetScale(float _x, float _y) { SetScale(XMFLOAT3(_x, _y, 1)); } 
    void SetScale(XMFLOAT3 _scale) { m_scale = _scale; } 
    void SetAlpha(float _alpha)  { m_fAlpha = Clamp(_alpha, 0.0f, 1.0f); } 
    void SetActive(bool _active)  { m_bActive = _active; } 

    XMFLOAT3& GetPosition()   { return m_position; } 
    STRING  GetStatus()    { return m_status; } 
    STRING  GetTag()    { return m_tag; } 
    float  GetXPosition()   { return m_position.x; } 
    float  GetYPosition()   { return m_position.y; } 
    float  GetZPosition()   { return m_position.z; } 
    float  GetRotation()   { return m_fRotation; } 
    XMFLOAT3& GetScale()    { return m_scale; } 
    float  GetXScale()    { return m_scale.x; } 
    float  GetYScale()    { return m_scale.y; } 
    bool  IsActive()    { return m_bActive; } 

protected: 
    XMFLOAT3 m_position; 
    STRING  m_tag; 
    STRING  m_status; 
    float  m_fRotation; 
    XMFLOAT3 m_scale; 
    float  m_fAlpha; 
    bool  m_bActive; 
}; 

#endif // __OBJECT_H__ 

Sprite.h

#ifndef __SPRITE_H__ 
#define __SPRITE_H__ 

#include "Object.h" 
#include "../DX11Core/DX11Core.h" 
#include "../DX11Core/GraphicHelper.h" 

struct Vertex 
{ 
    XMFLOAT3 Pos; 
    XMFLOAT2 Tex; 
}; 

class CSprite : public CObject 
{ 
public: 
    CSprite(STRING _filename); 
    ~CSprite() 
    { 
     RELEASE_COM(m_pVertices); 
     RELEASE_COM(m_pTextureSampler); 
     RELEASE_COM(m_pTextureSRV); 
    } 

    int Initialize(); 
    int Update(const float _dt); 
    void Render(); 

#pragma region Getter & Setter 

    void SetTexture(STRING _filename); 
    void SetFrameCount(int _framecount) { m_nFrameCount = _framecount; } 
    void SetFrame(int _frameidx) 
    { 
     if(_frameidx >= 0 && _frameidx < m_nFrameCount) 
     { 
      m_nActualFrame = _frameidx; 
     } 
     BuildVertices(); 
    } 
    void SetPosition(XMFLOAT3& _pos) 
    { 
     m_position = _pos; 
     m_position.x -= (theDXCore->GetClientWidth()/2); 
     m_position.y *= -1.0f; 
     m_position.y += (theDXCore->GetClientHeight()/2); 
    } 

    float  GetLeftBounding() const { return (m_position.x + m_fBoundingLeft); } 
    float  GetRightBounding() const { return (m_position.x + m_fBoundingRight); } 
    float  GetTopBounding() const { return (m_position.y + m_fBoundingTop); } 
    float  GetBottomBounding() const { return (m_position.y + m_fBoundingBottom); } 
    int   GetFrameIdx() const { return m_nActualFrame; } 
    XMMATRIX GetWorldMatrix() const; 
    Vertex  GetVertex(int _i) const { return tempVertex[_i]; } 

#pragma endregion 

private: 
    void BuildVertices(); 

    int   m_nFrameCount; 
    int   m_nActualFrame; 
    float  m_fFrameDT; 
    float  m_fActualFrameDT; 

    float  m_fBoundingLeft; 
    float  m_fBoundingRight; 
    float  m_fBoundingTop; 
    float  m_fBoundingBottom; 

    Vertex tempVertex[6]; 

    ID3D11Buffer*       m_pVertices; 
    ID3D11ShaderResourceView*    m_pTextureSRV; 
    ID3D11SamplerState*      m_pTextureSampler; 
    ID3DX11EffectMatrixVariable*   m_pFXWorld; 
    ID3DX11EffectShaderResourceVariable* m_pFXTexture; 
    ID3DX11EffectSamplerVariable*   m_pFXTextureSampler; 
}; 

#endif //__SPRITE_H__ 

Sprite.cpp | У меня есть два комментарий вставлен, где начинаются проблемы

#include "Sprite.h" 
#include "SpriteManager.h" 

CSprite::CSprite(STRING _filename) 
    : m_nFrameCount(1) 
    , m_nActualFrame(0) 
    , m_pTextureSRV(00) 
    , m_pTextureSampler(00) 
    , m_pVertices(00) 
    , m_pFXWorld(00) 
    , m_pFXTexture(00) 
    , m_pFXTextureSampler(00) 
    , m_fFrameDT(1000.0f) 
    , m_fActualFrameDT(0.0f) 
{ 
    GraphicHelper::CreateSRV(m_pTextureSRV, _filename); // can't create ID3D11ShaderResourceView 

    this->Initialize(); 
} 

int CSprite::Initialize() 
{ 
    D3D11_SAMPLER_DESC samplerDesc = {}; 
    samplerDesc.AddressU = samplerDesc.AddressV = samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; 
    samplerDesc.ComparisonFunc = D3D11_COMPARISON_NEVER; 
    samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; 
    // samplerDesc.Filter = D3D11_FILTER_ANISOTROPIC; 
    // samplerDesc.MaxAnisotropy = 4; 
    samplerDesc.MaxLOD = D3D11_FLOAT32_MAX; 
    HR(theDevice->CreateSamplerState(&samplerDesc, &m_pTextureSampler)); 

    BuildVertices(); 

    D3D11_SAMPLER_DESC colorMapDesc = {}; 
    colorMapDesc.AddressU = colorMapDesc.AddressV = colorMapDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; 
    colorMapDesc.ComparisonFunc = D3D11_COMPARISON_NEVER; 
    colorMapDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; 
    // colorMapDesc.Filter = D3D11_FILTER_ANISOTROPIC; 
    // colorMapDesc.MaxAnisotropy = 4; 
    colorMapDesc.MaxLOD = D3D11_FLOAT32_MAX; 
    HR(theDevice->CreateSamplerState(&colorMapDesc, &m_pTextureSampler)); 

    m_pFXWorld   = theSpriteManager->GetFX()->GetVariableByName("gWorld")->AsMatrix(); 
    m_pFXTexture  = theSpriteManager->GetFX()->GetVariableByName("gTexture")->AsShaderResource(); 
    m_pFXTextureSampler = theSpriteManager->GetFX()->GetVariableByName("gTextureSampler")->AsSampler(); 

    return 0; 
} 

void CSprite::SetTexture(STRING _filename) 
{ 
    GraphicHelper::CreateSRV(m_pTextureSRV, _filename); 
} 

XMMATRIX CSprite::GetWorldMatrix() const 
{ 
    XMMATRIX translation = XMMatrixTranslation(m_position.x, m_position.y, m_position.z); 
    XMMATRIX rotationZ = XMMatrixRotationZ(m_fRotation); 
    XMMATRIX scale = XMMatrixScaling(m_scale.x, m_scale.y, 1.0f); 

    return scale * rotationZ * translation; 
} 

void CSprite::BuildVertices() 
{ 
    RELEASE_COM(m_pVertices); 

    ID3D11Resource* pcolorTex = 00; 
    m_pTextureSRV->GetResource(&pcolorTex); //throw access violation 

    D3D11_TEXTURE2D_DESC colorTexDesc = {}; 
    (reinterpret_cast<ID3D11Texture2D*>(pcolorTex))->GetDesc(&colorTexDesc); 
    pcolorTex->Release(); 

    colorTexDesc.Width /= m_nFrameCount; 
    // Calculate corners for uneven boundings 
    float left = -(float)(int)(colorTexDesc.Width * 0.5f); 
    float right = (float)((int)(colorTexDesc.Width * 0.5f)); 
    if(colorTexDesc.Width % 2 == 1) right += 1.0f; 
    m_fBoundingLeft = left; 
    m_fBoundingRight = right; 

    float top = (float)(int)(colorTexDesc.Height * 0.5f); 
    float bottom = -(float)(int)(colorTexDesc.Height * 0.5f); 
    if(colorTexDesc.Height % 2 == 1) bottom -= 1.0f; 
    m_fBoundingTop = top; 
    m_fBoundingBottom = bottom; 

    float FrameWidth = 1.0f/m_nFrameCount; 
    // Create Vertexbuffer 

    Vertex vertices[] = 
    { 
     { XMFLOAT3(right, top, 1.0f), XMFLOAT2(FrameWidth * (m_nActualFrame + 1), 0.0f) }, 
     { XMFLOAT3(right, bottom, 1.0f), XMFLOAT2(FrameWidth * (m_nActualFrame + 1), 1.0f) }, 
     { XMFLOAT3(left, bottom, 1.0f), XMFLOAT2(FrameWidth * (m_nActualFrame ), 1.0f) }, 

     { XMFLOAT3(left, bottom, 1.0f), XMFLOAT2(FrameWidth * (m_nActualFrame ), 1.0f) }, 
     { XMFLOAT3(left, top, 1.0f),  XMFLOAT2(FrameWidth * (m_nActualFrame ), 0.0f) }, 
     { XMFLOAT3(right, top, 1.0f), XMFLOAT2(FrameWidth * (m_nActualFrame + 1), 0.0f) }, 
    }; 

    D3D11_BUFFER_DESC vdesc = {}; 
    vdesc.Usage = D3D11_USAGE_IMMUTABLE; 
    vdesc.ByteWidth = sizeof(Vertex) * ARRAYSIZE(vertices); 
    vdesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; 
    D3D11_SUBRESOURCE_DATA vdata = {}; 
    vdata.pSysMem = vertices; 
    HR(theDevice->CreateBuffer(&vdesc, &vdata, &m_pVertices)); 

    memcpy(&tempVertex, vertices, sizeof(vertices)); 
} 

int CSprite::Update(const float _dt) 
{ 
    m_fActualFrameDT -= _dt; 
    if(m_fActualFrameDT < 0.0f) 
    { 
     m_fActualFrameDT = m_fFrameDT; 

     int i = m_nActualFrame + 1; 
     if(i >= m_nFrameCount) i = 0; 

     SetFrame(i); 
    } 

    return ERROR_SUCCESS; 
} 

void CSprite::Render() 
{ 
    UINT stride = sizeof(Vertex); 
    UINT offset = 0; 
    theContext->IASetVertexBuffers(0, 1, &m_pVertices, &stride, &offset); 
    XMMATRIX world = GetWorldMatrix(); 
    m_pFXWorld->SetMatrix(reinterpret_cast<float*>(&world)); 
    m_pFXTexture->SetResource(m_pTextureSRV); 
    m_pFXTextureSampler->SetSampler(0, m_pTextureSampler); 

    D3DX11_TECHNIQUE_DESC techDesc = {}; 
    theSpriteManager->GetFXTech()->GetDesc(&techDesc); 

    for(UINT p = 0; p < techDesc.Passes; ++p) 
    { 
     theSpriteManager->GetFXTech()->GetPassByIndex(p)->Apply(0, theContext); 

     theContext->Draw(6, 0); 
    } 
} 
+0

Вы пытались его отладить? Вы должны быть в состоянии найти линию с VS – Matt

+0

Я теперь, где строка, но я не могу создать какой-либо объект интерфейса DX ... – BlackArma

+0

Вам не удалось изменить что-то еще? Сравните с рабочей версией в той системе управления версиями, которую вы используете. Если вы не используете его, никогда не поздно начать. – molbdnilo

ответ

1

Вероятно, вы получите это исключение, потому что ваш m_pTextureSRV является NULL, попробуйте следующее:

if (m_pTextureSRV != NULL) 
{ 
    ID3D11Resource* pcolorTex = 00; 
    m_pTextureSRV->GetResource(&pcolorTex); // put a break point here 
} 

во время работы, если точка останова остановит выполнение будет означает, что я ошибаюсь, но если это не значит, что я прав, и вы не инициализировали m_pTexture правильно!