#include "init.hpp"
#include "../audio/Sound.hpp"
+#include "../graphics/ArrayTexture.hpp"
#include "../graphics/Font.hpp"
+#include "../graphics/Texture.hpp"
#include "../world/BlockType.hpp"
#include "../world/Entity.hpp"
#include <iostream>
#include <stdexcept>
+#include <SDL_image.h>
using std::string;
void Application::Handle(const SDL_Event &event) {
switch (event.type) {
- case SDL_QUIT:
- env.state.PopAll();
- break;
case SDL_WINDOWEVENT:
Handle(event.window);
break;
void Application::PushState(State *s) {
+ if (!states.empty()) {
+ states.top()->OnPause();
+ }
states.emplace(s);
+ ++s->ref_count;
+ if (s->ref_count == 1) {
+ s->OnEnter();
+ }
+ s->OnResume();
}
State *Application::PopState() {
State *s = states.top();
states.pop();
+ s->OnPause();
+ s->OnExit();
+ if (!states.empty()) {
+ states.top()->OnResume();
+ }
return s;
}
State *Application::SwitchState(State *s_new) {
State *s_old = states.top();
states.top() = s_new;
+ --s_old->ref_count;
+ ++s_new->ref_count;
+ s_old->OnPause();
+ if (s_old->ref_count == 0) {
+ s_old->OnExit();
+ }
+ if (s_new->ref_count == 1) {
+ s_new->OnEnter();
+ }
+ s_new->OnResume();
return s_old;
}
Assets::Assets(const string &base)
: fonts(base + "fonts/")
-, sounds(base + "sounds/") {
+, sounds(base + "sounds/")
+, textures(base + "textures/") {
}
return Sound(full.c_str());
}
+Texture Assets::LoadTexture(const string &name) const {
+ string full = textures + name + ".png";
+ Texture tex;
+ SDL_Surface *srf = IMG_Load(full.c_str());
+ if (!srf) {
+ throw SDLError("IMG_Load");
+ }
+ tex.Bind();
+ tex.Data(*srf);
+ SDL_FreeSurface(srf);
+ return tex;
+}
+
+void Assets::LoadTexture(const string &name, ArrayTexture &tex, int layer) const {
+ string full = textures + name + ".png";
+ SDL_Surface *srf = IMG_Load(full.c_str());
+ if (!srf) {
+ throw SDLError("IMG_Load");
+ }
+ tex.Bind();
+ try {
+ tex.Data(layer, *srf);
+ } catch (...) {
+ SDL_FreeSurface(srf);
+ throw;
+ }
+ SDL_FreeSurface(srf);
+}
+
void FrameCounter::EnterFrame() noexcept {
last_enter = SDL_GetTicks();