diff options
author | Kelly Rauchenberger <fefferburbia@gmail.com> | 2021-02-04 20:45:18 -0500 |
---|---|---|
committer | Kelly Rauchenberger <fefferburbia@gmail.com> | 2021-02-04 20:45:18 -0500 |
commit | 871943d6a90bdb92b3cc495d4d927199611f8c6b (patch) | |
tree | 9be125438747f7370cfa56e3f3e42f8c68982852 /src/renderer.cpp | |
parent | 138e0a8f83e82c6109bfc387ac7417d4f41711b4 (diff) | |
download | tanetane-871943d6a90bdb92b3cc495d4d927199611f8c6b.tar.gz tanetane-871943d6a90bdb92b3cc495d4d927199611f8c6b.tar.bz2 tanetane-871943d6a90bdb92b3cc495d4d927199611f8c6b.zip |
Added text boxes
Text now reveals itself and scrolls! Yay! It even plays speaker beeps. TODO: the arror indicating an A press is needed. Bullets on lines that need bullets. The header that says who the speaker is, if relevant.
Diffstat (limited to 'src/renderer.cpp')
-rw-r--r-- | src/renderer.cpp | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/src/renderer.cpp b/src/renderer.cpp index 2c6cf5c..b22c316 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp | |||
@@ -1,4 +1,5 @@ | |||
1 | #include "renderer.h" | 1 | #include "renderer.h" |
2 | #include <iostream> | ||
2 | #include "consts.h" | 3 | #include "consts.h" |
3 | #include "game.h" | 4 | #include "game.h" |
4 | #include "map.h" | 5 | #include "map.h" |
@@ -153,6 +154,33 @@ void Renderer::render(Game& game) { | |||
153 | int bottomBarHeight = 36.0 * game.getSystem<MessageSystem>().getCutsceneBarsProgress(); | 154 | int bottomBarHeight = 36.0 * game.getSystem<MessageSystem>().getCutsceneBarsProgress(); |
154 | SDL_Rect bottomBar { 0, CANVAS_HEIGHT - bottomBarHeight, CANVAS_WIDTH, bottomBarHeight }; | 155 | SDL_Rect bottomBar { 0, CANVAS_HEIGHT - bottomBarHeight, CANVAS_WIDTH, bottomBarHeight }; |
155 | SDL_RenderFillRect(ren_.get(), &bottomBar); | 156 | SDL_RenderFillRect(ren_.get(), &bottomBar); |
157 | |||
158 | if (game.getSystem<MessageSystem>().getCutsceneBarsProgress() == 1.0 && | ||
159 | !game.getSystem<MessageSystem>().getLines().empty()) { | ||
160 | int lineIndex = 0; | ||
161 | for (const MessageSystem::MessageLine& line : game.getSystem<MessageSystem>().getLines()) { | ||
162 | if (messageLines_[lineIndex].line != line.text) { | ||
163 | renderMessageLine(lineIndex, line.text, game); | ||
164 | } | ||
165 | |||
166 | // 18x, 127y1, 143y2 | ||
167 | if (line.charsRevealed > 0) { | ||
168 | SDL_Rect srcRect { | ||
169 | 0, 0, messageLines_[lineIndex].charIndexToWidth[line.charsRevealed], | ||
170 | game.getFont().getCharacterHeight() | ||
171 | }; | ||
172 | SDL_Rect destRect { | ||
173 | 18, | ||
174 | 127 + 16 * lineIndex, | ||
175 | srcRect.w, | ||
176 | srcRect.h }; | ||
177 | |||
178 | SDL_RenderCopy(ren_.get(), messageLines_[lineIndex].renderedTex.get(), &srcRect, &destRect); | ||
179 | } | ||
180 | |||
181 | lineIndex++; | ||
182 | } | ||
183 | } | ||
156 | } | 184 | } |
157 | 185 | ||
158 | SDL_SetRenderTarget(ren_.get(), nullptr); | 186 | SDL_SetRenderTarget(ren_.get(), nullptr); |
@@ -175,3 +203,46 @@ int Renderer::loadImageFromFile(std::string_view filename) { | |||
175 | 203 | ||
176 | return texId; | 204 | return texId; |
177 | } | 205 | } |
206 | |||
207 | void Renderer::renderMessageLine(int lineIndex, const std::string& text, Game& game) { | ||
208 | MessageCache& line = messageLines_[lineIndex]; | ||
209 | line.line = text; | ||
210 | |||
211 | line.renderedTex.reset( | ||
212 | SDL_CreateTexture( | ||
213 | ren_.get(), | ||
214 | SDL_PIXELFORMAT_RGBA8888, | ||
215 | SDL_TEXTUREACCESS_TARGET, | ||
216 | MESSAGE_TEXT_WIDTH, | ||
217 | game.getFont().getCharacterHeight())); | ||
218 | |||
219 | SDL_SetTextureBlendMode(line.renderedTex.get(), SDL_BLENDMODE_BLEND); | ||
220 | |||
221 | SDL_SetRenderTarget(ren_.get(), line.renderedTex.get()); | ||
222 | SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_BLEND); | ||
223 | SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 0); | ||
224 | SDL_RenderClear(ren_.get()); | ||
225 | |||
226 | line.charIndexToWidth.clear(); | ||
227 | line.charIndexToWidth.push_back(0); | ||
228 | |||
229 | int length = 0; | ||
230 | |||
231 | for (int i=0; i<line.line.size(); i++) { | ||
232 | if (line.line[i] != ' ') { | ||
233 | vec2i charLoc = game.getFont().getCharacterLocation(line.line[i]); | ||
234 | vec2i charSize = game.getFont().getCharacterSize(line.line[i]); | ||
235 | SDL_Rect srcRect { charLoc.x(), charLoc.y(), charSize.w(), charSize.h() }; | ||
236 | SDL_Rect destRect { length, 0, charSize.w(), charSize.h() }; | ||
237 | |||
238 | SDL_RenderCopy(ren_.get(), textures_.at(game.getFont().getTextureId()).get(), &srcRect, &destRect); | ||
239 | |||
240 | length++; | ||
241 | } | ||
242 | |||
243 | length += game.getFont().getCharacterWidth(line.line[i]); | ||
244 | line.charIndexToWidth.push_back(length); | ||
245 | } | ||
246 | |||
247 | line.charIndexToWidth.back()--; | ||
248 | } | ||