从Cinder中的另一个类绘制到画布

时间:2012-09-03 16:44:51

标签: oop opengl cinder

有没有一种方法可以使用libcinder进行绘制而无需将所有代码放在主类的draw()方法上。我正在开发一个大型应用程序,将所有内容都塞进一个文件中并不方便。

这是一个想法的例子:

class MyApp : public AppBasic {
  public:
    void setup ();
    void update ();
    void draw ();
  private:
    vector<MyObject> myObjects;
};

MyApp::draw () {
  for (int i = 0; i < myObjects.size(); ++i) {
    myObjects[i].render ();
  }
}

CINDER_APP_BASIC (MyApp, RendererGL)

/* ------------------ */

class MyObject {

  public:
    void render ();

};

void MyObject::render () {
  Rectf rect (0, 0, 20, 20);
  gl::drawSolidRoundedRect(rect, 15.0);
}

1 个答案:

答案 0 :(得分:2)

是的,有办法。实际上有几种方法。

  1. 至少使用以下方法创建一个类:void setup()void update()void draw()。然后,您可以在主应用程序中创建此类的实例,将它们存储在成员变量或std::vector中。然后,只需分别从主应用程序的setupupdatedraw方法调用方法。
  2. 使用Cinder的事件系统连接到updatedraw个事件。请参阅ListenerBasic示例:https://github.com/cinder/Cinder/tree/master/samples/ListenerBasic。有关所有可用事件的列表,请参阅:https://github.com/cinder/Cinder/blob/master/include/cinder/app/Window.h
  3. 编写或使用处理绘制所有对象的场景图系统。它将以正确的顺序调用每个对象的draw()方法,可以将对象放在其他对象之上,可以检测光标下的对象等。众所周知的场景图是http://www.openscenegraph.org/ ,但它与Cinder不兼容。我可以在我的一个样本中找到一个非常基本的场景图:https://github.com/paulhoux/Cinder-Samples/tree/master/SimpleSceneGraph
  4. -Paul