2011-01-20 54 views
2

大家好,感谢您的关注。这是发布到here的原始问题的后续内容。Direct2D - 没有任何东西被绘制到屏幕上,我用C++处理数组的方式出错了。

我有一个基类,我正是如此定义:

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

我有一个继承这个类,两者是相似的两个班,所以我列出一个:

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

的DrawShape功能实现是这样的:

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

我要画椭圆和矩形t的随机数在屏幕上,所以我首先找出这些随机数,创建一个具有该大小的DrawableShape数组(因为我不能动态地在C++中分配对象),用子对象替换父对象,然后调用draw函数该阵列,随机再次。这是我的代码的样子:

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函数中调用数组的draw。请帮忙!!


编辑:好吧我有指针的形状工作,问题是数组的构造。所以我有这样的事情:

MyD2DRectangle rect1; 
    MyD2DEllipse ell1; 

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

这似乎自行工作。如何创建DrawableShape数组而不切片?

+1

如果您尝试避免切片,则无法创建MyShape数组,只有MyShape *。 – 2011-01-20 23:41:44

回答

4

shapesMyShape实例的数组。当您说shapes[i] = ellipse1;或​​时,您将丢失子类数据作为此作业的一部分,这在C++中被称为slicing

因此,shapes[i].DrawMyShape(m_pRenderTarget);的每次呼叫仅返回S_OK,如MyShape中所定义。

为了在C++中正确使用多态,您需要使用指针或对MyShape实例的引用(通常使用new分配)。如果你不允许这样做(做作业?),那么你需要找到一种没有多态性的方法。

+0

好的,切片是非常有意义的。现在,虽然我被允许使用指针,但我并不是很舒服。你能否建议句法示例/分享正确用法的一些链接?谢谢詹姆斯。 – Freakishly 2011-01-20 22:01:39

相关问题