FLTK простая анимация

Я могу успешно скомпилировать и запустить код Hello World. Теперь я хочу сделать что-то вроде анимации.

Сначала я создаю класс прямоугольника для реализации draw () из Fl :: widget

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

Кажется, работает хорошо, но я не уверен, правильно это или нет. Если возникнут проблемы, дайте мне знать. Спасибо.


person Cory Lee    schedule 28.05.2012    source источник


Ответы (1)


Кори, ты на правильном пути.

Вот полный пример того, как сделать простую 2D-анимацию с использованием возможностей рисования FLTK: 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() статическом (обратном вызове) методе. Оба примера хороши и просты, и я уверен, что вы их сразу поймете.

person DejanLekic    schedule 28.05.2012
comment
Спасибо, это действительно помогло. Но я думаю, что это немного сложно. Необходимо изменить класс. Что может быть проще? Например, show_and_pause (1.0) после создания прямоугольника. В цикле он создает прямоугольник, показывает его и делает паузу в 1 секунду, а затем рисует до тех пор, пока цикл не разорвется. Является ли это возможным ? Я пробовал, но окно зависает и вылетает :( - person Cory Lee; 29.05.2012
comment
Не могли бы вы изменить мой код? Извините, я до сих пор не знаю. В цикле for я создаю 10 прямоугольников, и это прямо на экране. Как я могу использовать обратный вызов, чтобы добавлять их по одному, как анимацию? Нужно ли мне создать глобальный список шоу и в функции обратного вызова получить к нему доступ по индексу 0,1,2 ... 9? - person Cory Lee; 29.05.2012
comment
У вас есть достаточно, чтобы решить вашу проблему из примеров, которые я вам привел, и из моих комментариев здесь. Поиграйте с ними, проанализируйте код и у Вас легко получится сделать свою прямоугольную анимацию. - person DejanLekic; 29.05.2012