2012-05-28 7 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

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

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

+0

Спасибо, это действительно полезно. Но я думаю, что это немного сложно. Он должен изменить класс. Может быть, это проще? Например, "show_and_pause (1.0)" после создания прямоугольника. В цикле он создает прямоугольник, показывает его и приостанавливает 1 секунду, а затем рисует дальше, пока цикл не прерывается. Является ли это возможным ? Я пробовал, но окно замерзает и падает :( –

+0

Это не сложно. Это самый простой способ сделать видео, которое не мерцает. И да, конечно, это возможно, но вы должны сделать это в другом потоке потому что, если вы приостановите основной (GUI) поток, он заморозит все приложение на 1 секунду. Это связано не только с FLTK, это в случае с ANY GUI toolkit. Подробнее о многопоточности: http://www.fltk.org/ doc-1.1/advanced.html Альтернатива (проще) заключается в вызове 'fltk :: check();' в вашем временном цикле. – DejanLekic

+0

Не могли бы вы пересмотреть мой код? Извините, я до сих пор не знаю. цикл Я создаю 10 прямоугольников, и это просто на экране.Как я могу использовать обратный вызов, чтобы добавить их по одному точно так же, как анимация? Мне нужно создать глобальный «show-list», а в функции обратного вызова получить его по индексу 0, 1,2 ... 9? –