]> git.localhorst.tv Git - l2e.git/commitdiff
made application and battle state resizable
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Mon, 6 Aug 2012 11:03:20 +0000 (13:03 +0200)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Mon, 6 Aug 2012 11:03:20 +0000 (13:03 +0200)
src/app/Application.cpp
src/app/Application.h
src/app/State.h
src/battle/BattleState.cpp
src/battle/BattleState.h
src/main.cpp
src/sdl/InitScreen.cpp
src/sdl/InitScreen.h

index 37f3135c48d8f4d3c92d1b323481f343d913157f..e06e231d785535488554f9b09975410f8942f667 100644 (file)
@@ -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();
 }
 
 }
index 159f627c0a87f1c4ab62e63eaf67594d4d30de9d..909942b829730020ecd598e368bcbaefc4d7edcb 100644 (file)
@@ -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<State *> states;
        Uint32 last;
 
index d9936ddfcc3665f90a1a6900aac876ebbca4bf3f..efee32ba2ab0f3a3001dbbe9944ab9d8f44a58c3 100644 (file)
@@ -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;
index 5f50109b7585682c520d8ff09921de6787a80f20..5ba84db2583a17711e20304988bd0cf361e4ba48 100644 (file)
 #include "PartyLayout.h"
 #include "../graphics/Sprite.h"
 
+#include <iostream>
 #include <stdexcept>
 
 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<Monster>::size_type i(0), end(monsters.size()); i < end; ++i) {
-               monsters[i].Sprite()->DrawCenterBottom(screen, monsterPositions[i]);
+               monsters[i].Sprite()->DrawCenterBottom(screen, Point<int>(monsterPositions[i].X() + destRect.x, monsterPositions[i].Y() + destRect.y));
        }
 }
 
index ccc242512bf87ddbecf25e0656f86d7cb0e1a8fa..52238ebe5d3594b964cd656aa10bd5094e793e51 100644 (file)
@@ -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<geometry::Point<int> > monsterPositions;
        std::vector<Monster> monsters;
+       int width;
+       int height;
 
 };
 
index 71966eed653cf39bfcfbfacc93c8843874de8f5d..8f92a357dacb74830cd0350cc15ec55149c09c17 100644 (file)
@@ -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;
index c9b275fc83ad5d758322743799363151cd343e38..76030b1df0067aa610428cb93eff3ba7ca168848 100644 (file)
@@ -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;
+}
+
 }
index ef0820fc30e65115a4f0716f15584b059daa93e7..5455a17675da1e87bd0bde032f1b60a952468976 100644 (file)
@@ -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;
 
 };