summary refs log tree commit diff stats
path: root/src/renderer.cpp
diff options
context:
space:
mode:
authorKelly Rauchenberger <fefferburbia@gmail.com>2021-02-02 15:36:09 -0500
committerKelly Rauchenberger <fefferburbia@gmail.com>2021-02-02 15:36:09 -0500
commita475b843e7d37f128ce30140d193f0312aa70c9c (patch)
tree99432d35d61aa14c1ac17311694a8ae62675d3a6 /src/renderer.cpp
parent7166c9b831f9c6a50ba42272682b776d01e5703e (diff)
downloadtanetane-a475b843e7d37f128ce30140d193f0312aa70c9c.tar.gz
tanetane-a475b843e7d37f128ce30140d193f0312aa70c9c.tar.bz2
tanetane-a475b843e7d37f128ce30140d193f0312aa70c9c.zip
Using tmxlite instead of Tileson
Diffstat (limited to 'src/renderer.cpp')
-rw-r--r--src/renderer.cpp67
1 files changed, 38 insertions, 29 deletions
diff --git a/src/renderer.cpp b/src/renderer.cpp index 45b9045..9d20fee 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp
@@ -1,6 +1,7 @@
1#include "renderer.h" 1#include "renderer.h"
2#include "consts.h" 2#include "consts.h"
3#include "game.h" 3#include "game.h"
4#include "map.h"
4 5
5Renderer::Renderer() { 6Renderer::Renderer() {
6 win_ = window_ptr( 7 win_ = window_ptr(
@@ -29,14 +30,16 @@ Renderer::Renderer() {
29 } 30 }
30} 31}
31 32
32texture_ptr Renderer::renderMapLayer(const tson::Layer& layer) { 33texture_ptr Renderer::renderMapLayer(const Map& map, int layer) {
34 vec2i mapBounds = map.getMapSize() * map.getTileSize();
35
33 texture_ptr canvas( 36 texture_ptr canvas(
34 SDL_CreateTexture( 37 SDL_CreateTexture(
35 ren_.get(), 38 ren_.get(),
36 SDL_PIXELFORMAT_RGBA8888, 39 SDL_PIXELFORMAT_RGBA8888,
37 SDL_TEXTUREACCESS_TARGET, 40 SDL_TEXTUREACCESS_TARGET,
38 layer.getMap()->getSize().x * layer.getMap()->getTileSize().x, 41 mapBounds.w(),
39 layer.getMap()->getSize().y * layer.getMap()->getTileSize().y)); 42 mapBounds.h()));
40 43
41 SDL_SetTextureBlendMode(canvas.get(), SDL_BLENDMODE_BLEND); 44 SDL_SetTextureBlendMode(canvas.get(), SDL_BLENDMODE_BLEND);
42 45
@@ -45,38 +48,44 @@ texture_ptr Renderer::renderMapLayer(const tson::Layer& layer) {
45 SDL_SetRenderDrawColor(ren_.get(), 255, 255, 255, 0); 48 SDL_SetRenderDrawColor(ren_.get(), 255, 255, 255, 0);
46 SDL_RenderClear(ren_.get()); 49 SDL_RenderClear(ren_.get());
47 50
48 for (auto& [pos, tileObject] : layer.getTileObjects()) { 51 const std::vector<Tile>& tiles = map.getLayers().at(layer);
49 int x = tileObject.getPosition().x; 52 for (int y = 0; y < map.getMapSize().h(); y++) {
50 int y = tileObject.getPosition().y; 53 for (int x = 0; x < map.getMapSize().w(); x++) {
51 tson::Rect tileDestRect = tileObject.getDrawingRect(); 54 const Tile& tile = tiles.at(x + y * map.getMapSize().w());
52 SDL_Rect srcRect { tileDestRect.x, tileDestRect.y, tileDestRect.width, tileDestRect.height }; 55
53 SDL_Rect destRect { 56 SDL_Rect srcRect {
54 x, y, tileObject.getTile()->getTileSize().x, tileObject.getTile()->getTileSize().y }; 57 static_cast<int>((tile.id % map.getTilesetColumns()) * map.getTileSize().w()),
55 58 static_cast<int>((tile.id / map.getTilesetColumns()) * map.getTileSize().h()),
56 SDL_RendererFlip flip = SDL_FLIP_NONE; 59 map.getTileSize().w(),
57 if (tileObject.getTile()->hasFlipFlags(tson::TileFlipFlags::Horizontally | tson::TileFlipFlags::Vertically)) { 60 map.getTileSize().h() };
58 flip = static_cast<SDL_RendererFlip>(SDL_FLIP_HORIZONTAL | SDL_FLIP_VERTICAL); 61
59 } else if (tileObject.getTile()->hasFlipFlags(tson::TileFlipFlags::Horizontally)) { 62 SDL_Rect destRect {
60 flip = SDL_FLIP_HORIZONTAL; 63 x * map.getTileSize().w(),
61 } else if (tileObject.getTile()->hasFlipFlags(tson::TileFlipFlags::Vertically)) { 64 y * map.getTileSize().h(),
62 flip = SDL_FLIP_VERTICAL; 65 map.getTileSize().w(),
66 map.getTileSize().h() };
67
68 SDL_RendererFlip flip = SDL_FLIP_NONE;
69 if (tile.flipHorizontal && tile.flipVertical) {
70 flip = static_cast<SDL_RendererFlip>(SDL_FLIP_HORIZONTAL | SDL_FLIP_VERTICAL);
71 } else if (tile.flipHorizontal) {
72 flip = SDL_FLIP_HORIZONTAL;
73 } else if (tile.flipVertical) {
74 flip = SDL_FLIP_VERTICAL;
75 }
76 SDL_RenderCopyEx(ren_.get(), textures_[map.getTilesetTextureId()].get(), &srcRect, &destRect, 0, nullptr, flip);
63 } 77 }
64 SDL_RenderCopyEx(ren_.get(), textures_[tilesetTexId_].get(), &srcRect, &destRect, 0, nullptr, flip);
65 } 78 }
66 79
67 return canvas; 80 return canvas;
68} 81}
69 82
70void Renderer::render(Game& game) { 83void Renderer::render(Game& game) {
71 if (tilesetTexId_ == -1) {
72 tilesetTexId_ = loadImageFromFile(game.getMap()->getTileset("fromRom")->getImage().c_str());
73 }
74
75 if (!renLay1_) { 84 if (!renLay1_) {
76 renLay1_ = renderMapLayer(*game.getMap()->getLayer("Layer 1")); 85 renLay1_ = renderMapLayer(game.getMap(), 0);
77 } 86 }
78 if (!renLay0_) { 87 if (!renLay0_) {
79 renLay0_ = renderMapLayer(*game.getMap()->getLayer("Layer 0")); 88 renLay0_ = renderMapLayer(game.getMap(), 1);
80 } 89 }
81 90
82 texture_ptr canvas( 91 texture_ptr canvas(
@@ -91,15 +100,15 @@ void Renderer::render(Game& game) {
91 throw sdl_error(); 100 throw sdl_error();
92 } 101 }
93 102
94
95
96 SDL_SetRenderTarget(ren_.get(), canvas.get()); 103 SDL_SetRenderTarget(ren_.get(), canvas.get());
97 SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE); 104 SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE);
98 SDL_SetRenderDrawColor(ren_.get(), 255, 255, 255, 255); 105 SDL_SetRenderDrawColor(ren_.get(), 255, 255, 255, 255);
99 SDL_RenderClear(ren_.get()); 106 SDL_RenderClear(ren_.get());
100 107
108 vec2i mapBounds = game.getMap().getMapSize() * game.getMap().getTileSize();
109
101 { 110 {
102 SDL_Rect dest { -80, -80, game.getMap()->getSize().x * game.getMap()->getTileSize().x, game.getMap()->getSize().y * game.getMap()->getTileSize().y }; 111 SDL_Rect dest { -80, -80, mapBounds.w(), mapBounds.h() };
103 SDL_RenderCopy(ren_.get(), renLay1_.get(), nullptr, &dest); 112 SDL_RenderCopy(ren_.get(), renLay1_.get(), nullptr, &dest);
104 } 113 }
105 114
@@ -111,7 +120,7 @@ void Renderer::render(Game& game) {
111 } 120 }
112 121
113 { 122 {
114 SDL_Rect dest { -80, -80, game.getMap()->getSize().x * game.getMap()->getTileSize().x, game.getMap()->getSize().y * game.getMap()->getTileSize().y }; 123 SDL_Rect dest { -80, -80, mapBounds.w(), mapBounds.h() };
115 SDL_RenderCopy(ren_.get(), renLay0_.get(), nullptr, &dest); 124 SDL_RenderCopy(ren_.get(), renLay0_.get(), nullptr, &dest);
116 } 125 }
117 126