diff options
Diffstat (limited to 'src/renderer.cpp')
-rw-r--r-- | src/renderer.cpp | 83 |
1 files changed, 53 insertions, 30 deletions
diff --git a/src/renderer.cpp b/src/renderer.cpp index 9ef8bb9..1f51e0a 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp | |||
@@ -12,7 +12,7 @@ Renderer::Renderer() | |||
12 | GAME_HEIGHT, | 12 | GAME_HEIGHT, |
13 | SDL_WINDOW_SHOWN)); | 13 | SDL_WINDOW_SHOWN)); |
14 | 14 | ||
15 | SDL_SetWindowFullscreen(win_.get(), SDL_WINDOW_FULLSCREEN_DESKTOP); | 15 | //SDL_SetWindowFullscreen(win_.get(), SDL_WINDOW_FULLSCREEN_DESKTOP); |
16 | 16 | ||
17 | if (!win_) | 17 | if (!win_) |
18 | { | 18 | { |
@@ -115,13 +115,16 @@ void Renderer::renderGame( | |||
115 | const Game& game, | 115 | const Game& game, |
116 | bool drawDark) | 116 | bool drawDark) |
117 | { | 117 | { |
118 | int windowTileWidth = game.curZoom * ZOOM_X_FACTOR + 2; | ||
119 | int windowTileHeight = game.curZoom * ZOOM_Y_FACTOR + 2; | ||
120 | |||
118 | texture_ptr canvas( | 121 | texture_ptr canvas( |
119 | SDL_CreateTexture( | 122 | SDL_CreateTexture( |
120 | ren_.get(), | 123 | ren_.get(), |
121 | SDL_PIXELFORMAT_RGBA8888, | 124 | SDL_PIXELFORMAT_RGBA8888, |
122 | SDL_TEXTUREACCESS_TARGET, | 125 | SDL_TEXTUREACCESS_TARGET, |
123 | TILE_WIDTH * game.map.getWidth(), | 126 | windowTileWidth * TILE_WIDTH, |
124 | TILE_HEIGHT * game.map.getHeight())); | 127 | windowTileHeight * TILE_HEIGHT)); |
125 | 128 | ||
126 | if (!canvas) | 129 | if (!canvas) |
127 | { | 130 | { |
@@ -133,15 +136,17 @@ void Renderer::renderGame( | |||
133 | SDL_SetRenderDrawColor(ren_.get(), rand() % 255, rand() % 255, rand() % 255, 255); | 136 | SDL_SetRenderDrawColor(ren_.get(), rand() % 255, rand() % 255, rand() % 255, 255); |
134 | SDL_RenderClear(ren_.get()); | 137 | SDL_RenderClear(ren_.get()); |
135 | 138 | ||
136 | for (int y = game.map.getTop(); y < game.map.getBottom(); y++) | 139 | int leftmost = game.player_x - game.curZoom * ZOOM_X_FACTOR / 2 - 1; |
140 | int topmost = game.player_y - game.curZoom * ZOOM_Y_FACTOR / 2 - 1; | ||
141 | for (int y = topmost; y < topmost + windowTileHeight; y++) | ||
137 | { | 142 | { |
138 | for (int x = game.map.getLeft(); x < game.map.getRight(); x++) | 143 | for (int x = leftmost; x < leftmost + windowTileWidth; x++) |
139 | { | 144 | { |
140 | bool draw = true; | 145 | bool draw = true; |
141 | bool drawColour = false; | 146 | bool drawColour = false; |
142 | SDL_Rect rect { | 147 | SDL_Rect rect { |
143 | game.map.getTrueX(x) * TILE_WIDTH, | 148 | (x - leftmost) * TILE_WIDTH, |
144 | game.map.getTrueY(y) * TILE_HEIGHT, | 149 | (y - topmost) * TILE_HEIGHT, |
145 | TILE_WIDTH, | 150 | TILE_WIDTH, |
146 | TILE_HEIGHT}; | 151 | TILE_HEIGHT}; |
147 | 152 | ||
@@ -190,14 +195,14 @@ void Renderer::renderGame( | |||
190 | 195 | ||
191 | if (game.renderPlayer) { | 196 | if (game.renderPlayer) { |
192 | SDL_Rect rect { | 197 | SDL_Rect rect { |
193 | game.map.getTrueX(game.player_x) * TILE_WIDTH, | 198 | (game.player_x - leftmost) * TILE_WIDTH, |
194 | game.map.getTrueY(game.player_y) * TILE_HEIGHT, | 199 | (game.player_y - topmost) * TILE_HEIGHT, |
195 | TILE_WIDTH, | 200 | TILE_WIDTH, |
196 | TILE_HEIGHT}; | 201 | TILE_HEIGHT}; |
197 | 202 | ||
198 | if (game.moving) { | 203 | if (game.moving) { |
199 | rect.x = game.moveProgress.getProgress(game.map.getTrueX(game.player_oldx) * TILE_WIDTH, rect.x); | 204 | rect.x = game.moveProgress.getProgress((game.player_oldx - leftmost) * TILE_WIDTH, rect.x); |
200 | rect.y = game.moveProgress.getProgress(game.map.getTrueY(game.player_oldy) * TILE_HEIGHT, rect.y); | 205 | rect.y = game.moveProgress.getProgress((game.player_oldy - topmost) * TILE_HEIGHT, rect.y); |
201 | } | 206 | } |
202 | 207 | ||
203 | SDL_RenderCopy(ren_.get(), playerSheet_.get(), &game.playerAnim.getRenderRect(), &rect); | 208 | SDL_RenderCopy(ren_.get(), playerSheet_.get(), &game.playerAnim.getRenderRect(), &rect); |
@@ -208,8 +213,8 @@ void Renderer::renderGame( | |||
208 | ren_.get(), | 213 | ren_.get(), |
209 | SDL_PIXELFORMAT_RGBA8888, | 214 | SDL_PIXELFORMAT_RGBA8888, |
210 | SDL_TEXTUREACCESS_TARGET, | 215 | SDL_TEXTUREACCESS_TARGET, |
211 | TILE_WIDTH * game.map.getWidth(), | 216 | windowTileWidth * TILE_WIDTH, |
212 | TILE_HEIGHT * game.map.getHeight())); | 217 | windowTileHeight * TILE_HEIGHT)); |
213 | 218 | ||
214 | if (!mask) | 219 | if (!mask) |
215 | { | 220 | { |
@@ -220,9 +225,9 @@ void Renderer::renderGame( | |||
220 | SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 0); | 225 | SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 0); |
221 | SDL_RenderClear(ren_.get()); | 226 | SDL_RenderClear(ren_.get()); |
222 | 227 | ||
223 | for (int y = game.map.getTop(); y < game.map.getBottom(); y++) | 228 | for (int y = topmost; y < topmost + windowTileHeight; y++) |
224 | { | 229 | { |
225 | for (int x = game.map.getLeft(); x < game.map.getRight(); x++) | 230 | for (int x = leftmost; x < leftmost + windowTileWidth; x++) |
226 | { | 231 | { |
227 | if (game.map.at(x,y).lightType != Source::None) | 232 | if (game.map.at(x,y).lightType != Source::None) |
228 | { | 233 | { |
@@ -231,8 +236,8 @@ void Renderer::renderGame( | |||
231 | ren_.get(), | 236 | ren_.get(), |
232 | SDL_PIXELFORMAT_RGBA8888, | 237 | SDL_PIXELFORMAT_RGBA8888, |
233 | SDL_TEXTUREACCESS_TARGET, | 238 | SDL_TEXTUREACCESS_TARGET, |
234 | TILE_WIDTH * game.map.getWidth(), | 239 | windowTileWidth * TILE_WIDTH, |
235 | TILE_HEIGHT * game.map.getHeight())); | 240 | windowTileHeight * TILE_HEIGHT)); |
236 | 241 | ||
237 | if (!sourceMask) | 242 | if (!sourceMask) |
238 | { | 243 | { |
@@ -244,11 +249,11 @@ void Renderer::renderGame( | |||
244 | SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 0); | 249 | SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 0); |
245 | SDL_RenderClear(ren_.get()); | 250 | SDL_RenderClear(ren_.get()); |
246 | 251 | ||
247 | int posToUseX = game.map.getTrueX(x); | 252 | int posToUseX = x - leftmost; |
248 | int posToUseY = game.map.getTrueY(y); | 253 | int posToUseY = y - topmost; |
249 | if (game.map.at(x,y).lightType == Source::Player && game.moving) { | 254 | if (game.map.at(x,y).lightType == Source::Player && game.moving) { |
250 | posToUseX = game.moveProgress.getProgress(game.map.getTrueX(game.player_oldx), posToUseX); | 255 | posToUseX = game.moveProgress.getProgress((game.player_oldx) - leftmost, posToUseX); |
251 | posToUseY = game.moveProgress.getProgress(game.map.getTrueY(game.player_oldy), posToUseY); | 256 | posToUseY = game.moveProgress.getProgress((game.player_oldy) - topmost, posToUseY); |
252 | } | 257 | } |
253 | 258 | ||
254 | int fadeX = posToUseX - game.map.at(x,y).lightRadius; | 259 | int fadeX = posToUseX - game.map.at(x,y).lightRadius; |
@@ -283,8 +288,8 @@ void Renderer::renderGame( | |||
283 | if (!game.map.at(x,y).litTiles.count({sx, sy})) | 288 | if (!game.map.at(x,y).litTiles.count({sx, sy})) |
284 | { | 289 | { |
285 | SDL_Rect rect { | 290 | SDL_Rect rect { |
286 | game.map.getTrueX(sx) * TILE_WIDTH, | 291 | (sx - leftmost) * TILE_WIDTH, |
287 | game.map.getTrueY(sy) * TILE_HEIGHT, | 292 | (sy - topmost) * TILE_HEIGHT, |
288 | TILE_WIDTH, | 293 | TILE_WIDTH, |
289 | TILE_HEIGHT}; | 294 | TILE_HEIGHT}; |
290 | 295 | ||
@@ -306,10 +311,28 @@ void Renderer::renderGame( | |||
306 | 311 | ||
307 | SDL_SetRenderTarget(ren_.get(), nullptr); | 312 | SDL_SetRenderTarget(ren_.get(), nullptr); |
308 | 313 | ||
309 | SDL_Rect zoomRect; | 314 | // TODO: this is just moving interp. we also need zoom |
315 | SDL_Rect zoomRect { | ||
316 | TILE_WIDTH, TILE_HEIGHT, (windowTileWidth - 2) * TILE_WIDTH, (windowTileHeight - 2) * TILE_HEIGHT | ||
317 | }; | ||
318 | |||
319 | if (game.moving) { | ||
320 | double interp = | ||
321 | static_cast<double>(game.zoomProgress) / | ||
322 | static_cast<double>(game.zoomLength); | ||
323 | |||
324 | if (game.player_x > game.player_oldx) { | ||
325 | zoomRect.x = game.moveProgress.getProgress(0, TILE_WIDTH); | ||
326 | } else if (game.player_x < game.player_oldx) { | ||
327 | zoomRect.x = game.moveProgress.getProgress(2*TILE_WIDTH, TILE_WIDTH); | ||
328 | } | ||
310 | 329 | ||
311 | std::tie(zoomRect.x, zoomRect.y, zoomRect.w, zoomRect.h) = | 330 | if (game.player_y > game.player_oldy) { |
312 | calculateZoomRect(game); | 331 | zoomRect.y = game.moveProgress.getProgress(0, TILE_HEIGHT); |
332 | } else if (game.player_y < game.player_oldy) { | ||
333 | zoomRect.y = game.moveProgress.getProgress(TILE_HEIGHT*2, TILE_HEIGHT); | ||
334 | } | ||
335 | } | ||
313 | 336 | ||
314 | SDL_RenderCopy(ren_.get(), canvas.get(), &zoomRect, nullptr); | 337 | SDL_RenderCopy(ren_.get(), canvas.get(), &zoomRect, nullptr); |
315 | SDL_RenderPresent(ren_.get()); | 338 | SDL_RenderPresent(ren_.get()); |
@@ -358,12 +381,12 @@ void Renderer::renderTitle(int num, double fade) { | |||
358 | 381 | ||
359 | std::tuple<int, int, int, int> Renderer::calculateZoomRect(const Game& game) | 382 | std::tuple<int, int, int, int> Renderer::calculateZoomRect(const Game& game) |
360 | { | 383 | { |
361 | int x = game.map.getTrueX(game.curBoundX) * TILE_WIDTH; | ||
362 | int y = game.map.getTrueY(game.curBoundY) * TILE_HEIGHT; | ||
363 | int w = game.curZoom * TILE_WIDTH * ZOOM_X_FACTOR; | 384 | int w = game.curZoom * TILE_WIDTH * ZOOM_X_FACTOR; |
364 | int h = game.curZoom * TILE_HEIGHT * ZOOM_Y_FACTOR; | 385 | int h = game.curZoom * TILE_HEIGHT * ZOOM_Y_FACTOR; |
386 | int x = (game.map.getTrueX(game.player_x) * TILE_WIDTH) - (w / 2); | ||
387 | int y = (game.map.getTrueY(game.player_y) * TILE_HEIGHT) - (h / 2); | ||
365 | 388 | ||
366 | if (game.zooming) | 389 | /*if (game.zooming) |
367 | { | 390 | { |
368 | double interp = | 391 | double interp = |
369 | static_cast<double>(game.zoomProgress) / | 392 | static_cast<double>(game.zoomProgress) / |
@@ -373,7 +396,7 @@ std::tuple<int, int, int, int> Renderer::calculateZoomRect(const Game& game) | |||
373 | y = (y - game.lastZoomTop) * interp + game.lastZoomTop; | 396 | y = (y - game.lastZoomTop) * interp + game.lastZoomTop; |
374 | w = (w - game.lastZoomWidth) * interp + game.lastZoomWidth; | 397 | w = (w - game.lastZoomWidth) * interp + game.lastZoomWidth; |
375 | h = (h - game.lastZoomHeight) * interp + game.lastZoomHeight; | 398 | h = (h - game.lastZoomHeight) * interp + game.lastZoomHeight; |
376 | } | 399 | }*/ |
377 | 400 | ||
378 | return {x, y, w, h}; | 401 | return {x, y, w, h}; |
379 | } | 402 | } |