質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

Q&A

解決済

1回答

1362閲覧

DirectX9で、vector,listの要素を描画しない

gRivXOzYyYyDl1W

総合スコア19

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

0グッド

0クリップ

投稿2020/03/31 04:28

編集2020/03/31 05:33

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; // 色 };

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki23

2020/03/31 05:21

Squareクラスの定義を書いてください。おそらくそこに原因があると思われます
gRivXOzYyYyDl1W

2020/03/31 05:26

ご回答ありがとうございます。 修正します。
guest

回答1

0

ベストアンサー

SquareはField_Objectの派生型なので、Field_Object型の変数に代入するとSquareクラスであったという情報を失ってしまいます。なので、Square::Draw()を呼ぶことはできなくなります。当然、vector<Field_Object>もだめです。
対応策としては、例えばvector<Field_Object*>に変えてください。

投稿2020/03/31 07:06

yuki23

総合スコア1448

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gRivXOzYyYyDl1W

2020/03/31 07:46

ありがとうございます。 解決できました。 非常に勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問