#ifndef _VIEW_H #define _VIEW_H #include "ViewBase.h" #include "OverlayBase.h" #include "mathlib.h" #include "Sprite.h" #include "EntityBase.h" #include "SimpleConsoleOverlay.h" #include "AsteroidsEnums.h" namespace asteroids { struct ShipEntity; struct AsteroidEntity; struct RocketEntity; struct BackgroundStar { vector3d position; }; /** \brief Performs the actual drawing based on Camera and Model * * This View also takes care of the drawn user interface. There are different * view states that are drawn by the member functions with signatures * DrawUi{ViewStateName}(). Different view states can be pushed onto and * popped from the mViewStateStack which allows non-linear arrangement * of different ViewStates in menus. */ class View : public Engine::ViewBase { public: virtual ~View() {}; /** \brief Pushes the given state onto mViewStateStack */ void PushViewState (const ViewState state) { Engine::LogDebug ("Pushing ViewState %s", GetStringViewState(state)); mViewStateStack.push(state); // Fire the view state change event to properly clear the IMGUI state Engine::EventBasePtr changeviewstate_event (new Engine::EventBase()); changeviewstate_event->mEventType = EventChangeViewState; QueueEvent (changeviewstate_event); } /** \brief Returns the current ViewState */ ViewState GetViewState () { return mViewStateStack.top(); } /** \brief Removes the top element of the current ViewState stack */ ViewState PopViewState () { ViewState top = mViewStateStack.top(); // Warning: you must not query for an invalid enum with // GetStringENUM_NAME! std::string popped_name = GetStringViewState(mViewStateStack.top()); mViewStateStack.pop(); std::string current_name ("None"); if (mViewStateStack.size() > 0) current_name = GetStringViewState(mViewStateStack.top()); Engine::LogDebug("Popped ViewState: %s current %s remaining: %u", popped_name.c_str(), current_name.c_str(), mViewStateStack.size()); if (mViewStateStack.size() == 0) { Engine::LogDebug ("No ViewState on the stack! Quitting."); Engine::RunCommand("quit"); } // Fire the view state change event to properly clear the IMGUI state Engine::EventBasePtr changeviewstate_event (new Engine::EventBase()); changeviewstate_event->mEventType = EventChangeViewState; QueueEvent (changeviewstate_event); return top; } protected: /** \brief Initializes the system */ virtual int OnInit (int argc, char* argv[]); virtual void OnDestroy (); /** \brief Updates the camera for further drawing */ virtual void UpdateCamera (); private: void DrawUi(); void DrawPageTitle(const std::string &title); void DrawUiMainMenu(); void DrawUiGameRunning(); void DrawUiGameOver(); void DrawUiLevelIntro(); void DrawUiLevelComplete(); void DrawUiGamePaused(); void DrawUiPlayerDied(); void DrawHighscoreEntry(float x, float y, float entry_width, const std::string &name, unsigned int points); bool DrawUiAskOnlineHighscore(); void DrawUiHighscore(); void DrawUiOptions(); void DrawUiEnterPlayername(); void DrawUiCredits(); void DrawUiEditor(); virtual void Draw (); virtual void DrawWorld (); void DrawEntities(); void DrawStars (); void DrawEntity (Engine::EntityBase *entity); void DrawShip (ShipEntity *ship); void DrawAsteroid (AsteroidEntity *asteroid); void DrawRocket (RocketEntity *asteroid); void DrawShipPart (Engine::EntityBase *entity); std::vector mBackgroundStars; std::vector mShipPartsEntityIds; /** \brief The ViewState stack that is used for non-linear menus */ std::stack mViewStateStack; /** \brief Removes all elements of the ViewState stack */ void ResetViewState() { Engine::LogDebug ("Resetting ViewState stack"); while (mViewStateStack.size()) mViewStateStack.pop(); // Fire the view state change event to properly clear the IMGUI state Engine::EventBasePtr changeviewstate_event (new Engine::EventBase()); changeviewstate_event->mEventType = EventChangeViewState; QueueEvent (changeviewstate_event); } // \todo [high] add Resource Manager! Engine::Sprite mGUIShipSprite; Engine::Sprite mAsteroidSprite; Engine::Sprite mShipSprite; Engine::Sprite mShipThrustSprite; Engine::Sprite mShipPartsSprite; float screen_left; float screen_right; float screen_top; float screen_bottom; int button_width; int button_height; enum EditorState { EditorStateUnknown = 0, EditorStateAddEntity, EditorStateDelEntity, EditorStateMoveEntity, EditorStateRotateEntity, EditorStateSave, EditorStateEntityVelocity, EditorStateLoad, EditorStateTest }; EditorState mEditorState; unsigned int mEditorEntityId; unsigned int mCreditsPageIndex; /// \brief can be used to perform some fading, etc. float mFadeTimerSecValue; virtual bool OnReceiveEvent (const Engine::EventBasePtr &event); }; } #endif // _VIEW_H