summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt1
-rw-r--r--res/lucas.pngbin0 -> 1663 bytes
-rw-r--r--src/game.h29
-rw-r--r--src/main.cpp8
-rw-r--r--src/renderer.cpp186
-rw-r--r--src/renderer.h8
-rw-r--r--src/sprite.cpp6
-rw-r--r--src/sprite.h33
8 files changed, 106 insertions, 165 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 55237fa..590577a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt
@@ -28,6 +28,7 @@ link_directories(
28add_executable(tanetane 28add_executable(tanetane
29 src/main.cpp 29 src/main.cpp
30 src/renderer.cpp 30 src/renderer.cpp
31 src/sprite.cpp
31) 32)
32 33
33set_property(TARGET tanetane PROPERTY CXX_STANDARD 17) 34set_property(TARGET tanetane PROPERTY CXX_STANDARD 17)
diff --git a/res/lucas.png b/res/lucas.png new file mode 100644 index 0000000..9c5a067 --- /dev/null +++ b/res/lucas.png
Binary files differ
diff --git a/src/game.h b/src/game.h new file mode 100644 index 0000000..46f1ab2 --- /dev/null +++ b/src/game.h
@@ -0,0 +1,29 @@
1#ifndef GAME_H_E6F1396E
2#define GAME_H_E6F1396E
3
4#include <vector>
5#include "sprite.h"
6
7class Game {
8public:
9
10 int addSprite(Sprite sprite) {
11 int id = sprites_.size();
12 sprites_.push_back(std::move(sprite));
13 return id;
14 }
15
16 Sprite& getSprite(int id) {
17 return sprites_.at(id);
18 }
19
20 std::vector<Sprite>& getSprites() {
21 return sprites_;
22 }
23
24private:
25
26 std::vector<Sprite> sprites_;
27};
28
29#endif /* end of include guard: GAME_H_E6F1396E */
diff --git a/src/main.cpp b/src/main.cpp index 2da7d9a..e91f8f0 100644 --- a/src/main.cpp +++ b/src/main.cpp
@@ -1,7 +1,13 @@
1#include <iostream> 1#include <iostream>
2#include "renderer.h" 2#include "renderer.h"
3#include "game.h"
3 4
4void loop(Renderer& renderer) { 5void loop(Renderer& renderer) {
6 Game game;
7 game.addSprite(Sprite("../res/lucas.png", renderer));
8
9 renderer.render(game);
10
5 for (;;) { 11 for (;;) {
6 SDL_Event e; 12 SDL_Event e;
7 while (SDL_PollEvent(&e)) 13 while (SDL_PollEvent(&e))
@@ -11,6 +17,8 @@ void loop(Renderer& renderer) {
11 return; 17 return;
12 } 18 }
13 } 19 }
20
21 renderer.render(game);
14 } 22 }
15} 23}
16 24
diff --git a/src/renderer.cpp b/src/renderer.cpp index e29d8cd..3bd0beb 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp
@@ -1,8 +1,8 @@
1#include "renderer.h" 1#include "renderer.h"
2#include "consts.h" 2#include "consts.h"
3#include "game.h"
3 4
4Renderer::Renderer() 5Renderer::Renderer() {
5{
6 win_ = window_ptr( 6 win_ = window_ptr(
7 SDL_CreateWindow( 7 SDL_CreateWindow(
8 "Tanetane", 8 "Tanetane",
@@ -29,15 +29,14 @@ Renderer::Renderer()
29 } 29 }
30} 30}
31 31
32/*void Renderer::render() 32void Renderer::render(Game& game) {
33{
34 texture_ptr canvas( 33 texture_ptr canvas(
35 SDL_CreateTexture( 34 SDL_CreateTexture(
36 ren_.get(), 35 ren_.get(),
37 SDL_PIXELFORMAT_RGBA8888, 36 SDL_PIXELFORMAT_RGBA8888,
38 SDL_TEXTUREACCESS_TARGET, 37 SDL_TEXTUREACCESS_TARGET,
39 TILE_WIDTH * game.map.getWidth(), 38 GAME_WIDTH,
40 TILE_HEIGHT * game.map.getHeight())); 39 GAME_HEIGHT));
41 40
42 if (!canvas) 41 if (!canvas)
43 { 42 {
@@ -46,171 +45,30 @@ Renderer::Renderer()
46 45
47 SDL_SetRenderTarget(ren_.get(), canvas.get()); 46 SDL_SetRenderTarget(ren_.get(), canvas.get());
48 SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE); 47 SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE);
49 SDL_SetRenderDrawColor(ren_.get(), rand() % 255, rand() % 255, rand() % 255, 255); 48 SDL_SetRenderDrawColor(ren_.get(), 255, 255, 255, 255);
50 SDL_RenderClear(ren_.get()); 49 SDL_RenderClear(ren_.get());
51 50
52 for (int y = game.map.getTop(); y < game.map.getBottom(); y++) 51 for (Sprite& sprite : game.getSprites()) {
53 { 52 SDL_Rect dest { sprite.getX(), sprite.getY(), sprite.getWidth(), sprite.getHeight() };
54 for (int x = game.map.getLeft(); x < game.map.getRight(); x++) 53 SDL_RenderCopy(ren_.get(), textures_.at(sprite.getTextureId()).get(), nullptr, &dest);
55 {
56 bool draw = true;
57
58 if ((game.player_x == x && game.player_y == y) && game.renderPlayer)
59 {
60 SDL_SetRenderDrawColor(ren_.get(), 255, 255, 0, 255);
61 } else if (!game.map.at(x,y).lit)
62 {
63 if (drawDark)
64 {
65 SDL_SetRenderDrawColor(ren_.get(), 40, 40, 40, 255);
66 } else {
67 draw = false;
68 }
69 } else {
70 int alpha = 255;
71
72 switch (game.map.at(x,y).tile)
73 {
74 case Tile::Floor:
75 {
76 SDL_SetRenderDrawColor(ren_.get(), 210, 210, 210, alpha);
77 break;
78 }
79
80 case Tile::Wall:
81 {
82 SDL_SetRenderDrawColor(ren_.get(), 100, 100, 100, alpha);
83 break;
84 }
85
86 case Tile::Dust:
87 {
88 SDL_SetRenderDrawColor(ren_.get(), 128, 40, 255, alpha);
89 break;
90 }
91
92 case Tile::Lamp:
93 {
94 SDL_SetRenderDrawColor(ren_.get(), 0, 255, 255, alpha);
95 break;
96 }
97 }
98 }
99
100 if (draw)
101 {
102 SDL_Rect rect {
103 game.map.getTrueX(x) * TILE_WIDTH,
104 game.map.getTrueY(y) * TILE_HEIGHT,
105 TILE_WIDTH,
106 TILE_HEIGHT};
107
108 SDL_RenderFillRect(ren_.get(), &rect);
109 }
110 }
111 } 54 }
112 55
113 texture_ptr mask( 56 SDL_SetRenderTarget(ren_.get(), nullptr);
114 SDL_CreateTexture( 57 SDL_RenderCopy(ren_.get(), canvas.get(), nullptr, nullptr);
115 ren_.get(), 58 SDL_RenderPresent(ren_.get());
116 SDL_PIXELFORMAT_RGBA8888, 59}
117 SDL_TEXTUREACCESS_TARGET,
118 TILE_WIDTH * game.map.getWidth(),
119 TILE_HEIGHT * game.map.getHeight()));
120
121 if (!mask)
122 {
123 throw sdl_error();
124 }
125
126 SDL_SetRenderTarget(ren_.get(), mask.get());
127 SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 0);
128 SDL_RenderClear(ren_.get());
129 60
130 for (int y = game.map.getTop(); y < game.map.getBottom(); y++) 61int Renderer::loadImageFromFile(std::string_view filename) {
62 surface_ptr pfs(IMG_Load(filename.data()));
63 if (!pfs)
131 { 64 {
132 for (int x = game.map.getLeft(); x < game.map.getRight(); x++) 65 throw img_error();
133 {
134 if (game.map.at(x,y).lightType != Source::None)
135 {
136 texture_ptr sourceMask(
137 SDL_CreateTexture(
138 ren_.get(),
139 SDL_PIXELFORMAT_RGBA8888,
140 SDL_TEXTUREACCESS_TARGET,
141 TILE_WIDTH * game.map.getWidth(),
142 TILE_HEIGHT * game.map.getHeight()));
143
144 if (!sourceMask)
145 {
146 throw sdl_error();
147 }
148
149 SDL_SetRenderTarget(ren_.get(), sourceMask.get());
150 SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE);
151 SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 0);
152 SDL_RenderClear(ren_.get());
153
154 int fadeX = game.map.getTrueX(x) - game.map.at(x,y).lightRadius;
155 int fadeY = game.map.getTrueY(y) - game.map.at(x,y).lightRadius;
156 int fadeRight = game.map.getTrueX(x) + game.map.at(x,y).lightRadius;
157 int fadeBottom = game.map.getTrueY(y) + game.map.at(x,y).lightRadius;
158
159 SDL_Rect fadeRect {
160 fadeX * TILE_WIDTH,
161 fadeY * TILE_HEIGHT,
162 (game.map.at(x,y).lightRadius * 2 + 1) * TILE_WIDTH,
163 (game.map.at(x,y).lightRadius * 2 + 1) * TILE_HEIGHT};
164
165 if (game.map.at(x,y).lightType == Source::Lamp)
166 {
167 SDL_SetTextureBlendMode(lampFade_.get(), SDL_BLENDMODE_NONE);
168 SDL_RenderCopy(ren_.get(), lampFade_.get(), nullptr, &fadeRect);
169 } else if (game.map.at(x,y).lightType == Source::Player) {
170 SDL_SetTextureBlendMode(playerFade_.get(), SDL_BLENDMODE_NONE);
171 SDL_RenderCopy(ren_.get(), playerFade_.get(), nullptr, &fadeRect);
172 } else if (game.map.at(x,y).lightType == Source::Dust) {
173 SDL_SetTextureBlendMode(dustFade_.get(), SDL_BLENDMODE_NONE);
174 SDL_RenderCopy(ren_.get(), dustFade_.get(), nullptr, &fadeRect);
175 }
176
177 SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 0);
178
179 for (int sy = fadeY; sy < fadeBottom; sy++)
180 {
181 for (int sx = fadeX; sx < fadeRight; sx++)
182 {
183 if (!game.map.at(x,y).litTiles.count({sx, sy}))
184 {
185 SDL_Rect rect {
186 game.map.getTrueX(sx) * TILE_WIDTH,
187 game.map.getTrueY(sy) * TILE_HEIGHT,
188 TILE_WIDTH,
189 TILE_HEIGHT};
190
191 SDL_RenderFillRect(ren_.get(), &rect);
192 }
193 }
194 }
195
196 SDL_SetRenderTarget(ren_.get(), mask.get());
197 SDL_SetTextureBlendMode(sourceMask.get(), SDL_BLENDMODE_ADD);
198 SDL_RenderCopy(ren_.get(), sourceMask.get(), nullptr, nullptr);
199 }
200 }
201 } 66 }
202 67
203 SDL_SetRenderTarget(ren_.get(), canvas.get()); 68 texture_ptr tex = texture_ptr(SDL_CreateTextureFromSurface(ren_.get(), pfs.get()));
204 SDL_SetTextureBlendMode(mask.get(), SDL_BLENDMODE_MOD);
205 SDL_RenderCopy(ren_.get(), mask.get(), nullptr, nullptr);
206 69
207 SDL_SetRenderTarget(ren_.get(), nullptr); 70 int texId = textures_.size();
71 textures_.push_back(std::move(tex));
208 72
209 SDL_Rect zoomRect; 73 return texId;
210 74}
211 std::tie(zoomRect.x, zoomRect.y, zoomRect.w, zoomRect.h) =
212 calculateZoomRect(game);
213
214 SDL_RenderCopy(ren_.get(), canvas.get(), &zoomRect, nullptr);
215 SDL_RenderPresent(ren_.get());
216}*/
diff --git a/src/renderer.h b/src/renderer.h index 78856ed..abedb62 100644 --- a/src/renderer.h +++ b/src/renderer.h
@@ -5,6 +5,8 @@
5#include <SDL_image.h> 5#include <SDL_image.h>
6#include <stdexcept> 6#include <stdexcept>
7#include <memory> 7#include <memory>
8#include <string_view>
9#include <vector>
8 10
9class Game; 11class Game;
10 12
@@ -113,7 +115,9 @@ public:
113 115
114 Renderer(); 116 Renderer();
115 117
116 //void render(); 118 void render(Game& game);
119
120 int loadImageFromFile(std::string_view filename);
117 121
118private: 122private:
119 123
@@ -121,6 +125,8 @@ private:
121 img_wrapper img_; 125 img_wrapper img_;
122 window_ptr win_; 126 window_ptr win_;
123 renderer_ptr ren_; 127 renderer_ptr ren_;
128
129 std::vector<texture_ptr> textures_;
124}; 130};
125 131
126#endif /* end of include guard: RENDERER_H_6A58EC30 */ 132#endif /* end of include guard: RENDERER_H_6A58EC30 */
diff --git a/src/sprite.cpp b/src/sprite.cpp new file mode 100644 index 0000000..0059f70 --- /dev/null +++ b/src/sprite.cpp
@@ -0,0 +1,6 @@
1#include "sprite.h"
2#include <SDL_image.h>
3
4Sprite::Sprite(std::string_view filename, Renderer& renderer) {
5 textureId_ = renderer.loadImageFromFile(filename);
6} \ No newline at end of file
diff --git a/src/sprite.h b/src/sprite.h new file mode 100644 index 0000000..3af9341 --- /dev/null +++ b/src/sprite.h
@@ -0,0 +1,33 @@
1#ifndef SPRITE_H_70503825
2#define SPRITE_H_70503825
3
4#include <string_view>
5#include "renderer.h"
6
7class Sprite {
8public:
9
10 Sprite(std::string_view filename, Renderer& renderer);
11
12 int getTextureId() const {
13 return textureId_;
14 }
15
16 int getX() { return x_; }
17
18 int getY() { return y_; }
19
20 int getWidth() { return width_; }
21
22 int getHeight() { return height_; }
23
24private:
25
26 int textureId_;
27 int x_ = 0;
28 int y_ = 0;
29 int width_ = 17*4;
30 int height_ = 27*4;
31};
32
33#endif /* end of include guard: SPRITE_H_70503825 */