2

我可以成功编译并运行 Hello World 代码。现在我想做一些类似动画的事情。

我首先创建一个矩形类来从 Fl::widget 实现 draw()

class myRect: public Fl_Widget {
private:
    Fl_Color color;
    void draw(){
        fl_color(color);
        fl_rectf(x(),y(),w(),h(),color);
    }
public:
    myRect(int X,int Y,int W,int H, Fl_Color c) : Fl_Widget(X,Y,W,H),color(c) {}
};



int main (int argc, char ** argv)
{
    Fl_Window *window = new Fl_Window (300, 180, "FLTK Test");

    vector<myRect*> allRect;
    for(int i=0; i<10; ++i){
        allRect.push_back(new myRect ((i*10)%100,100,50,50,i%256));
    }
    window->end();
    window->show();

    return Fl::run();
}

上面的代码可以按我的预期运行。但是现在我想一个一个地显示矩形,有一些时间间隔,比如 1 秒。让它像动画一样。

我已经阅读了官方文档,但我仍然对此一无所知。请给我一些信息。谢谢 !!


感谢 DejanLekic,我修改了我的代码如下:

#include <iostream>
#include <vector>
#include <FL/Fl.H>
#include <FL/Fl_Widget.H>
#include <FL/Fl_Double_Window.H>
#include <FL/fl_draw.H>

using namespace std;

class myRect: public Fl_Widget {
private:
    Fl_Color color;
    void draw(){
    fl_color(color);
    fl_rectf(x(),y(),w(),h(),color);
}

public:
    myRect(int X,int Y,int W,int H, Fl_Color c)
        :Fl_Widget(X,Y,W,H),color(c) {}
};

vector<myRect*> allRect;

void winUpdate(void *data)
{
    static unsigned i = 0;
    Fl_Double_Window *o = (Fl_Double_Window*)data;
    if(i < allRect.size()){
        o->add(allRect[i]);
        if(i>=3) o->remove(allRect[i-3]);
        o->redraw();
        Fl::add_timeout(0.5,winUpdate,data);
        ++i;
    }
}

int main (int argc, char ** argv)
{
    for(int i=0; i<8; ++i){
        allRect.push_back(new myRect(i*30,i*30,50,50,i));
    }
    Fl_Double_Window *window = new Fl_Double_Window (400, 400, "FLTK Test");
    Fl::add_timeout(2,winUpdate,window);
    window->end();
    Fl::visual(FL_DOUBLE|FL_INDEX);
    window->show();
    return Fl::run();
}

它似乎运行良好,但我不确定它是否正确。如果有任何问题,请告诉我。谢谢。

4

1 回答 1

1

科里,你走在正确的道路上。

这是一个完整的示例,如何使用 FLTK 的绘图功能制作简单的 2D 动画:http: //seriss.com/people/erco/fltk/#AnimateDrawing

使用 OpenGL 的类似事情:http: //seriss.com/people/erco/fltk/#OpenGlInterp

在这两个示例中,关键在于Fl::add_timeout(0.25, Timer_CB, (void*)this);行和Timer_CB()静态(回调)方法。这两个例子都很好而且简单,我相信你会立即理解它们。

于 2012-05-28T18:01:54.713 回答