FLTK简单的动画(FLTK simple animation)

2019-09-17 14:03发布

我可以成功地编译和运行Hello World代码。 现在,我要像做动画。

我首先创建一个矩形类从佛罗里达州实行的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秒。 让它就像动画。

我已阅读公文,但我仍然没有关于idead。 请给我一些信息。 谢谢 !!


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

这似乎运行良好,但我不知道它是否正确。 如果有任何问题,请让我知道。 谢谢。

Answer 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()静态(回调)方法。 这两个例子都不错,容易,我相信你会立即明白。



文章来源: FLTK simple animation