LINUX.ORG.RU

FLTK animation

Простейший вариант  ;)
---------------
// X11
#include <X11/Xlib.h>

//FLTK 
#include <FL/fl_draw.H>
#include <FL/Fl.H>                      
#include <FL/Fl_Double_Window.H>

#include <math.h>

#ifndef  max
 #define max(a,b) (((a)>(b))?(a):(b))
#endif
 
#ifndef  min
 #define min(a,b) (((a)<(b))?(a):(b))
#endif 
struct RGB
{
 unsigned char r; 
 unsigned char g;
 unsigned char b;
};

class Animated : virtual public Fl_Widget
{
 double angle;

 public:

 Animated(int x,int y,int dx,int dy):Fl_Widget(x,y,dx,dy),angle(0.) {;}
 void draw();
};

Fl_Double_Window* MainWindow;

void Animate(void*) {
       MainWindow->redraw();
       Fl::flush();
       Fl::add_timeout(0.05,Animate);
   }

int main(int argc, char **argv) {
    MainWindow = new Fl_Double_Window(0,0,Fl::w()/2,Fl::h()/2, "Test");
    {
     Animated* a = new Animated(0,0,MainWindow->w(),MainWindow->h());
    }
    MainWindow->end();
    MainWindow->show(argc,argv);
    Animate(NULL);
    Fl::run();
    return 0;
}

void  Animated::draw() 
{
 Fl_Color clr;
 RGB      rgb;
 int      x1,y1,x2,y2,x0,y0,r;

 x0 = w()/2;
 y0 = h()/2;

 r  = min(w(),h())/2;
 
 x1 = x0+r*sin(angle);
 y1 = y0+r*cos(angle);

 x2 = x0-r*sin(angle);
 y2 = y0-r*cos(angle);
 
 angle += 2*M_PI/100;
 
 if(angle > 2*M_PI)
    angle -=2*M_PI; 
  
 rgb.r=255;
 rgb.g=0;
 rgb.b=0;
 clr = fl_color();
 fl_color(rgb.r,rgb.g,rgb.b);
 fl_line(x1,y1,x2,y2);
 fl_color(clr);
}
---------------------------

Все более сложное можно сделать по таком же принципу 

к сожалению FLTK не thread safe поэтому с малтитредовыми рисовалками надо быть аккуратнее

BTW: я уже больше года как перешел на FOX 
( http://www.fox-toolkit.org/ ) так что кой чего из фултика могу и не помнить  ;)

sS ★★★★★
()
Ответ на: комментарий от Dead

Объединение жестких дисков

>а FOX thread safe?

Нет.

--------- From FOX FAQ -------------
Can I use multiple threads in my FOX application?

FOX assumes one single thread to be responsible for the User Interface related tasks. This is because certain FOX resources are not thread-safe; also, because on MS-Windows message queues from a window are tied to the thread that created that window, it is very important for portability reasons that it is always the same thread performing the User Interface tasks.

You can however use any number of threads in your application, as long as they are worker bees, i.e. they do not perform User Interface functions.

Synchronization between the User Interface thread and the worker threads can be performed using a synchronization object, a pipe (UNIX/LINUX) or an event object (MS-Windows).

The synchronization object is passed to FXApp::addInput() so that the User Interface thread is awakened when the worker thread turns the synchronization object into a signalled state.
---------------------------------------------------------------------


sS ★★★★★
()
Ответ на: комментарий от anonymous

>Спасибо! Я тоже подумывал о Fox, а что есть реальный смысл?

Это зависит от задачи.

Фокс чуть более стабилен у него больше интересных мне примитивов
но фултик на ощупь выглядит более шустрым ... ну уж о-о-о-чень сырой :(

Я собсно перешел на фокс из за сырости версии 2.*
а по фичам она даже уступает первому фоксу

sS ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.