DirectX9でvector,listに格納されたクラスの描画関数を実行したいのですが、実行されません。vectorに格納せず、変数で描画をすると上手くいきます。
格納はpush_back関数を使っています。この原因が分かりません。どうかご教授お願いします。
以下にコードを示します。コードではvectorのポインタになっていますが、ポインタでなくとも結果は同じでした。
/* 描画されるコード。 Field_Objectクラスは、描画する実体を持つクラス。Draw関数で描画。 Squareクラスは、四角形を線で描画するField_Objectの派生クラス。 Squareクラスを生成しているのは、vector,listに格納されたクラスが描画されないことを示すため。 */ LPDIRECT3DDEVICE9 pD3DDevice; void Update_Draw(vector<Field_Object>* obj) { if (pD3DDevice == 0) { cout << "描画失敗"; return; } Square* square = new Square(D3DPT_LINESTRIP, D3DXVECTOR3(1.f, 1.f, 1.f), D3DXCOLOR(0.f, 0.f, 1.f, 0.4f), 1.f); Square* squarea = new Square(D3DPT_LINESTRIP, D3DXVECTOR3(2.f, 2.f, 1.f), D3DXCOLOR(0.f, 0.f, 1.f, 0.4f), 1.f); vector<Field_Object>::iterator itr = (*obj).begin(); if (FAILED(pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET | // バックバッファを指定 D3DCLEAR_ZBUFFER, // 深度バッファ(Zバッファ)を指定 D3DCOLOR_XRGB(0, 0, 0), // クリアする色 1.0f, 0))) { } if (SUCCEEDED(pD3DDevice->BeginScene())) { //描画開始。バックバッファに書き込み while (itr!=(*obj).end()) { itr->Draw(); //描画されない。 itr++; } square->Draw(); //描画される。 squarea->Draw(); pD3DDevice -> EndScene(); if (FAILED(pD3DDevice->Present(0,0,0,0))) { // 描画結果(バックバッファ)の転送 pD3DDevice->Reset(&D3DPP); // デバイス消失から復帰 } delete(square); delete(squarea); } }
/* 描画されないコード。 Field_Objectクラスは、描画する実体を持つクラス。Draw関数で描画。 Squareクラスは、四角形を線で描画するField_Objectの派生クラス。 Squareクラスを生成しているのは、vector,listに格納されたクラスが描画されないことを示すため。 */ LPDIRECT3DDEVICE9 pD3DDevice; void Update_Draw(vector<Field_Object>* obj) { if (pD3DDevice == 0) { cout << "描画失敗"; return; } Square* square = new Square(D3DPT_LINESTRIP, D3DXVECTOR3(1.f, 1.f, 1.f), D3DXCOLOR(0.f, 0.f, 1.f, 0.4f), 1.f); Square* squarea = new Square(D3DPT_LINESTRIP, D3DXVECTOR3(2.f, 2.f, 1.f), D3DXCOLOR(0.f, 0.f, 1.f, 0.4f), 1.f); (*obj).push_back(*square); (*obj).push_back(*squarea); vector<Field_Object>::iterator itr = (*obj).begin(); if (FAILED(pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET | // バックバッファを指定 D3DCLEAR_ZBUFFER, // 深度バッファ(Zバッファ)を指定 D3DCOLOR_XRGB(0, 0, 0), // クリアする色 1.0f, 0))) { } if (SUCCEEDED(pD3DDevice->BeginScene())) { //描画開始。バックバッファに書き込み while (itr!=(*obj).end()) { itr->Draw(); //描画されない itr++; } pD3DDevice -> EndScene(); if (FAILED(pD3DDevice->Present(0,0,0,0))) { // 描画結果(バックバッファ)の転送 pD3DDevice->Reset(&D3DPP); // デバイス消失から復帰 } delete(square); delete(squarea); } }
/* Square,Shapeクラスの定義 Square<-Shape<-Field_Objectの親子関係 */ Squareクラス Square::Square(D3DPRIMITIVETYPE shape_style, D3DXVECTOR3 location, D3DXCOLOR RGB,float size):pVB(0),Shape(shape_style,location.x,location.y,0.f) { shape = shape_style; if (pD3DDevice == 0) { cout << "pD3DDeviceの確保ミス。Squareで発生。"; } if (FAILED(pD3DDevice->CreateVertexBuffer(5 * sizeof(SHAPE_VERTEX), D3DUSAGE_WRITEONLY, SHAPE_VERTEX_FVF, D3DPOOL_MANAGED, &pVB,NULL)) ) { cout << "Squareの確保ミス"; } SHAPE_VERTEX* vertex; pVB->Lock(0, 0, (void**)&vertex, 0); vertex[0].p= D3DXVECTOR3(location.x-(size/2), location.y + (size / 2), 0.f); vertex[1].p = D3DXVECTOR3(location.x + (size / 2), location.y + (size / 2), 0.f); vertex[2].p = D3DXVECTOR3(location.x + (size / 2), location.y - (size / 2), 0.f); vertex[3].p = D3DXVECTOR3(location.x - (size / 2), location.y - (size / 2), 0.f); vertex[4].p = vertex[0].p; vertex[0].color = vertex[1].color = vertex[2].color = vertex[3].color = vertex[4].color = RGB; pVB->Unlock(); pD3DDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE); pD3DDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE); pD3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); //掛け算 return; }; void Square::Update() { } void Square::Draw() { if (pVB == 0) { cout << "ない。Squareで発生。"; } pD3DDevice->SetStreamSource(0, pVB, 0, sizeof(SHAPE_VERTEX)); pD3DDevice->SetFVF(SHAPE_VERTEX_FVF); pD3DDevice->DrawPrimitive(D3DPT_LINESTRIP, 0, 4); } -------------------------------------------------------------------- Shaepクラス Shape::Shape(D3DPRIMITIVETYPE shape_style, float x, float y, float depth):Field_Object(x,y,depth){ shape = shape_style; }
//Square,Shapeクラスの宣言 class Shape:public Field_Object{ public: Shape(D3DPRIMITIVETYPE shape_style, float x, float y, float depth); D3DPRIMITIVETYPE shape; }; class Square:public Shape { public: Square(D3DPRIMITIVETYPE shape_style, D3DXVECTOR3 location,D3DXCOLOR RGB,float size); HRESULT Create(D3DPRIMITIVETYPE shape_style, float x, float y, float depth, float size); void Update() override; void Draw() override; private: int Squares; LPDIRECT3DVERTEXBUFFER9 pVB; }; struct SHAPE_VERTEX { D3DXVECTOR3 p; // 位置 DWORD color; // 色 };
回答1件
あなたの回答
tips
プレビュー