"simple" 2-D-Schrift
-
Ich habe ein Problem: Ich kriege es nicht hin, simple Schrift auf meinen Bildschirm zu zaubern. Wenn es nur ein Compilerfehler wäre, kein Problem! Was mich aber verwirrt, ist, dass mein Problem sich in einem Laufzeitfehler "Zugriffsverletzung Leseposition 0x000000000" äußert. Ein kleiner Textauszug:
d3dfont.cpp //dürfte der ein oder andere kennen
...
HRESULT CD3DFont::DrawText( FLOAT sx, FLOAT sy, DWORD dwColor, TCHAR* strText, DWORD dwFlags ) { ... // Setup renderstate m_pd3dDevice->CaptureStateBlock( m_dwSavedStateBlock ); m_pd3dDevice->ApplyStateBlock( m_dwDrawTextStateBlock ); m_pd3dDevice->SetVertexShader( D3DFVF_FONT2DVERTEX ); m_pd3dDevice->SetStreamSource( 0, m_pVB, sizeof(FONT2DVERTEX) ); ... // Fill vertex buffer FONT2DVERTEX* pVertices = NULL; DWORD dwNumTriangles = 0; m_pVB->Lock( 0, 0, (BYTE**)&pVertices, D3DLOCK_DISCARD ); //hier ist der Fehler ... }Hmmm komisch dachte ich mir, eigentlich sollte ein in einem Programmierbuch veröffentlichter Quellcode doch fehlerfrei sein... Aber die Adresse 0x0000000 scheint auf der anderen Seite mit pVertices übereinzustimmen -> leigt der Fehler also wirklich hier und nicht etwa in meinem Code (nachfolgend):
HRESULT engine::init(HWND hWnd) { ... D3DDISPLAYMODE d3ddm; D3DDEVTYPE devtype; D3DCAPS8 caps; d3d = Direct3DCreate8( D3D_SDK_VERSION); if ( ! d3d) return (! S_OK); if( hr = d3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm) <0) return hr; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.Windowed = FALSE; d3dpp.BackBufferWidth = (UINT)bildbreite; d3dpp.BackBufferHeight = (UINT)bildhoehe; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.EnableAutoDepthStencil = TRUE; d3dpp.AutoDepthStencilFormat = D3DFMT_D16; d3dpp.BackBufferFormat = d3ddm.Format; if(d3d->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps) < 0) {devtype = D3DDEVTYPE_REF;} else {devtype = D3DDEVTYPE_HAL;} if(d3d->CreateDevice(D3DADAPTER_DEFAULT,devtype,main_window, D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&device) < 0) return (! S_OK); main_font->InitDeviceObjects(device); return S_OK; } void engine::BltText(DWORD x, DWORD y, D3DCOLOR color, char* text, ...) { va_list prm; char buffer[256]; va_start( prm, text); vsprintf(buffer,text,prm); va_end(prm); main_font->DrawText((FLOAT)x,(FLOAT)y,color,buffer); }Also: Wo ist der Fehler??? Ich kann ihn nicht finden, wenn ich davon ausgehe, dass d3dfont.cpp keine Fehler enthält. Wenn dem allerdings doch so ist, fehlt es mir an Kenntnis, ihn zu beheben.
-
// Fill vertex buffer FONT2DVERTEX* pVertices = NULL; DWORD dwNumTriangles = 0; m_pVB->Lock( 0, 0, (BYTE**)&pVertices, D3DLOCK_DISCARD ); //hier ist der Fehlerschau halt in die Doku was Lock für Parameter erwartet - wahrscheinich muss pVertices auf Vertexdaten verweisen...
-
außerdem solltest du vielleicht erst mal ein Buch zu C++ lesen, bevor du mit D3D rumspielst
-
OK, das mit der Adresse, die mit pVertices übereinstimmt, nehme ich zurück - offensichtlich hatte ich übersehen, dass pVertices nicht NULL, sondern doch ein Speicherplatz war.
Ach ja: Ich kann sehr wohl eine Doku benutzen und habe es auch getan, bevor ich den Beitrag hier geschrieben habe. Und zu den Büchern : reichen Zwei?
-
wenn du zwei Bücher zum Thema C++ gelesen hast, warum bist du dann unfähig erhauszufinden wo versucht wird einen NULL Zeiger zu dereferenzieren?
-
Okay, diese Noobigkeit nehm ich auf mich

Ich hab das Problem jetzt gelöst.