summary refs log tree commit diff stats
path: root/src/renderer.cpp
diff options
context:
space:
mode:
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));