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 | |
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')
-rw-r--r-- | src/game.h | 9 | ||||
-rw-r--r-- | src/main.cpp | 2 | ||||
-rw-r--r-- | src/renderer.cpp | 65 | ||||
-rw-r--r-- | src/renderer.h | 6 |
4 files changed, 80 insertions, 2 deletions
diff --git a/src/game.h b/src/game.h index 274ef2e..e5976b1 100644 --- a/src/game.h +++ b/src/game.h | |||
@@ -4,6 +4,7 @@ | |||
4 | #include <set> | 4 | #include <set> |
5 | #include <range/v3/all.hpp> | 5 | #include <range/v3/all.hpp> |
6 | #include <vector> | 6 | #include <vector> |
7 | #include <tileson.hpp> | ||
7 | #include "sprite.h" | 8 | #include "sprite.h" |
8 | 9 | ||
9 | struct Input { | 10 | struct Input { |
@@ -54,10 +55,18 @@ public: | |||
54 | } | 55 | } |
55 | } | 56 | } |
56 | 57 | ||
58 | void loadMapFromFile(std::string_view filename) { | ||
59 | tson::Tileson t; | ||
60 | map_ = t.parse(fs::path(filename)); | ||
61 | } | ||
62 | |||
63 | tson::Map* getMap() const { return map_.get(); } | ||
64 | |||
57 | private: | 65 | private: |
58 | 66 | ||
59 | std::vector<Sprite> sprites_; | 67 | std::vector<Sprite> sprites_; |
60 | std::set<std::tuple<int, int>> spritesByY_; | 68 | std::set<std::tuple<int, int>> spritesByY_; |
69 | std::unique_ptr<tson::Map> map_; | ||
61 | }; | 70 | }; |
62 | 71 | ||
63 | #endif /* end of include guard: GAME_H_E6F1396E */ | 72 | #endif /* end of include guard: GAME_H_E6F1396E */ |
diff --git a/src/main.cpp b/src/main.cpp index ea8d8f4..df0bfff 100644 --- a/src/main.cpp +++ b/src/main.cpp | |||
@@ -8,6 +8,8 @@ void loop(Renderer& renderer) { | |||
8 | Game game; | 8 | Game game; |
9 | Input keystate; | 9 | Input keystate; |
10 | 10 | ||
11 | game.loadMapFromFile("../res/map1.json"); | ||
12 | |||
11 | int lucasSprite = game.addSprite(Sprite("../res/lucas_anim.txt", renderer)); | 13 | int lucasSprite = game.addSprite(Sprite("../res/lucas_anim.txt", renderer)); |
12 | int kumaSprite = game.addSprite(Sprite("../res/kuma_anim.txt", renderer)); | 14 | int kumaSprite = game.addSprite(Sprite("../res/kuma_anim.txt", renderer)); |
13 | int dusterSprite = game.addSprite(Sprite("../res/duster_anim.txt", renderer)); | 15 | int dusterSprite = game.addSprite(Sprite("../res/duster_anim.txt", renderer)); |
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)); |
diff --git a/src/renderer.h b/src/renderer.h index abedb62..9573d8c 100644 --- a/src/renderer.h +++ b/src/renderer.h | |||
@@ -7,6 +7,7 @@ | |||
7 | #include <memory> | 7 | #include <memory> |
8 | #include <string_view> | 8 | #include <string_view> |
9 | #include <vector> | 9 | #include <vector> |
10 | #include <tileson.hpp> | ||
10 | 11 | ||
11 | class Game; | 12 | class Game; |
12 | 13 | ||
@@ -121,12 +122,17 @@ public: | |||
121 | 122 | ||
122 | private: | 123 | private: |
123 | 124 | ||
125 | texture_ptr renderMapLayer(const tson::Layer& layer); | ||
126 | |||
124 | sdl_wrapper sdl_; | 127 | sdl_wrapper sdl_; |
125 | img_wrapper img_; | 128 | img_wrapper img_; |
126 | window_ptr win_; | 129 | window_ptr win_; |
127 | renderer_ptr ren_; | 130 | renderer_ptr ren_; |
128 | 131 | ||
129 | std::vector<texture_ptr> textures_; | 132 | std::vector<texture_ptr> textures_; |
133 | int tilesetTexId_ = -1; | ||
134 | texture_ptr renLay0_; | ||
135 | texture_ptr renLay1_; | ||
130 | }; | 136 | }; |
131 | 137 | ||
132 | #endif /* end of include guard: RENDERER_H_6A58EC30 */ | 138 | #endif /* end of include guard: RENDERER_H_6A58EC30 */ |