【问题标题】:FLTK simple animationFLTK简单动画
【发布时间】:2012-05-28 14:54:38
【问题描述】:

我可以成功编译并运行 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();
}

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

【问题讨论】:

    标签: c++ user-interface animation fltk


    【解决方案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() 静态(回调)方法。这两个示例都很好且简单,我相信您会立即理解它们。

    【讨论】:

    • 谢谢,它真的很有帮助。但我觉得有点复杂。它需要修改类。可以更简单吗?例如,创建矩形后的“show_and_pause(1.0)”。在循环中它创建一个矩形,显示它并暂停 1 秒,然后绘制下一个直到循环中断。可能吗 ?我试过了,但窗口冻结并崩溃:(
    • 并不复杂。这实际上是制作不闪烁视频的最简单方法。是的,当然可以,但是您必须在另一个线程中执行此操作,因为如果您暂停主(GUI)线程,它将冻结整个应用程序 1 秒。不仅是 FLTK,任何 GUI 工具包都是如此。有关多线程的更多信息:fltk.org/doc-1.1/advanced.html。另一种选择(更简单)是在耗时的循环中调用fltk::check();
    • 你能修改我的代码吗?对不起,我仍然不知道。在 for 循环中,我创建了 10 个矩形,它就在屏幕上。如何像动画一样使用回调将它们一一添加?我需要创建一个全局“显示列表”并在回调函数中按索引 0,1,2...9 访问它吗?
    • 从我给你的例子和我的 cmets 来看,你已经足够解决你的问题了。和他们一起玩,分析代码,你会很容易地制作你的矩形动画。
    猜你喜欢
    • 2014-02-15
    • 2015-08-26
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多