/* $Id: replayer.hpp,v 1.12 2005/12/15 11:55:21 chfreund Exp $ */ #ifndef _REPLAYER_HPP_ #define _REPLAYER_HPP_ #include #include #include #include "rootcontainer.h" #include "action.h" #include "textlabel.h" #include "button.h" using namespace SDLwidgets; #include "video.hpp" #include "audio.hpp" #include "world.hpp" #include "wopbackground.hpp" class Replayer : public ActionListener { private: Video m_video; Audio* m_audio; World m_world; WopBackground* m_background; SDL_Surface* m_mapSurface; SDL_Rect m_mapRect; const Object* m_focusedObject; SDL_Thread *m_displayThread; SDL_cond *m_displayLoopCond; SDL_mutex *m_displayLoopMutex; SDL_mutex *m_worldMutex; SDL_TimerID m_frameTimer; Uint32 m_frameDuration; Uint32 m_frameCounter; std::ifstream m_in; bool m_quitFlag; int m_screenshotNumber; static const int m_N_MOVIE_FRAMES = 200, m_N_SKIP_FRAMES = 1000, m_BOOKMARK_REWIND = 200; std::vector m_bookmarks; Uint8* m_worldBuffer; ifstream::pos_type m_posBuffer; Uint32 m_frameCounterBuffer; RootContainer* m_rootContainer; TextLabel* m_frameCounterDisplay; TextLabel* m_playbackRateDisplay; Uint16 m_grabX, m_grabY; TextButton* m_playButton; TextButton* m_stopButton; TextButton* m_skipButton; TextButton* m_screenshotButton; public: Replayer( const char* filename ); virtual ~Replayer(); void run(); void displayLoop(); void handleEvent( SDL_Event* event ); void nextFrame(); void updateGraphics(); virtual void actionPerformed( Uint32 cmd, void* source ); Uint32 getFrameDuration() const { return m_frameDuration; } private: void createGUI(); void signalDisplayThread() { if ( m_displayLoopCond ) SDL_CondSignal( m_displayLoopCond ); } void drawWorld( SDL_Surface* surface ); void stopPlayback(); void startPlayback(); bool isPlaybackRunning() { return ( m_frameTimer != 0 ); } void skipFrames( Uint32 numberFrames ); void saveScreenshot(); void createMovie(); void scanForBookmarks(); void gotoNextBookmark(); void rewind(); friend Uint32 replayFrameTimerCallback( Uint32 interval, void* data ); friend int replayDisplayLoopWrapper( void* data ); }; Uint32 replayFrameTimerCallback( Uint32 interval, void* data ); int replayDisplayLoopWrapper( void* data ); #endif // _REPLAYER_HPP_