namespace app {
-Application::Application(SDL_Surface *screen, State *initialState)
+Application::Application(sdl::InitScreen *screen, State *initialState)
: screen(screen)
, states()
, last(SDL_GetTicks()) {
void Application::RealPushState(State *s) {
states.push(s);
- s->EnterState(*this, screen);
+ s->EnterState(*this, screen->Screen());
}
void Application::PopState(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;
void Application::Render(void) {
if (!CurrentState()) return;
- CurrentState()->Render(screen);
- SDL_Flip(screen);
+ CurrentState()->Render(screen->Screen());
+ screen->Flip();
}
}
class Application {
public:
- explicit Application(SDL_Surface *screen, State *initialState);
+ Application(sdl::InitScreen *screen, State *initialState);
~Application(void);
private:
Application(const Application &);
void Render(void);
private:
- SDL_Surface *screen;
+ sdl::InitScreen *screen;
std::stack<State *> states;
Uint32 last;
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;
#include "PartyLayout.h"
#include "../graphics/Sprite.h"
+#include <iostream>
#include <stdexcept>
using app::Application;
+using geometry::Point;
using std::vector;
}
+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() {
}
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));
}
}
public:
BattleState(SDL_Surface *background, const PartyLayout &monstersLayout)
: background(background)
- , monstersLayout(&monstersLayout) { }
+ , monstersLayout(&monstersLayout)
+ , width(0)
+ , height(0) { }
public:
void AddMonster(const Monster &);
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 *);
const PartyLayout *monstersLayout;
std::vector<geometry::Point<int> > monsterPositions;
std::vector<Monster> monsters;
+ int width;
+ int height;
};
battleState->AddMonster(monster);
battleState->AddMonster(monster);
battleState->AddMonster(monster);
- Application app(screen.Screen(), battleState);
+ Application app(&screen, battleState);
app.Run();
return 0;
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");
}
}
+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;
+}
+
}
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;
};