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 13:01:35 -0500
committerKelly Rauchenberger <fefferburbia@gmail.com>2021-02-02 13:01:35 -0500
commit7166c9b831f9c6a50ba42272682b776d01e5703e (patch)
treeb27c4b695a8cd5f64c680e358bb919e86ef7cd74 /src/renderer.cpp
parent362c332000a65acc060660dcb6bb0ec6f99cbafe (diff)
downloadtanetane-7166c9b831f9c6a50ba42272682b776d01e5703e.tar.gz
tanetane-7166c9b831f9c6a50ba42272682b776d01e5703e.tar.bz2
tanetane-7166c9b831f9c6a50ba42272682b776d01e5703e.zip
Map rendering Works but I don't want to use Tileson so I'm gonna change that
Mainly bc Tileson requires std::filesystem, which my clang is too old for apparently, and while I can use gcc instead I just want to not, I suppose. Also Tileson's API is very weird RE const correctness? Idk. And also being able to parse the tmx files rather than exporting to json would be preferable.
Diffstat (limited to 'src/renderer.cpp')
-rw-r--r--src/renderer.cpp65
1 files changed, 63 insertions, 2 deletions
diff --git a/src/renderer.cpp b/src/renderer.cpp index 931e699..45b9045 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp
@@ -29,7 +29,56 @@ Renderer::Renderer() {
29 } 29 }
30} 30}
31 31
32texture_ptr Renderer::renderMapLayer(const tson::Layer& layer) {
33 texture_ptr canvas(
34 SDL_CreateTexture(
35 ren_.get(),
36 SDL_PIXELFORMAT_RGBA8888,
37 SDL_TEXTUREACCESS_TARGET,
38 layer.getMap()->getSize().x * layer.getMap()->getTileSize().x,
39 layer.getMap()->getSize().y * layer.getMap()->getTileSize().y));
40
41 SDL_SetTextureBlendMode(canvas.get(), SDL_BLENDMODE_BLEND);
42
43 SDL_SetRenderTarget(ren_.get(), canvas.get());
44 SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_BLEND);
45 SDL_SetRenderDrawColor(ren_.get(), 255, 255, 255, 0);
46 SDL_RenderClear(ren_.get());
47
48 for (auto& [pos, tileObject] : layer.getTileObjects()) {
49 int x = tileObject.getPosition().x;
50 int y = tileObject.getPosition().y;
51 tson::Rect tileDestRect = tileObject.getDrawingRect();
52 SDL_Rect srcRect { tileDestRect.x, tileDestRect.y, tileDestRect.width, tileDestRect.height };
53 SDL_Rect destRect {
54 x, y, tileObject.getTile()->getTileSize().x, tileObject.getTile()->getTileSize().y };
55
56 SDL_RendererFlip flip = SDL_FLIP_NONE;
57 if (tileObject.getTile()->hasFlipFlags(tson::TileFlipFlags::Horizontally | tson::TileFlipFlags::Vertically)) {
58 flip = static_cast<SDL_RendererFlip>(SDL_FLIP_HORIZONTAL | SDL_FLIP_VERTICAL);
59 } else if (tileObject.getTile()->hasFlipFlags(tson::TileFlipFlags::Horizontally)) {
60 flip = SDL_FLIP_HORIZONTAL;
61 } else if (tileObject.getTile()->hasFlipFlags(tson::TileFlipFlags::Vertically)) {
62 flip = SDL_FLIP_VERTICAL;
63 }
64 SDL_RenderCopyEx(ren_.get(), textures_[tilesetTexId_].get(), &srcRect, &destRect, 0, nullptr, flip);
65 }
66
67 return canvas;
68}
69
32void Renderer::render(Game& game) { 70void Renderer::render(Game& game) {
71 if (tilesetTexId_ == -1) {
72 tilesetTexId_ = loadImageFromFile(game.getMap()->getTileset("fromRom")->getImage().c_str());
73 }
74
75 if (!renLay1_) {
76 renLay1_ = renderMapLayer(*game.getMap()->getLayer("Layer 1"));
77 }
78 if (!renLay0_) {
79 renLay0_ = renderMapLayer(*game.getMap()->getLayer("Layer 0"));
80 }
81
33 texture_ptr canvas( 82 texture_ptr canvas(
34 SDL_CreateTexture( 83 SDL_CreateTexture(
35 ren_.get(), 84 ren_.get(),
@@ -38,16 +87,22 @@ void Renderer::render(Game& game) {
38 CANVAS_WIDTH, 87 CANVAS_WIDTH,
39 CANVAS_HEIGHT)); 88 CANVAS_HEIGHT));
40 89
41 if (!canvas) 90 if (!canvas) {
42 {
43 throw sdl_error(); 91 throw sdl_error();
44 } 92 }
45 93
94
95
46 SDL_SetRenderTarget(ren_.get(), canvas.get()); 96 SDL_SetRenderTarget(ren_.get(), canvas.get());
47 SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE); 97 SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE);
48 SDL_SetRenderDrawColor(ren_.get(), 255, 255, 255, 255); 98 SDL_SetRenderDrawColor(ren_.get(), 255, 255, 255, 255);
49 SDL_RenderClear(ren_.get()); 99 SDL_RenderClear(ren_.get());
50 100
101 {
102 SDL_Rect dest { -80, -80, game.getMap()->getSize().x * game.getMap()->getTileSize().x, game.getMap()->getSize().y * game.getMap()->getTileSize().y };
103 SDL_RenderCopy(ren_.get(), renLay1_.get(), nullptr, &dest);
104 }
105
51 for (const Sprite& sprite : game.getSpritesByY() | game.spriteView()) { 106 for (const Sprite& sprite : game.getSpritesByY() | game.spriteView()) {
52 const SpriteFrame& frame = sprite.getFrame(); 107 const SpriteFrame& frame = sprite.getFrame();
53 const SDL_Rect& src = frame.srcRect; 108 const SDL_Rect& src = frame.srcRect;
@@ -55,6 +110,11 @@ void Renderer::render(Game& game) {
55 SDL_RenderCopy(ren_.get(), textures_.at(sprite.getTextureId()).get(), &src, &dest); 110 SDL_RenderCopy(ren_.get(), textures_.at(sprite.getTextureId()).get(), &src, &dest);
56 } 111 }
57 112
113 {
114 SDL_Rect dest { -80, -80, game.getMap()->getSize().x * game.getMap()->getTileSize().x, game.getMap()->getSize().y * game.getMap()->getTileSize().y };
115 SDL_RenderCopy(ren_.get(), renLay0_.get(), nullptr, &dest);
116 }
117
58 SDL_SetRenderTarget(ren_.get(), nullptr); 118 SDL_SetRenderTarget(ren_.get(), nullptr);
59 SDL_RenderCopy(ren_.get(), canvas.get(), nullptr, nullptr); 119 SDL_RenderCopy(ren_.get(), canvas.get(), nullptr, nullptr);
60 SDL_RenderPresent(ren_.get()); 120 SDL_RenderPresent(ren_.get());
@@ -68,6 +128,7 @@ int Renderer::loadImageFromFile(std::string_view filename) {
68 } 128 }
69 129
70 texture_ptr tex = texture_ptr(SDL_CreateTextureFromSurface(ren_.get(), pfs.get())); 130 texture_ptr tex = texture_ptr(SDL_CreateTextureFromSurface(ren_.get(), pfs.get()));
131 //SDL_SetTextureBlendMode(tex, SDL_BLENDMODE_BLEND);
71 132
72 int texId = textures_.size(); 133 int texId = textures_.size();
73 textures_.push_back(std::move(tex)); 134 textures_.push_back(std::move(tex));