summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/game.h11
-rw-r--r--src/main.cpp47
-rw-r--r--src/renderer.cpp41
-rw-r--r--src/renderer.h2
4 files changed, 72 insertions, 29 deletions
diff --git a/src/game.h b/src/game.h index 6d8a64f..200b691 100644 --- a/src/game.h +++ b/src/game.h
@@ -92,12 +92,19 @@ public:
92 int player_y = 0; 92 int player_y = 0;
93 bool renderPlayer = true; 93 bool renderPlayer = true;
94 94
95 int curZoom = INIT_ZOOM;
96 int maxZoom = INIT_ZOOM; 95 int maxZoom = INIT_ZOOM;
97 96
97 int curZoom = INIT_ZOOM;
98 int curBoundX = map.getLeft();
99 int curBoundY = map.getTop();
100
98 bool zooming = false; 101 bool zooming = false;
99 //size_t oldZoom;
100 int zoomProgress = 0; 102 int zoomProgress = 0;
103 int zoomLength;
104 int lastZoomTop;
105 int lastZoomLeft;
106 int lastZoomWidth;
107 int lastZoomHeight;
101 108
102 bool firstInput = false; 109 bool firstInput = false;
103 Input lastInput; 110 Input lastInput;
diff --git a/src/main.cpp b/src/main.cpp index a0085cb..4b13051 100644 --- a/src/main.cpp +++ b/src/main.cpp
@@ -81,7 +81,11 @@ void tick(Game& game, bool onlyDark = false)
81 81
82bool movePlayer(Game& game, int x, int y) 82bool movePlayer(Game& game, int x, int y)
83{ 83{
84 if (game.map.inBounds(x, y) && game.map.at(x,y).tile == Tile::Floor) 84 if (x >= game.curBoundX &&
85 y >= game.curBoundY &&
86 x < game.curBoundX + game.curZoom * ZOOM_X_FACTOR &&
87 y < game.curBoundY + game.curZoom * ZOOM_Y_FACTOR &&
88 game.map.at(x,y).tile == Tile::Floor)
85 { 89 {
86 if (game.map.at(game.player_x, game.player_y).tile == Tile::Floor) 90 if (game.map.at(game.player_x, game.player_y).tile == Tile::Floor)
87 { 91 {
@@ -366,11 +370,36 @@ void setZoom(Game& game, size_t zoom)
366 growMap(game, zoom); 370 growMap(game, zoom);
367 } 371 }
368 372
369 // TODO: don't think this works well with rapid zoom changes 373 std::tie(
370 game.zoomProgress += (zoom - game.curZoom) * TILE_WIDTH; 374 game.lastZoomLeft,
371 //game.oldZoom = game.curZoom; 375 game.lastZoomTop,
376 game.lastZoomWidth,
377 game.lastZoomHeight) =
378 Renderer::calculateZoomRect(game);
379
380 game.zoomProgress = 0;
381 game.zoomLength =
382 std::abs(static_cast<long>(zoom - game.curZoom)) * TILE_WIDTH;
372 game.curZoom = zoom; 383 game.curZoom = zoom;
373 game.zooming = true; 384 game.zooming = true;
385
386 game.curBoundX = game.player_x - zoom * ZOOM_X_FACTOR / 2;
387 if (game.curBoundX < game.map.getLeft())
388 {
389 game.curBoundX = game.map.getLeft();
390 } else if (game.curBoundX + zoom * ZOOM_X_FACTOR >= game.map.getRight())
391 {
392 game.curBoundX = game.map.getRight() - zoom * ZOOM_X_FACTOR;
393 }
394
395 game.curBoundY = game.player_y - zoom * ZOOM_Y_FACTOR / 2;
396 if (game.curBoundY < game.map.getTop())
397 {
398 game.curBoundY = game.map.getTop();
399 } else if (game.curBoundY + zoom * ZOOM_Y_FACTOR >= game.map.getBottom())
400 {
401 game.curBoundY = game.map.getBottom() - zoom * ZOOM_Y_FACTOR;
402 }
374} 403}
375 404
376int main(int, char**) 405int main(int, char**)
@@ -691,15 +720,9 @@ int main(int, char**)
691 { 720 {
692 if (game.zooming) 721 if (game.zooming)
693 { 722 {
694 if (game.zoomProgress > 0) 723 game.zoomProgress++;
695 {
696 game.zoomProgress--;
697 } else if (game.zoomProgress < 0)
698 {
699 game.zoomProgress++;
700 }
701 724
702 if (game.zoomProgress == 0) 725 if (game.zoomProgress == game.zoomLength)
703 { 726 {
704 game.zooming = false; 727 game.zooming = false;
705 } 728 }
diff --git a/src/renderer.cpp b/src/renderer.cpp index eddd11d..9d3af97 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp
@@ -288,22 +288,33 @@ void Renderer::render(
288 288
289 SDL_SetRenderTarget(ren_.get(), nullptr); 289 SDL_SetRenderTarget(ren_.get(), nullptr);
290 290
291 if (!game.zooming) 291 SDL_Rect zoomRect;
292
293 std::tie(zoomRect.x, zoomRect.y, zoomRect.w, zoomRect.h) =
294 calculateZoomRect(game);
295
296 SDL_RenderCopy(ren_.get(), canvas.get(), &zoomRect, nullptr);
297 SDL_RenderPresent(ren_.get());
298}
299
300std::tuple<int, int, int, int> Renderer::calculateZoomRect(const Game& game)
301{
302 int x = game.map.getTrueX(game.curBoundX) * TILE_WIDTH;
303 int y = game.map.getTrueY(game.curBoundY) * TILE_HEIGHT;
304 int w = game.curZoom * TILE_WIDTH * ZOOM_X_FACTOR;
305 int h = game.curZoom * TILE_HEIGHT * ZOOM_Y_FACTOR;
306
307 if (game.zooming)
292 { 308 {
293 SDL_RenderCopy(ren_.get(), canvas.get(), nullptr, nullptr); 309 double interp =
294 } else { 310 static_cast<double>(game.zoomProgress) /
295 // TODO: zooming back in to the player 311 static_cast<double>(game.zoomLength);
296 SDL_Rect zoomRect { 312
297 ((game.maxZoom - game.curZoom) * TILE_WIDTH + game.zoomProgress) 313 x = (x - game.lastZoomLeft) * interp + game.lastZoomLeft;
298 * ZOOM_X_FACTOR / 2, 314 y = (y - game.lastZoomTop) * interp + game.lastZoomTop;
299 ((game.maxZoom - game.curZoom) * TILE_HEIGHT + game.zoomProgress) 315 w = (w - game.lastZoomWidth) * interp + game.lastZoomWidth;
300 * ZOOM_Y_FACTOR / 2, 316 h = (h - game.lastZoomHeight) * interp + game.lastZoomHeight;
301 (game.curZoom * TILE_WIDTH - game.zoomProgress) * ZOOM_X_FACTOR,
302 (game.curZoom * TILE_HEIGHT - game.zoomProgress) * ZOOM_Y_FACTOR
303 };
304
305 SDL_RenderCopy(ren_.get(), canvas.get(), &zoomRect, nullptr);
306 } 317 }
307 318
308 SDL_RenderPresent(ren_.get()); 319 return {x, y, w, h};
309} 320}
diff --git a/src/renderer.h b/src/renderer.h index 4aa27bb..a34b231 100644 --- a/src/renderer.h +++ b/src/renderer.h
@@ -117,6 +117,8 @@ public:
117 const Game& game, 117 const Game& game,
118 bool drawDark = true); 118 bool drawDark = true);
119 119
120 static std::tuple<int, int, int, int> calculateZoomRect(const Game& game);
121
120private: 122private:
121 123
122 sdl_wrapper sdl_; 124 sdl_wrapper sdl_;