Direct2D - Nulla è in corso di elaborazione sullo schermo, qualcosa di sbagliato nel modo in cui sto gestire gli array in C ++

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

Domanda

Ciao a tutti e grazie per guardare. Si tratta di un follow-up alla domanda originale postato qui .

Ho una classe base che io definisco così:

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

Ho due classi che estendono questa classe, entrambi sono simili, quindi sto messa in vendita di uno:

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

La funzione DrawShape è implementata in questo modo:

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

voglio richiamare un numero casuale di ellissi e rettangoli allo schermo, in modo da prima trovare quei numeri casuali, creare un array di DrawableShape con quelle dimensioni (dato che non posso allocare oggetti in modo dinamico in C ++), sostituire il oggetti genitore con gli oggetti figlio, e quindi chiamare la funzione di disegno sulla matrice, in modo casuale di nuovo. Ecco cosa il mio aspetto codice come:

    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();
    }
}

Questo dovrebbe aver funzionato, ma non è così. Inoltre, dopo aver scritto questo, mi rendo conto che sto meglio creare l'array in una sorta di funzione init, e chiamando il pareggio sulla matrice nella funzione OnRender. Si prega di aiuto !!


EDIT: Okay devo le forme di lavoro con i puntatori, il problema è la costruzione della matrice. Così ho qualcosa di simile:

    MyD2DRectangle rect1;
    MyD2DEllipse ell1;

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

che sembra funzionare da sola. Come posso creare la serie di DrawableShape senza affettare?

È stato utile?

Soluzione

shapes è un array di istanze MyShape. Quando si dice shapes[i] = ellipse1; o shapes[i] = rect1;, si stanno perdendo i dati delle sottoclassi come parte di questo incarico, che è conosciuto come affettare in C ++.

In quanto tale, ogni chiamata a shapes[i].DrawMyShape(m_pRenderTarget); è solo tornando S_OK come definito nella MyShape.

Al fine di utilizzare correttamente il polimorfismo in C ++, è necessario utilizzare puntatori o riferimenti alle istanze MyShape (di solito assegnati utilizzando new). Se non ti è permesso di fare questo (compiti a casa?), Allora avete bisogno di trovare un modo per farlo senza il polimorfismo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top