diff --git a/data/maps/sample1.tmx b/data/maps/sample1.tmx index a2a9f1c..84163fd 100644 --- a/data/maps/sample1.tmx +++ b/data/maps/sample1.tmx @@ -11,4 +11,9 @@ eJztmztvE0EURseh4Q0JUEIBDY8ECIgSJKDgFSBJTZAgBaEj1AgJKAgFzxpo7UgohIgy5A8QkQL4FTikAHrulfey15Nd74y9u0mY70if7F2vYmuO7p2ZtWNMa6YqxjynvKtkXAhKgX0swUfpfKXx/kb5bo07+/gJH6Xzi8b7N+Wj5YR9LMJH6bCP413GnKD8sXwswEfpSH0k+UC/Kp8d5GFnlF1d8fnVtL46TTmTkrMr+LnKpJ35Y5AylJLhNj8Hu9hHuZmSvSYMJ+34uEOZUZlW6Tf+TrJcSEY9/+5aROaPecrWruzrGfYxbpJ9fKDc9fwMN0y2i5B81D3nEF0f4mA8Cnx0Rh/VxDPy8N6jRqQ+pEb4cdrEjorwwR/rkeffXavIPRPX+ybsQ2pCHmei5+ylCB8h1IYgNeLq4wWlx8S1oXtVN+WV5/trH1wH60y4tSH4zuvs5GVCfF0wD0zsYDQ6fqgSmgvGt2fljdRIKPuMLKRnLXquffNC1wicNPCdR/JGzyMhzd+taGd/mBd2jYR03yqNdueRjXTtpiibO6gte+0buhe9P8zyoR3U6fhQpZEfpn03sray17wh968px/36wUrsIC3ipl0vIa95Bb3WalUjLj60l076WOi41IiPDzjpDPlepNV367aPz3TuUiXOvEl3soU9U7bBjxMu931tH72U7ZRuSk8luX7Y2QA99lEO89rawIkrshepp9RIko+jlH7KsRQfvVFtLJmGDzhxJ2u/nuRjkDJEGW7hQ2pDh52gf2Uj80hSz7pozRF632HvSbJ82F7gJhn5vVxajdhOspLlw3YDJ81Iz2r1/To7SVtPdeIDTpKRe1pZ+3UXL74+4GQ5ss5y/Z1WKy/s4zL3QOPn5Ah8/EN61oJDjWiS5hbZD7KTKx5e4KMZ+Z2vy31fTSsnTFatfDENb1fho4lOvs9NctKrxldqJSnwkI6eR9pxou9tDWCcO0avfdPuoYByWenfoYDlyNzuu94CxSA1Uq/gf91WC67f6YLykPso8FEM5yjnKRccr+caecr7NswfHSNjL2EHtyhjlP3G3QnIBxn7ahR2cIAySalFxz614sM1ygjlesK5kYTXQkB8yPhXo2NJLXqtCC/3KHOUkyYedz43G0VeC8nLY8oG0xh37YEdVE3sSJ7n6UXG/pOJndg+5tTroXjhGpk0sQN5PqaOa9bx7Rze9zVlj2mMN48/j/kpE3uYM81utLf/GakRu0/pfqXrROaZPGpEOxEvevyTzt/P4X1XO+JE+pK40HPKpDrHx3nUCMNO3piGF+lfOrpW+DgEHwz3rbS6mFSRa/JeD0ut6HlDfMyq5yH5kDlEasKeN7QTPpdXjQi6f2kv8sheQvMxph61j1rCa3n7YHSdiAPds0LzIb3KrhVxUlPXFOGD0XOK7lu7KW8Les/VBvuQvqTHvmod63VxUT4E8SIJxQWj94Z6HWX74KynTFCerMgnDQd2MuEQeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARfIXqGm/kQ== + + + eJzt0bEJAEAIBEHtv87vQ8w/V2EGLj/YCAAAAAAAAAAA4LKX0w9o3eE3Zuixix4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXFPX2xET + + diff --git a/src/saland/Game.cpp b/src/saland/Game.cpp index b79502f..756cca6 100644 --- a/src/saland/Game.cpp +++ b/src/saland/Game.cpp @@ -2,6 +2,7 @@ #include "../sagotmx/tmx_struct.h" #include "../sago/SagoMisc.hpp" #include "globals.hpp" +#include "model/placeables.hpp" static void Draw(SDL_Renderer* target, SDL_Texture* t, int x, int y, const SDL_Rect& part) { SDL_Rect pos = {}; @@ -12,7 +13,7 @@ static void Draw(SDL_Renderer* target, SDL_Texture* t, int x, int y, const SDL_R SDL_RenderCopy(target, t, &part, &pos); } -static void DrawLayer(SDL_Renderer* renderer, SDL_Texture* texture, const sago::tiled::TileMap& tm, size_t layer) { +static void DrawLayer(SDL_Renderer* renderer, SDL_Texture* texture, const sago::tiled::TileMap& tm, size_t layer, int topx, int topy) { for (int i = 0; i < tm.height; ++i) { for (int j = 0; j < tm.width; ++j) { uint32_t gid = sago::tiled::getTileFromLayer(tm, tm.layers.at(layer), i, j); @@ -21,17 +22,34 @@ static void DrawLayer(SDL_Renderer* renderer, SDL_Texture* texture, const sago:: } SDL_Rect part{}; getTextureLocationFromGid(tm, gid, nullptr, &part.x, &part.y, &part.w, &part.h); - Draw(renderer, texture, 32*i, 32*j, part); + Draw(renderer, texture, 32*i-topx, 32*j-topy, part); } } } +struct Game::GameImpl { + std::vector > placeables; + float time = 0.0; + std::shared_ptr human; + int center_x = 0; + int center_y = 0; + bool drawCollision = true; + sago::tiled::TileSet ts; + sago::tiled::TileMap tm; + float topx = 0.0; + float topy = 0.0; + char direction = 0; + Uint32 lastUpdate = 0; +}; + Game::Game() { + data.reset(new Game::GameImpl()); std::string tsx_file = sago::GetFileContent("maps/terrain.tsx"); std::string tmx_file = sago::GetFileContent("maps/sample1.tmx"); - ts = sago::tiled::string2tileset(tsx_file); - tm = sago::tiled::string2tilemap(tmx_file); - tm.tileset.alternativeSource = &ts; + data->ts = sago::tiled::string2tileset(tsx_file); + data->tm = sago::tiled::string2tilemap(tmx_file); + data->tm.tileset.alternativeSource = &data->ts; + data->lastUpdate = SDL_GetTicks(); } Game::~Game() { @@ -43,15 +61,48 @@ bool Game::IsActive() { void Game::Draw(SDL_Renderer* target) { SDL_Texture* texture = globalData.spriteHolder->GetDataHolder().getTexturePtr("terrain"); - for (size_t i = 0; i < tm.layers.size(); ++i ) { - DrawLayer(target, texture, tm, i); + for (size_t i = 0; i < data->tm.layers.size(); ++i ) { + DrawLayer(target, texture, data->tm, i, data->topx, data->topy); } } void Game::ProcessInput(const SDL_Event& event, bool& processed) { - + data->direction = 0; + if ( event.type == SDL_KEYDOWN ) { + if (event.key.keysym.sym == SDLK_DOWN) { + data->direction = 'S'; + processed = true; + } + if (event.key.keysym.sym == SDLK_UP) { + data->direction = 'N'; + processed = true; + } + if (event.key.keysym.sym == SDLK_LEFT) { + data->direction = 'W'; + processed = true; + } + if (event.key.keysym.sym == SDLK_RIGHT) { + data->direction = 'E'; + processed = true; + } + } } void Game::Update() { + Uint32 nowTime = SDL_GetTicks(); + Uint32 deltaTime = nowTime - data->lastUpdate; + if (data->direction == 'S') { + data->topy += deltaTime/10.0f; + } + if (data->direction == 'N') { + data->topy -= deltaTime/10.0f; + } + if (data->direction == 'E') { + data->topx += deltaTime/10.0f; + } + if (data->direction == 'W') { + data->topx -= deltaTime/10.0f; + } + data->lastUpdate = nowTime; } diff --git a/src/saland/Game.hpp b/src/saland/Game.hpp index f74db04..917ee15 100644 --- a/src/saland/Game.hpp +++ b/src/saland/Game.hpp @@ -1,6 +1,8 @@ #ifndef GAME_HPP #define GAME_HPP +#include + #include "../sago/GameStateInterface.hpp" #include "../sagotmx/tmx_struct.h" @@ -13,8 +15,8 @@ public: virtual void Update() override; virtual ~Game(); private: - sago::tiled::TileSet ts; - sago::tiled::TileMap tm; + struct GameImpl; + std::unique_ptr data; }; #endif /* GAME_HPP */ diff --git a/src/saland/model/placeables.hpp b/src/saland/model/placeables.hpp new file mode 100644 index 0000000..3068991 --- /dev/null +++ b/src/saland/model/placeables.hpp @@ -0,0 +1,35 @@ +#ifndef PLACEABLES_HPP +#define PLACEABLES_HPP + +#include + +class Placeable { +public: + float X = 20.0; + float Y = 20.0; + float Radius = 0.0; + virtual bool isStatic() {return true; } +}; + +class MistItem : public Placeable { +public: + std::string sprite; +}; + +class Creature : public Placeable { +public: + float health = 10.0; + float stinema = 10.0; + float mana = 10.0; + char direction = 'S'; + bool moving = false; + virtual bool isStatic() override { return false; } +}; + +class Human : public Creature { +public: + std::string race = "male"; +}; + +#endif /* PLACEABLES_HPP */ +