diff options
author | Kelly Rauchenberger <fefferburbia@gmail.com> | 2021-02-02 13:01:35 -0500 |
---|---|---|
committer | Kelly Rauchenberger <fefferburbia@gmail.com> | 2021-02-02 13:01:35 -0500 |
commit | 7166c9b831f9c6a50ba42272682b776d01e5703e (patch) | |
tree | b27c4b695a8cd5f64c680e358bb919e86ef7cd74 /src/renderer.cpp | |
parent | 362c332000a65acc060660dcb6bb0ec6f99cbafe (diff) | |
download | tanetane-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.cpp | 65 |
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 | ||
32 | texture_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 | |||
32 | void Renderer::render(Game& game) { | 70 | void 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)); |