direct2d-画面に描かれているものは何もありません。C++で配列を処理する方法で何か問題があります

StackOverflow https://stackoverflow.com/questions/4752514

質問

みなさん、こんにちは。見てくれてありがとう。これは投稿された元の質問へのフォローアップです ここ.

このように定義する基本クラスがあります。

class DrawableShape
{
public:
    virtual HRESULT DrawShape(ID2D1HwndRenderTarget* m_pRenderTarget)
    {
        return S_OK;
    }
};

このクラスを拡張する2つのクラスがありますが、どちらも似ているので、1つをリストしています。

class MyD2DEllipse : public DrawableShape
{
private:
    D2D1_ELLIPSE data;
public:
    MyD2DEllipse();
    HRESULT DrawShape(ID2D1HwndRenderTarget* m_pRenderTarget);
};

ドローシェイプ関数は次のように実装されています。

HRESULT MyD2DEllipse::DrawShape(ID2D1HwndRenderTarget* m_pRenderTarget)
{
    HRESULT hr = E_FAIL;
    ID2D1SolidColorBrush* m_pBrush;
    hr = m_pRenderTarget->CreateSolidColorBrush(
                D2D1::ColorF(D2D1::ColorF::OrangeRed),
                &m_pBrush
                );
    m_pRenderTarget->DrawEllipse(&data, m_pBrush, 10.f);
    return hr;
}

ランダムな数の楕円と長方形を画面に描画したいので、最初にそれらの乱数を見つけ、そのサイズのドロワーシェープの配列を作成します(C ++でオブジェクトを動的に割り当てることができないため)、親オブジェクトを置き換えますチャイルドはオブジェクトを行い、次にアレイ上の描画関数を呼び出して、再びランダムに呼び出します。これが私のコードのように見えるものです:

    HRESULT Demo::OnRender()
    {
        HRESULT hr = S_OK;
        hr = CreateDeviceResources();

        if (SUCCEEDED(hr))
        {
            m_pRenderTarget->BeginDraw();
            m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());
            m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));

            // Decide on # of primitives
        randEllipse = 1 + (rand() % 5);
        randRectangle = 1 + (rand() % 5);
        totalPrimitives = randEllipse + randRectangle;

        DrawableShape *shapes;
        shapes = new MyShape[totalPrimitives];

        for (int i=0; i<randEllipse; i++)
        {
            MyEllipse ellipse1;
            shapes[i] = ellipse1;
        }
        for (int i=randEllipse; i<(randEllipse + randRectangle); i++)
        {
            MyRectangle rect1;
            shapes[i] = rect1;
        }

        for (int i=0; i<totalPrimitives; i++)
        {
            hr = shapes[i].DrawMyShape(m_pRenderTarget);
        }
        hr = m_pRenderTarget->EndDraw();
    }
}

それはうまくいったはずですが、そうではありません。また、これを書き留めた後、何らかのinit関数で配列を作成し、onRender関数の配列に描画を呼び出す方が良いことに気付きます。助けてください!!


編集:さて、ポインターで動作する形状があります。問題はアレイの構築です。だから私はこのようなものを持っています:

    MyD2DRectangle rect1;
    MyD2DEllipse ell1;

    DrawableShape *shape1 = &rect1;
    DrawableShape *shape2 = &ell1;
    shape1->DrawShape(m_pRenderTarget);
    shape2->DrawShape(m_pRenderTarget);

それはそれ自体がうまくいくようです。スライスせずにドロッブシェイプの配列を作成するにはどうすればよいですか?

役に立ちましたか?

解決

shapes の配列です MyShape インスタンス。あなたが言う時 shapes[i] = ellipse1; また shapes[i] = rect1;, 、この割り当ての一部としてサブクラスデータを失っています。 スライス C ++で。

そのため、各呼び出し shapes[i].DrawMyShape(m_pRenderTarget); ただ戻っています S_OK で定義されています MyShape.

C ++で多型を適切に使用するには、ポインターまたは参照を使用する必要があります MyShape インスタンス(通常は使用して割り当てられます new)。これを許可されていない場合(宿題?)、多型なしでこれを行う方法を見つける必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top