// @topic W010201 FLTK Graphics -- maze navigation // @brief Buttons, animation, 2D drawing #include <FL/Fl.H> #include <FL/Fl_Double_Window.H> #include <FL/Fl_Output.H> #include <FL/Fl_Button.H> #include "Drawing2D.h" void cb_btn_right( Fl_Widget* btn, void* userdata ); void cb_btn_left( Fl_Widget* btn, void* userdata ); void animation_begin( Fl_Widget* widg, void* userdata ); void animation_continue( void* userdata ); int main() { // create data model Room kitchen = "kitchen"; Room nroom = "north"; Room eroom = "east"; Room sroom = "south"; Room wroom = "west"; kitchen.add_door( Room::COMPASS_NORTH, &nroom ); kitchen.add_door( Room::COMPASS_EAST, &eroom ); kitchen.add_door( Room::COMPASS_SOUTH, &sroom ); kitchen.add_door( Room::COMPASS_WEST, &wroom ); Fl_Double_Window window = Fl_Double_Window( 483, 410 ); Fl_Button button_right = Fl_Button( 30, 15, 100, 25, "->" ); Fl_Button button_left = Fl_Button( 40, 60, 75, 25, "<-" ); int x1 = 170; int y1 = 30; int x2 = 300; int y2 = 190; Drawing2D canvas( x1, y1, x2, y2, &kitchen ); canvas.callback( ( Fl_Callback* ) animation_begin, &canvas ); button_right.callback( ( Fl_Callback* ) cb_btn_right, &canvas ); button_left.callback( ( Fl_Callback* ) cb_btn_left, &canvas ); window.end(); window.resizable( window ); window.show(); return Fl::run(); } void cb_btn_right( Fl_Widget* btn, void* userdata ) { Drawing2D* pcanvas = static_cast< Drawing2D* >( userdata ); pcanvas->turn_head_right(); Fl::redraw(); } void cb_btn_left( Fl_Widget* btn, void* userdata ) { Drawing2D* pcanvas = static_cast< Drawing2D* >( userdata ); pcanvas->turn_head_left(); Fl::redraw(); } // timer animation void animation_begin( Fl_Widget* widg, void* userdata ) { Drawing2D* pcanvas = static_cast< Drawing2D* >( userdata ); if ( pcanvas->animate_door_entry() ) { Fl::add_timeout( TICK_TIMEOUT, animation_continue, userdata ); } } void animation_continue( void* userdata ) { Drawing2D* pcanvas = static_cast< Drawing2D* >( userdata ); if ( pcanvas->animate_door_entry() ) { Fl::redraw(); Fl::add_timeout( TICK_TIMEOUT, animation_continue, userdata ); } else { Fl::redraw(); } }