2016-04-30 83 views
0

どこにエラーがあるのか​​わかりません。私はYouTubeでビデオエンジンを書く方法を学ぶためにビデオシリーズを見ていました。私は最高のコーダーではないことを認めますが(私は実際に学習経験としてこのプロジェクトを始めました)、それはおそらく私がこのエラーを見つけることができない理由です私はグラフィックス部分を少なくとも10回は見直しましたが、まだ問題が見つかっていません。誰かがこれを見つけて、どこに、なぜこれが起こっているのかを私に説明するのを助けることができますか?例外がスローされました:読み取りアクセス違反。 this-> m_pRenderTargetはnullptrでした。 C++

graphics.h 
#ifndef _Graphics_H 
#define _Graphics_H 
//C run time header files 

//ADDITIONAL INCLUDES 
#include "System.h" 

//#ifndef _Logger_H 
// #include "Logger.h" 
//#endif 

#ifndef _2DUTILL_H 
    #include "d2dutill.h" 
#endif 

//forward declrations 
class Window; 


//struct 
struct GraphicsData :public SystemData 
{ 
public: 
    GraphicsData(Window* wnd = nullptr); 
    Window* pWnd; 
}; 
class Graphics : public System 
{ 
    friend class Engine; 
public: 
    HRESULT OnResize(UINT width, UINT height); 
    ID2D1HwndRenderTarget* GetRenderTarget()   { return m_pRenderTarget; } 
    IWICImagingFactory* GetImageFactory()    { return m_pImageFactory; } 
    ID2D1SolidColorBrush* GetColorBrush()    { return m_pColorBrush; } 
    ID2D1Factory* GetD2DFactory()      { return m_pD2DFactory; } 

protected: 
    Graphics(const GraphicsData& data); 
    virtual ~Graphics(); 
    Graphics(const Graphics& other); 
    Graphics& operator = (const Graphics& tref); 
    bool initialize(); 
    bool ShutDown(); 
private: 
// void* operator new(size_t size); 
// void operator delete(void* pdelete); 

    HRESULT CreateDeviceIndependentResorces(); 
    HRESULT CreateDeviceDependentResorces(); 

    void BeginDraw(); 
    HRESULT EndDraw(); 
    void DiscardDeviceResorces(); 
    //members 
    ID2D1HwndRenderTarget* m_pRenderTarget; 
    IWICImagingFactory* m_pImageFactory; 
    ID2D1SolidColorBrush* m_pColorBrush; 
    ID2D1Factory* m_pD2DFactory; 

    Window* m_pWindow; 
}; 
#endif 

いくつかのことは、私がテストをしたいのですが、まだ実装されていません。

Graphics.cpp

include "Graphics.h" 
#include "Window.h" 
#ifndef _DeleteMacros_H 
    #include "DeleteMacros.h" 
#endif 

GraphicsData::GraphicsData(Window* wnd) 
    : 
    SystemData(SystemType::Sys_Graphics), 
    pWnd(wnd) 
    {} 



Graphics::Graphics(const GraphicsData& data) 
    : 
    System(data), 
    m_pRenderTarget(nullptr), 
    m_pD2DFactory(nullptr), 
    m_pColorBrush(nullptr), 
    m_pImageFactory(nullptr), 
    m_pWindow(data.pWnd) 
{} 

//void Graphics::operator new(size_T size) 
//{ 
// return MEMORYMANAGER->alloc(size); 
//} 
//void Graphics::operator delete(void* pDelete) 
//{ 
// MEMORYMANAGER->free(pDelete); 
//} 



Graphics::~Graphics() 
{} 

HRESULT Graphics::OnResize(UINT width, UINT height) 
{ 
    //this method can fail and is safe to ignore the warning 
    //error will be returned until the end draw method is called again 

    if (m_pRenderTarget) 
    return m_pRenderTarget->Resize(D2D1::SizeU(width, height)); 
    else return S_FALSE; 
} 

bool Graphics::initialize() 
{ 
    System::Initialize(); 
    HRESULT hr = CreateDeviceIndependentResorces(); 
    if (FAILED(hr)) 
     return false; 
    hr = CreateDeviceDependentResorces(); 
    if (FAILED(hr)) 
     return false; 

// Logger::log(_T("initializing Graphics Complete"),LOGTYPE_INFO, false); 

    return true; 
} 

bool Graphics::ShutDown() 
{ 
    System::ShutDown(); 

    SafeRelease(m_pD2DFactory); 
    SafeRelease(m_pColorBrush); 
    SafeRelease(m_pImageFactory); 
    SafeRelease(m_pRenderTarget); 
    return true; 

} 

HRESULT Graphics::CreateDeviceIndependentResorces() 
{ 
    HRESULT hr = S_OK; 
// create Direct2D factory 
    hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &m_pD2DFactory); 
    hr = CoCreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_IWICImagingFactory, (LPVOID*)&m_pImageFactory); 

    return hr; 
} 

HRESULT Graphics::CreateDeviceDependentResorces() 
{ 
    HRESULT hr = S_OK; 
    if (m_pRenderTarget==nullptr) 
    { 
     //get window handel 
     HWND hWnd = m_pWindow->GetWindowHandle(); 

     RECT rc; 
     GetClientRect(hWnd, &rc); 
     D2D1_SIZE_U size = D2D1::SizeU(rc.right - rc.left, rc.bottom - rc.top); 

     // create direct2d render target 
     hr = m_pD2DFactory->CreateHwndRenderTarget(D2D1::RenderTargetProperties(), D2D1::HwndRenderTargetProperties(hWnd, size), &m_pRenderTarget); 
     if (FAILED(hr)) 
      return hr; 

     //create a brush 
     hr = m_pRenderTarget->CreateSolidColorBrush((D2D1::ColorF) D2D1::ColorF::Black, &m_pColorBrush); 
     if (FAILED(hr)) 
      return hr; 
    } 
    return hr; 
} 


void Graphics::DiscardDeviceResorces() 
{ 
    SafeRelease(m_pRenderTarget); 
} 

void Graphics::BeginDraw() 
{ 

     m_pRenderTarget->BeginDraw(); 
     m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White)); 
} 

HRESULT Graphics::EndDraw() 
{ 
    return m_pRenderTarget->EndDraw(); 

} 

例外がm_pRenderTarget->BeginDraw();

+0

例外はm_pRenderTarget-> BeginDraにスローされていますw(); – autojoe

+0

CreateDeviceDependentResources()は失敗を示すエラーコードを返しますか? Initializeはfalseを返しますか? m_pD2DFactory-> CreateHwndRenderTargetの呼び出しでは、m_pRenderTargetがnullのままであるために失敗する必要があります。その戻りコードは何ですか? –

+0

レンダリングターゲットを作成するコードを入力したことがない – autojoe

答えて

0

1でスローされます)あなたが実際に何か(例えばを指すように、あなたのメンバ変数を設定して、あなたのコンストラクタを変更します。オブジェクトを生きる)

2)スマートポインタ(例:std::unique_ptr<>)にメンバポインタをラップします

関連する問題