summaryrefslogtreecommitdiffstats
path: root/src/view/MapView.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/view/MapView.hpp')
-rw-r--r--src/view/MapView.hpp114
1 files changed, 5 insertions, 109 deletions
diff --git a/src/view/MapView.hpp b/src/view/MapView.hpp
index e3fccc6..e5f0e50 100644
--- a/src/view/MapView.hpp
+++ b/src/view/MapView.hpp
@@ -46,116 +46,12 @@ private:
public:
MapView(const std::shared_ptr<Window> &window0,
- const std::shared_ptr<const Model::Map> &map0,
- const std::vector<SDL_Surface *> &tiles,
- const std::map<std::string, SDL_Surface *> &entities)
- : window(window0), map(map0) {
- uint32_t rmask, gmask, bmask, amask;
+ const std::shared_ptr<const Model::Map> &map0,
+ const std::vector<SDL_Surface *> &tiles,
+ const std::map<std::string, SDL_Surface *> &entities);
+ ~MapView();
-#if SDL_BYTEORDER == SDL_BIG_ENDIAN
- rmask = 0xff000000;
- gmask = 0x00ff0000;
- bmask = 0x0000ff00;
- amask = 0x000000ff;
-#else
- rmask = 0x000000ff;
- gmask = 0x0000ff00;
- bmask = 0x00ff0000;
- amask = 0xff000000;
-#endif
-
- SDL_Surface *surface = SDL_CreateRGBSurface(0, 16*tiles.size(), 16, 32, rmask, gmask, bmask, amask);
- SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_NONE);
-
- for (size_t i = 0; i < tiles.size(); i++) {
- SDL_Rect rect = {
- .x = int(16*i),
- .y = 0,
- .w = 0,
- .h = 0,
- };
-
- SDL_BlitSurface(tiles[i], nullptr, surface, &rect);
- }
-
- tileTexture = SDL_CreateTextureFromSurface(window->getRenderer(), surface);
- SDL_FreeSurface(surface);
-
- for (const std::pair<std::string, SDL_Surface *> &entity : entities) {
- entityTextures[entity.first] = SDL_CreateTextureFromSurface(window->getRenderer(), entity.second);
- }
- }
-
- ~MapView() {
- SDL_DestroyTexture(tileTexture);
-
- for (const std::pair<std::string, SDL_Texture *> &entity : entityTextures)
- SDL_DestroyTexture(entity.second);
- }
-
- void render(float centerX, float centerY) {
- SDL_RenderClear(window->getRenderer());
-
- std::pair<int, int> viewport = window->getViewport();
-
- float pixels = std::max(viewport.first/16.0f, viewport.second/12.0f);
- int tilePixels = 16 * std::ceil(pixels / 16);
-
- float tilesW = viewport.first / tilePixels;
- float tilesH = viewport.second / tilePixels;
-
- int minX = std::floor(centerX - tilesW/2 - 0.5f), maxX = std::ceil(centerX + tilesW/2 + 0.5f);
- int minY = std::floor(centerY - tilesH/2 - 0.5f), maxY = std::ceil(centerY + tilesH/2 + 0.5f);
-
- int baseX = viewport.first/2 - (centerX + 0.5f)*tilePixels, baseY = viewport.second/2 - (centerY + 0.5f)*tilePixels;
-
- for (int x = minX; x <= maxX; x++) {
- for (int y = minY; y <= maxY; y++) {
- uint32_t tile = map->getTileAt(x, y);
- if (!tile)
- continue;
-
- SDL_Rect src = {
- .x = int(16*(tile-1)),
- .y = 0,
- .w = 16,
- .h = 16,
- };
-
- SDL_Rect dst = {
- .x = baseX + x*tilePixels,
- .y = baseY + y*tilePixels,
- .w = tilePixels,
- .h = tilePixels,
- };
-
- SDL_RenderCopy(window->getRenderer(), tileTexture, &src, &dst);
- }
- }
-
- for (const std::shared_ptr<Model::Entity> &entity : map->getEntities()) {
- std::pair<float, float> pos = entity->getPosition();
- Direction dir = entity->getDirection();
-
- SDL_Rect src = {
- .x = 16*dir,
- .y = 0,
- .w = 16,
- .h = 16,
- };
-
- SDL_Rect dst = {
- .x = baseX + int(pos.first*tilePixels),
- .y = baseY + int(pos.second*tilePixels),
- .w = tilePixels,
- .h = tilePixels,
- };
-
- SDL_RenderCopy(window->getRenderer(), entityTextures[entity->getName()], &src, &dst);
- }
-
- SDL_RenderPresent(window->getRenderer());
- }
+ void render(float centerX, float centerY);
};
}