From 4a1816af30dcfe53181a25355bd51cc7b24a83f1 Mon Sep 17 00:00:00 2001 From: Daniel Karbach Date: Mon, 6 Aug 2012 13:03:20 +0200 Subject: [PATCH] made application and battle state resizable --- src/app/Application.cpp | 12 ++++++++---- src/app/Application.h | 4 ++-- src/app/State.h | 3 +++ src/battle/BattleState.cpp | 26 ++++++++++++++++++++++++-- src/battle/BattleState.h | 8 +++++++- src/main.cpp | 2 +- src/sdl/InitScreen.cpp | 12 +++++++++++- src/sdl/InitScreen.h | 3 +++ 8 files changed, 59 insertions(+), 11 deletions(-) diff --git a/src/app/Application.cpp b/src/app/Application.cpp index 37f3135..e06e231 100644 --- a/src/app/Application.cpp +++ b/src/app/Application.cpp @@ -13,7 +13,7 @@ namespace app { -Application::Application(SDL_Surface *screen, State *initialState) +Application::Application(sdl::InitScreen *screen, State *initialState) : screen(screen) , states() , last(SDL_GetTicks()) { @@ -42,7 +42,7 @@ void Application::PushState(State *s) { void Application::RealPushState(State *s) { states.push(s); - s->EnterState(*this, screen); + s->EnterState(*this, screen->Screen()); } void Application::PopState(void) { @@ -94,6 +94,10 @@ void Application::HandleEvents(void) { case SDL_QUIT: PopAllStates(); break; + case SDL_VIDEORESIZE: + screen->Resize(event.resize.w, event.resize.h); + CurrentState()->Resize(event.resize.w, event.resize.h); + break; default: CurrentState()->HandleEvent(event); break; @@ -110,8 +114,8 @@ void Application::UpdateWorld(Uint32 deltaT) { void Application::Render(void) { if (!CurrentState()) return; - CurrentState()->Render(screen); - SDL_Flip(screen); + CurrentState()->Render(screen->Screen()); + screen->Flip(); } } diff --git a/src/app/Application.h b/src/app/Application.h index 159f627..909942b 100644 --- a/src/app/Application.h +++ b/src/app/Application.h @@ -21,7 +21,7 @@ class State; class Application { public: - explicit Application(SDL_Surface *screen, State *initialState); + Application(sdl::InitScreen *screen, State *initialState); ~Application(void); private: Application(const Application &); @@ -49,7 +49,7 @@ private: void Render(void); private: - SDL_Surface *screen; + sdl::InitScreen *screen; std::stack states; Uint32 last; diff --git a/src/app/State.h b/src/app/State.h index d9936dd..efee32b 100644 --- a/src/app/State.h +++ b/src/app/State.h @@ -25,6 +25,9 @@ public: virtual void EnterState(Application &ctrl, SDL_Surface *screen) = 0; virtual void ExitState() = 0; + /// adapt the state's graphics to given dimensions + virtual void Resize(int width, int height) = 0; + virtual void HandleEvent(const SDL_Event &) = 0; virtual void UpdateWorld(float deltaT) = 0; virtual void Render(SDL_Surface *) = 0; diff --git a/src/battle/BattleState.cpp b/src/battle/BattleState.cpp index 5f50109..5ba84db 100644 --- a/src/battle/BattleState.cpp +++ b/src/battle/BattleState.cpp @@ -10,9 +10,11 @@ #include "PartyLayout.h" #include "../graphics/Sprite.h" +#include #include using app::Application; +using geometry::Point; using std::vector; @@ -26,8 +28,16 @@ void BattleState::AddMonster(const Monster &m) { } +void BattleState::Resize(int w, int h) { + width = w; + height = h; +} + + void BattleState::EnterState(Application &ctrl, SDL_Surface *screen) { monstersLayout->CalculatePositions(background->w, background->h, monsterPositions); + width = screen->w; + height = screen->h; } void BattleState::ExitState() { @@ -44,10 +54,22 @@ void BattleState::UpdateWorld(float deltaT) { } void BattleState::Render(SDL_Surface *screen) { + // black for now + SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0)); + SDL_Rect destRect; + destRect.x = (width - background->w) / 2; + destRect.y = (height - background->h) / 2; + destRect.w = background->w; + destRect.h = background->h; + + std::cout << "screen: " << screen->w << "x" << screen->h << std::endl; + std::cout << "drawing to " << destRect.w << "x" << destRect.h << "+" << destRect.x << "+" << destRect.y << std::endl; + // TODO: center background if screen bigger - SDL_BlitSurface(background, 0, screen, 0); + SDL_BlitSurface(background, 0, screen, &destRect); + for (vector::size_type i(0), end(monsters.size()); i < end; ++i) { - monsters[i].Sprite()->DrawCenterBottom(screen, monsterPositions[i]); + monsters[i].Sprite()->DrawCenterBottom(screen, Point(monsterPositions[i].X() + destRect.x, monsterPositions[i].Y() + destRect.y)); } } diff --git a/src/battle/BattleState.h b/src/battle/BattleState.h index ccc2425..52238eb 100644 --- a/src/battle/BattleState.h +++ b/src/battle/BattleState.h @@ -25,7 +25,9 @@ class BattleState public: BattleState(SDL_Surface *background, const PartyLayout &monstersLayout) : background(background) - , monstersLayout(&monstersLayout) { } + , monstersLayout(&monstersLayout) + , width(0) + , height(0) { } public: void AddMonster(const Monster &); @@ -34,6 +36,8 @@ public: virtual void EnterState(app::Application &ctrl, SDL_Surface *screen); virtual void ExitState(); + virtual void Resize(int width, int height); + virtual void HandleEvent(const SDL_Event &); virtual void UpdateWorld(float deltaT); virtual void Render(SDL_Surface *); @@ -43,6 +47,8 @@ private: const PartyLayout *monstersLayout; std::vector > monsterPositions; std::vector monsters; + int width; + int height; }; diff --git a/src/main.cpp b/src/main.cpp index 71966ee..8f92a35 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -64,7 +64,7 @@ int main(int argc, char **argv) { battleState->AddMonster(monster); battleState->AddMonster(monster); battleState->AddMonster(monster); - Application app(screen.Screen(), battleState); + Application app(&screen, battleState); app.Run(); return 0; diff --git a/src/sdl/InitScreen.cpp b/src/sdl/InitScreen.cpp index c9b275f..76030b1 100644 --- a/src/sdl/InitScreen.cpp +++ b/src/sdl/InitScreen.cpp @@ -15,7 +15,9 @@ using std::runtime_error; namespace sdl { InitScreen::InitScreen(int width, int height, int bpp, Sint32 flags) -: screen(SDL_SetVideoMode(width, height, bpp, flags)) { +: screen(SDL_SetVideoMode(width, height, bpp, flags)) +, bpp(bpp) +, flags(flags) { if (!screen) { throw runtime_error("failed to open screen"); } @@ -25,4 +27,12 @@ InitScreen::~InitScreen(void) { } +SDL_Surface *InitScreen::Resize(int width, int height) { + SDL_Surface *newScreen(SDL_SetVideoMode(width, height, bpp, flags)); + if (!newScreen) { + throw runtime_error("failed to resize screen"); + } + return screen = newScreen; +} + } diff --git a/src/sdl/InitScreen.h b/src/sdl/InitScreen.h index ef0820f..5455a17 100644 --- a/src/sdl/InitScreen.h +++ b/src/sdl/InitScreen.h @@ -26,9 +26,12 @@ public: const SDL_Surface *Screen(void) const { return screen; }; void Flip(void) { SDL_Flip(screen); }; + SDL_Surface *Resize(int width, int height); private: SDL_Surface *screen; + int bpp; + Sint32 flags; }; -- 2.39.2