summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game.h9
-rw-r--r--src/main.cpp2
-rw-r--r--src/renderer.cpp65
-rw-r--r--src/renderer.h6
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
9struct Input { 10struct 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
57private: 65private:
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
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));
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
11class Game; 12class Game;
12 13
@@ -121,12 +122,17 @@ public:
121 122
122private: 123private:
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 */