我可以成功地编译并运行Hello代码。现在我想做一些像动画一样的事情。
我首先创建一个矩形类,以实现从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();
}它似乎运行得很好,但我不确定它是否正确。如果有什么问题,请告诉我。谢谢。
发布于 2012-05-28 18:01:54
科里,你走对了路。
下面是一个完整的示例,如何使用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()静态(回调)方法中。这两个例子都是好的和容易的,我相信你会立即理解他们。
https://stackoverflow.com/questions/10786612
复制相似问题