2012-05-28 89 views
2

我可以成功编译并运行Hello World代码。 现在我想做一些动画。FLTK简单动画

我首先创建一个矩形类从FL执行拉伸()::插件

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

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

回答

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()静态(回调)方法。这两个例子都很好,很容易,我相信你会立即理解它们。

+0

谢谢,它真的很有帮助。但我认为这有点复杂。它需要修改类。它会更简单吗?例如,创建矩形后的“show_and_pause(1.0)”。在循环中,它创建一个矩形,显示它并暂停1秒,然后绘制下一个直到循环中断。可能吗 ?我尝试了,但窗口冻结并崩溃:( –

+0

这并不复杂,这实际上是制作不闪烁视频的最简单方法。是的,确定这是可能的,但您必须在另一个线程中执行此操作因为如果你暂停主(GUI)线程,它会将整个应用程序冻结1秒,而不仅仅是FLTK,任何GUI工具箱都是如此。 doc-1.1/advanced.html。另一种方法(简单的)是在耗费时间的循环中调用'fltk :: check();' – DejanLekic

+0

能否请你修改我的代码?对不起,我还不知道。循环我创建了10个矩形,它只是在屏幕上,我如何使用回调像动画一样逐个添加它们?需要我创建一个全局的“show-list”,并在回调函数中通过索引0访问它, 1,2 ... 9? –