// @topic T01050 FLTK Graphics // @brief Class Turtle ( version 1.0 ) #ifndef _TURTLES_H_INCLUDED_ #define _TURTLES_H_INCLUDED_ using namespace Graph_lib; class Turtle { static const int TURTLE_BODY_SIZE = 20; // pixels static const int TURTLE_HEAD_SIZE = TURTLE_BODY_SIZE / 2; // pixels static const int TURTLE_ANIMATION_PIXELS = 1; // the turtle appears in a form of two circles, // the body and the head: Circle m_cir_body; Circle m_cir_head; // Animation support -- if distance is zero, there is no movement. // Otherwise, distance in pixels to move in response to a single "go" call: int m_distance; public: // Constructor Turtle( Simple_window& wnd, Point origin ) : m_cir_body( origin, TURTLE_BODY_SIZE ), // by default, construct "easterly" head m_cir_head( Point ( origin.x + TURTLE_HEAD_SIZE, origin.y ), TURTLE_HEAD_SIZE ), m_distance( 0 ) { wnd.attach( m_cir_body ); m_cir_head.set_fill_color( Color::dark_green ); wnd.attach( m_cir_head ); } // start moving in the direction the turtle is facing: void go( int distance ) { m_distance = distance; go(); } // overloaded go starts the animation void go() { Fl::add_timeout( ANIMATION_TIMEOUT, callback_animate, this ); } // core animation function -- invoked by the timer callback void animate() { if ( m_distance == 0 ) { // no distance left, so stop return; } m_cir_body.move( TURTLE_ANIMATION_PIXELS, 0 ); m_cir_head.move( TURTLE_ANIMATION_PIXELS, 0 ); Fl::redraw(); --m_distance; Fl::repeat_timeout( ANIMATION_TIMEOUT, callback_animate, this ); } // timer call back entry point: static void callback_animate( void* pthing ) { // Cast void pointer to the pointer to turtle object: Turtle* self = static_cast< Turtle* >( pthing ); // pass this timer event on to the animation function: self->animate(); } };//class Turtle #endif //_TURTLES_H_INCLUDED_