Ok, so here's the final code using the previous posts.This one works:

Now here is the version in which the animation should stop after 10 frames ( 10 
rectangles):

#include <FL/Fl.H>
#include <FL/Fl_Double_Window.H>
#include <FL/Fl_Box.H>
#include <FL/fl_draw.h>
#include "random_ab.h"
#include <ctime>

int n_frames = 0; // variable that counts the number of frames

class Canvas : public Fl_Box // deriving from Fl_Box a drawable widget
{
  public:
    Canvas( int x, int y, int w, int h, const char *l); // constructor
    ~Canvas() {}; // destructor

    int XC; // coordonates of the corner of the rectangle
    int YC; // these coordonates will hace random values each time

    void draw(); // overrided function
    static void timer_cb(void *v); // timeout function
};

Canvas::Canvas( int x, int y, int w, int h, const char *l) : Fl_Box( x, y, w, 
h, l)
{
  box(FL_FLAT_BOX);
  color((Fl_Color)255);
  Fl::add_timeout(0.5,timer_cb,(void*) this); // first I call add_timeout
}

void Canvas::draw() // overriding drawing function to draw rectangle
{
  Fl_Box::draw();
  fl_push_clip( x(), y(), w(), h() ); // start clipping
  fl_color(FL_BLACK);
  fl_rect( x(), y(), w(), h() ); // draws an exterior contour

  XC=rand_ab(0,200);
  YC=rand_ab(0,200);
  fl_rect( x() + XC, y() + YC,50,20 ); // draws the rectangle at random corner

  fl_pop_clip(); // end clipping
}

void Canvas::timer_cb(void *v)
{
  Canvas *c = (Canvas *) v;
  c->redraw();

  n_frames++;

  if(n_frames < 10) // this makes the animation for only n_frames
    Fl::repeat_timeout(timer_cb);
}



/******************************************************************************/
int main()
{
  srand(time(0)); // added semicolon :)

  Fl_Double_Window *my_win = new Fl_Double_Window(300,300, "Draw animation");
  my_win->begin();

    Canvas my_canvas(20,20,260,260,0); // a widget on which I draw a rectangle

  my_win->resizable(my_canvas);
  my_win->end();
  my_win->show();

  return Fl::run();

}
/******************************************************************************/

What is interesting is that the previous version that I first posted did work 
this time, probably something I missed.
As you can see I don't even use Fl:remove_timeout() anymore, but I also tested 
that version and it works too, so the below function is good too:

void Canvas::timer_cb(void *v)
{
  Canvas *c = (Canvas *) v;
  c->redraw();
  Fl::repeat_timeout(0.5,timer_cb,v); // 0.5 s delay
  n_frames++;

  if(n_frames > 10)
    Fl::remove_timeout(timer_cb);
}

and also this one:

void Canvas::timer_cb(void *v)
{
  Canvas *c = (Canvas *) v;
  c->redraw();

  n_frames++;

  if(n_frames > 10)
    Fl::remove_timeout(timer_cb); // 0.5 s delay
    else Fl::repeat_timeout(0.5,timer_cb,c);
}

Also, if I move the calculations of XC and YC in the timeout function, it works.

I have only one question now: since you don't really need remove_timeout() and 
you can just stop calling repeat_timeout() when the time is right, what good is 
remove_timeout() for?? Is it a last case resort, so you can force to stop the 
timeout or what for???
_______________________________________________
fltk mailing list
fltk@easysw.com
http://lists.easysw.com/mailman/listinfo/fltk

Reply via email to