下のソースコードはSDL2で青色の四角形を描画するもので、マウスホイールで拡大縮小することができます。
しかし拡大縮小する際にカメラ(視点)の位置を変更していないため不格好なズームになってしまいます。
マウスの座標を中心に拡大縮小するにはどのようにすればよいでしょうか?
(SDL2でなくてもよいのですが下のTODOを埋める形で教えていただけるとありがたいです)
cpp
1#include <SDL2/SDL.h> 2 3const int WIDTH = 600; 4const int HEIGHT = 400; 5 6struct Camera { 7 // xとyは視点の左上の座標 8 float x, y, zoom; 9}; 10 11int main() { 12 SDL_Init(SDL_INIT_VIDEO); 13 14 auto window = SDL_CreateWindow("zoom test", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 15 WIDTH, HEIGHT, SDL_WINDOW_SHOWN); 16 auto renderer = 17 SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); 18 19 Camera camera{0.0, 0.0, 1.0}; 20 const SDL_FRect rect{100, 100, 100, 100}; 21 SDL_Event e; 22 bool quit = false; 23 24 while (!quit) { 25 while (SDL_PollEvent(&e)) { 26 if (e.type == SDL_QUIT) { 27 quit = true; 28 break; 29 } else if (e.type == SDL_MOUSEWHEEL) { 30 // 上スクロールで2倍に拡大 31 // 下スクロールで1/2倍に縮小 32 33 // zoomの更新 34 // e.wheel.yは上スクロールで正、下スクロールで負となる 35 float zoom_rate = e.wheel.y > 0 ? 2.0 : 1.0 / 2.0; 36 camera.zoom *= zoom_rate; 37 38 // マウスの座標 39 int mx, my; 40 SDL_GetMouseState(&mx, &my); 41 // TODO: camera.xとcamera.yをどのように更新すればよいでしょうか?? 42 } 43 } 44 // 黒で塗りつぶし 45 SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); 46 SDL_RenderClear(renderer); 47 48 // 青色の四角形 49 SDL_SetRenderDrawColor(renderer, 0, 0, 200, 255); 50 SDL_FRect drawed_rect = {rect.x - camera.x, rect.y - camera.y, rect.w * camera.zoom, 51 rect.h * camera.zoom}; 52 SDL_RenderFillRectF(renderer, &drawed_rect); 53 54 SDL_RenderPresent(renderer); 55 } 56 57 SDL_DestroyRenderer(renderer); 58 SDL_DestroyWindow(window); 59 SDL_Quit(); 60} 61 62
よろしくお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。