added OverlayManager to ViewBase
This commit is contained in:
		
							parent
							
								
									54e14b41af
								
							
						
					
					
						commit
						50089c9755
					
				| @ -17,7 +17,7 @@ class MenuOverlay : public Engine::OverlayBase { | ||||
| 	public: | ||||
| 		MenuOverlay () { | ||||
| 		}; | ||||
| 		void Init (); | ||||
| 		virtual void Init (); | ||||
| 		virtual ~MenuOverlay() {}; | ||||
| 
 | ||||
| 		virtual bool OnKeyDown (const SDL_keysym &keysym); | ||||
|  | ||||
| @ -34,13 +34,13 @@ int View::OnInit (int argc, char* argv[]) { | ||||
| 	mMenuOverlay->SetModel ((Model*) mModel); | ||||
| 	mMenuOverlay->SetView (this); | ||||
| 	mMenuOverlay->Init(); | ||||
| 	AddOverlay (mMenuOverlay); | ||||
| 	mOverlayManager.Register (mMenuOverlay, GameStateMainMenu); | ||||
| 
 | ||||
| 	// We want the console
 | ||||
| 	mConsoleOverlay = boost::shared_ptr<Engine::SimpleConsoleOverlay> (new Engine::SimpleConsoleOverlay); | ||||
| 	// We also want to display the log bar
 | ||||
| 	mConsoleOverlay->SetDrawLogBar (true); | ||||
| 	AddOverlay (mConsoleOverlay); | ||||
| 	mOverlayManager.Register (mConsoleOverlay, GameStateMainMenu); | ||||
| 
 | ||||
| 	// This is a simple star field that makes the game so spacy
 | ||||
| 	int i; | ||||
|  | ||||
| @ -23,6 +23,7 @@ SET ( ENGINE_SRCS | ||||
| 	PhysicsEntityBase.cc | ||||
| 	ViewBase.cc | ||||
| 	EventsBase.cc | ||||
| 	OverlayBase.cc | ||||
| 
 | ||||
| 	Commands.cc | ||||
| 	DrawingsGL.cc | ||||
|  | ||||
| @ -132,7 +132,7 @@ void ControllerBase::ProcessEvents () { | ||||
| 
 | ||||
| /** \brief Keyboard processing */ | ||||
| bool ControllerBase::OnKeyDown (const SDL_keysym &keysym) { | ||||
| 	if (mView->SendKeyDown (keysym)) | ||||
| 	if (mView->mOverlayManager.SendKeyDown (keysym)) | ||||
| 		return true; | ||||
| 
 | ||||
| 	if (mBindings[keysym.sym].size () != 0) { | ||||
| @ -145,7 +145,7 @@ bool ControllerBase::OnKeyDown (const SDL_keysym &keysym) { | ||||
| 
 | ||||
| /** \brief Keyboard processing */ | ||||
| bool ControllerBase::OnKeyUp (const SDL_keysym &keysym) { | ||||
| 	if (mView->SendKeyUp (keysym)) | ||||
| 	if (mView->mOverlayManager.SendKeyUp (keysym)) | ||||
| 		return true; | ||||
| 
 | ||||
| 	if (mBindings[keysym.sym].size () != 0) { | ||||
| @ -164,7 +164,7 @@ bool ControllerBase::OnKeyUp (const SDL_keysym &keysym) { | ||||
| bool ControllerBase::OnMouseButtonDown (Uint8 button, Uint16 xpos, Uint16 ypos) { | ||||
| 	MouseButton mouse_button = convert_sdl_button (button); | ||||
| 
 | ||||
| 	if (mView->SendMouseButtonDown (button, xpos, ypos)) | ||||
| 	if (mView->mOverlayManager.SendMouseButtonDown (button, xpos, ypos)) | ||||
| 		return true; | ||||
| 
 | ||||
| 	if (mBindings[mouse_button].size () != 0) { | ||||
| @ -179,7 +179,7 @@ bool ControllerBase::OnMouseButtonDown (Uint8 button, Uint16 xpos, Uint16 ypos) | ||||
| bool ControllerBase::OnMouseButtonUp (Uint8 button, Uint16 xpos, Uint16 ypos) { | ||||
| 	MouseButton mouse_button = convert_sdl_button (button); | ||||
| 
 | ||||
| 	if (mView->SendMouseButtonUp (button, xpos, ypos)) | ||||
| 	if (mView->mOverlayManager.SendMouseButtonUp (button, xpos, ypos)) | ||||
| 		return true; | ||||
| 
 | ||||
| 	if (mBindings[mouse_button].size () != 0) { | ||||
|  | ||||
| @ -10,6 +10,7 @@ class Module; | ||||
| class PhysicsBase; | ||||
| class Events; | ||||
| class EntityFactoryBase; | ||||
| class OverlayManager; | ||||
| 
 | ||||
| struct EntityBase; | ||||
| 
 | ||||
| @ -110,6 +111,7 @@ class ModelBase : public Module { | ||||
| 		float mDeltaSec; | ||||
| 
 | ||||
| 	friend class ViewBase; | ||||
| 	friend class OverlayManager; | ||||
| 	friend class Engine; | ||||
| 	friend class Controller; | ||||
| }; | ||||
|  | ||||
| @ -1,17 +1,25 @@ | ||||
| #ifndef OVERLAY | ||||
| #define OVERLAY | ||||
| #ifndef OVERLAYBASE | ||||
| #define OVERLAYBASE | ||||
| 
 | ||||
| #include <boost/shared_ptr.hpp> | ||||
| 
 | ||||
| #include <SDL/SDL.h> | ||||
| #include <map> | ||||
| #include <list> | ||||
| 
 | ||||
| namespace Engine { | ||||
| 
 | ||||
| class ModelBase; | ||||
| 
 | ||||
| /** \brief Base class for user-interfaces
 | ||||
|  */ | ||||
| class OverlayBase { | ||||
| 	public: | ||||
| 		OverlayBase () {}; | ||||
| 		virtual ~OverlayBase() {}; | ||||
| 
 | ||||
| 		virtual void Init() {}; | ||||
| 
 | ||||
| 		virtual bool OnKeyDown (const SDL_keysym &keysym) { return false; }; | ||||
| 		virtual bool OnKeyUp (const SDL_keysym &keysym) { return false; }; | ||||
| 		virtual bool OnMouseButtonUp (Uint8 button, Uint16 xpos, Uint16 ypos) { return false; }; | ||||
| @ -24,6 +32,29 @@ class OverlayBase { | ||||
| 
 | ||||
| typedef boost::shared_ptr<OverlayBase> OverlayBasePtr; | ||||
| 
 | ||||
| } | ||||
| /** \brief Takes care of all OverlayBase classes and proxies input and drawing with regard to the current game state of ModelBase
 | ||||
|  * | ||||
|  * \node You need to set the ModelBase pointer manually by calling OverlayManager::SetModel()! | ||||
|  */ | ||||
| class OverlayManager { | ||||
| 	public: | ||||
| 		/** \brief Calls OverlayBase::Init() for all registered Overlays */ | ||||
| 		void InitOverlays(); | ||||
| 
 | ||||
| #endif /* OVERLAY */ | ||||
| 		void Draw(); | ||||
| 		void Register (OverlayBasePtr overlay, unsigned int game_state); | ||||
| 
 | ||||
| 		/* Input forwarding for the overlays */ | ||||
| 		bool SendKeyDown (const SDL_keysym &keysym); | ||||
| 		bool SendKeyUp (const SDL_keysym &keysym); | ||||
| 		bool SendMouseButtonUp (Uint8 button, Uint16 xpos, Uint16 ypos); | ||||
| 		bool SendMouseButtonDown (Uint8 button, Uint16 xpos, Uint16 ypos); | ||||
| 
 | ||||
| 	private: | ||||
| 		/** \brief Keeps the list of OverlayBase for each game state */ | ||||
| 		std::map<unsigned int, std::list<OverlayBasePtr> > mOverlays; | ||||
| }; | ||||
| 
 | ||||
| }; | ||||
| 
 | ||||
| #endif /* OVERLAYBASE */ | ||||
|  | ||||
| @ -57,8 +57,10 @@ int ViewBase::OnInit (int argc, char* argv[]) { | ||||
| 	mCurrentFont = mFonts["console.ttf"]; | ||||
| 	SetFontColor (1., 1., 1.); | ||||
| 
 | ||||
| 	// Overlays
 | ||||
| 	OverlayBasePtr console_overlay(new SimpleConsoleOverlay); | ||||
| 	AddOverlay (console_overlay); | ||||
| 	mOverlayManager.Register (console_overlay, 0); | ||||
| 	//AddOverlay (console_overlay);
 | ||||
| 
 | ||||
| 	mDrawAxis = false; | ||||
| 
 | ||||
| @ -72,9 +74,6 @@ int ViewBase::OnInit (int argc, char* argv[]) { | ||||
| } | ||||
| 
 | ||||
| void ViewBase::OnDestroy () { | ||||
| 	while (mOverlays.size() > 0) | ||||
| 		mOverlays.pop_back(); | ||||
| 
 | ||||
| 	std::map<std::string, OGLFT::Monochrome*>::iterator iter; | ||||
| 
 | ||||
| 	for (iter = mFonts.begin(); iter != mFonts.end(); ++iter) { | ||||
| @ -178,10 +177,7 @@ void ViewBase::Draw () { | ||||
| 
 | ||||
| 	DrawWorld (); | ||||
| 
 | ||||
| 	std::vector<OverlayBasePtr>::iterator overlay_iter; | ||||
| 	for (overlay_iter = mOverlays.begin(); overlay_iter != mOverlays.end(); overlay_iter++) { | ||||
| 		(*overlay_iter)->Draw(); | ||||
| 	} | ||||
| 	mOverlayManager.Draw(); | ||||
| 
 | ||||
| 	// and update the screen
 | ||||
| 	SDL_GL_SwapBuffers (); | ||||
| @ -197,10 +193,13 @@ bool ViewBase::LoadFont (const char *font_name, float point_size) { | ||||
| 	OGLFT::Monochrome *font = new OGLFT::Monochrome (font_path.c_str(), point_size); | ||||
| 	if ( font == 0 || !font->isValid() ) { | ||||
| 		LogError ("Could not load font %s!", font_path.c_str()); | ||||
| 		return false; | ||||
| 	} | ||||
| 	font->setForegroundColor(1., 1., 1.); | ||||
| 
 | ||||
| 	mFonts.insert(std::make_pair<std::string, OGLFT::Monochrome*>(font_name, font)); | ||||
| 
 | ||||
| 	return true; | ||||
| } | ||||
| 
 | ||||
| void ViewBase::SelectFont (const char *font) { | ||||
| @ -311,6 +310,7 @@ void ViewBase::Resize (int width, int height) { | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
| bool ViewBase::SendKeyDown (const SDL_keysym &keysym) { | ||||
| 	std::vector<OverlayBasePtr>::iterator overlay_iter; | ||||
| 	for (overlay_iter = mOverlays.begin(); overlay_iter != mOverlays.end(); overlay_iter++) { | ||||
| @ -350,6 +350,7 @@ bool ViewBase::SendMouseButtonDown (Uint8 button, Uint16 xpos, Uint16 ypos) { | ||||
| 
 | ||||
| 	return false; | ||||
| } | ||||
| */ | ||||
| 
 | ||||
| /*
 | ||||
|  * Global functions | ||||
|  | ||||
| @ -39,6 +39,10 @@ class ViewBase : public Module{ | ||||
| 		bool LoadFont (const char *font_name, float point_size=12); | ||||
| 		void SelectFont (const char *font_name); | ||||
| 		void SetFontJustification (FontJustification justification); | ||||
| 		/** \brief Sets the color of the current font
 | ||||
| 		 * | ||||
| 		 * \note This function should be avoided as the glyphs have to be re-rendered | ||||
| 		 */ | ||||
| 		void SetFontColor (float r, float g, float b); | ||||
| 		/** \brief Draws a string at the given position using current projection
 | ||||
| 		 * and modelview matrices */ | ||||
| @ -60,13 +64,15 @@ class ViewBase : public Module{ | ||||
| 		bool GetDrawGrid () { return mDrawGrid; }; | ||||
| 		void SetGridSize (int x, int z) {	mGridSizeX = x; mGridSizeZ = z;	} | ||||
| 
 | ||||
| 		void AddOverlay (OverlayBasePtr overlay) { mOverlays.push_back (overlay); }; | ||||
| //		void AddOverlay (OverlayBasePtr overlay) { mOverlays.push_back (overlay); };
 | ||||
| 
 | ||||
| 		/* Input forwarding for the overlays */ | ||||
| 		/*
 | ||||
| 		bool SendKeyDown (const SDL_keysym &keysym); | ||||
| 		bool SendKeyUp (const SDL_keysym &keysym); | ||||
| 		bool SendMouseButtonUp (Uint8 button, Uint16 xpos, Uint16 ypos); | ||||
| 		bool SendMouseButtonDown (Uint8 button, Uint16 xpos, Uint16 ypos); | ||||
| 		*/ | ||||
| 
 | ||||
| 	protected: | ||||
| 		/** \brief Initializes the system */ | ||||
| @ -86,7 +92,9 @@ class ViewBase : public Module{ | ||||
| 		ModelBase *mModel; | ||||
| 		CameraBase *mCamera; | ||||
| 
 | ||||
| 		std::vector<OverlayBasePtr> mOverlays; | ||||
| 		OverlayManager mOverlayManager; | ||||
| 
 | ||||
| 		//		std::vector<OverlayBasePtr> mOverlays;
 | ||||
| 
 | ||||
| 		/** \brief The height of the canvas we're drawing on */ | ||||
| 		unsigned int mWindowHeight; | ||||
| @ -107,6 +115,7 @@ class ViewBase : public Module{ | ||||
| 		std::map<std::string, OGLFT::Monochrome*> mFonts; | ||||
| 
 | ||||
| 		friend class Engine; | ||||
| 		friend class ControllerBase; | ||||
| }; | ||||
| 
 | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user