diff --git a/Forráskód/modules/auxiliary/auxSDL.c b/Forráskód/modules/auxiliary/auxSDL.c index f3a5eec..5ae4613 100644 --- a/Forráskód/modules/auxiliary/auxSDL.c +++ b/Forráskód/modules/auxiliary/auxSDL.c @@ -2,6 +2,7 @@ #include "../camera.h" #ifdef __EMSCRIPTEN__ + #include #include #else #include @@ -15,10 +16,28 @@ static SDL_Texture* frameTexture; static int textureWidth, textureHeight; #ifdef __EMSCRIPTEN__ +/** \brief Kicsi, elsősorban ujjal kezelt kijelzőn futunk-e? + * Nem ugyanaz a kérdés, mint a touch.c-beli: ott bármilyen érintés elég, itt viszont az + * kell, hogy a fő mutatóeszköz legyen az ujj. Egy érintőképernyős laptop egeret és ujjat + * is ismer, a képernyője viszont akkora, hogy a duplázott felbontást nem bírná el. + * Mindkettő a kijelző tulajdonsága, futás közben nem változik, elég egyszer megkérdezni. + */ +static bool isMobileScreen() { + static int cached = -1; + + if(cached < 0) cached = EM_ASM_INT({ + return matchMedia('(pointer: coarse)').matches && + Math.min(screen.width, screen.height) <= $0 ? 1 : 0; + }, mobileScreenLimit); + + return cached == 1; +} + ///A böngésző pixelarányát adja vissza, a szoftveres rajzolás miatt megszabott plafonig. static double drawingPixelRatio() { double ratio = emscripten_get_device_pixel_ratio(); - return ratio > maxDevicePixelRatio ? maxDevicePixelRatio : ratio; + double maxRatio = isMobileScreen() ? maxMobileDevicePixelRatio : maxDevicePixelRatio; + return ratio > maxRatio ? maxRatio : ratio; } #endif diff --git a/Forráskód/modules/auxiliary/auxSDL.h b/Forráskód/modules/auxiliary/auxSDL.h index 92f1d2c..c5e816e 100644 --- a/Forráskód/modules/auxiliary/auxSDL.h +++ b/Forráskód/modules/auxiliary/auxSDL.h @@ -16,6 +16,21 @@ */ #define maxDevicePixelRatio 1.0 + /** \brief Mobilon ennél is elmehetünk, mert ott a vászon css-ben is kicsi. + * Egy telefon képernyője css-pixelben nagyjából ötöde egy asztali ablakénak, így a + * kétszeres arány még mindig kevesebb rajzolandó pixelt jelent, mint amennyivel a + * gépen számolunk. Cserébe a kicsi, sűrű kijelzőn ez látszik meg a legjobban. + */ + #define maxMobileDevicePixelRatio 2.0 + + /** \brief Eddig a css-pixelben mért rövidebb képernyőoldalig tekintünk egy eszközt mobilnak. + * A mutatóeszköz mellé azért kell a méret is, mert egy nagy, ujjal kezelt panel (például + * egy kihelyezett érintőképernyő) is az ujjat mondja fő mutatóeszköznek, a duplázás + * viszont ott már ugyanolyan drága lenne, mint az asztali gépen. A határ a legnagyobb + * kézbe fogható eszköz rövidebb oldala: efölött már nem telefonról vagy táblagépről van szó. + */ + #define mobileScreenLimit 1024 + typedef struct mousePos { Uint16 x, y; } mousePos; diff --git a/Forráskód/modules/camera.c b/Forráskód/modules/camera.c index 659004d..35a4035 100644 --- a/Forráskód/modules/camera.c +++ b/Forráskód/modules/camera.c @@ -55,10 +55,18 @@ static void initRenderMap() { * */ static void calculateRowsAndColumns() { - magnification = (float) screen -> w / 2 / sensorSize; - columns = 2 * cameraPosition.z * sensorSize / focalLength; + /* A szenzor hosszabb oldala mindig a képernyő hosszabb oldalára képződik le. Fekvő + * képernyőn ez a szélesség, állón viszont a magasság: egy telefon képernyőjén a + * szélességhez igazodva a pályának majdnem a kétszerese férne ki függőlegesen, amitől + * a kockák aprók lennének, a játékos feje fölött pedig végtelen üres ég maradna. + * Így viszont fekvőn és állón is ugyanakkorák a kockák, csak más alakú részt látunk. */ + float longerScreenSide = larger(screen -> w, screen -> h); + magnification = longerScreenSide / 2 / sensorSize; + + float longerSideInMeters = 2 * cameraPosition.z * sensorSize / focalLength; //hogy a négyzet négyzet is maradjon - rows = (float)screen -> h / screen -> w * columns; + columns = screen -> w / longerScreenSide * longerSideInMeters; + rows = screen -> h / longerScreenSide * longerSideInMeters; if(renderMap == NULL) initRenderMap(); @@ -117,6 +125,11 @@ int getColumns() { return columns; } +///Visszaadja, hogy hány sor látszik a pályából. +int getRows() { + return rows; +} + /** \brief A kamera dollyzását végzi, a kamerát mozgatja * A dolly állását staticban tárolja, ezért új dolly eseteén először egy restart = true-val kell meghívni, * \param ms eltelt idő diff --git a/Forráskód/modules/camera.h b/Forráskód/modules/camera.h index 0b02ec1..4585a5f 100644 --- a/Forráskód/modules/camera.h +++ b/Forráskód/modules/camera.h @@ -17,6 +17,7 @@ void followPlayerWithCamera(); void menuCamera(int* getColumns, int* getRows); int getColumns(); + int getRows(); bool cameraDollyZ(int deltaTime, bool restart); vector2D get2DPoint(vector3D point); void drawCuboid(renderObject object, bool sides[]); diff --git a/Forráskód/modules/menu/menuDraw.c b/Forráskód/modules/menu/menuDraw.c index 7f651dc..3bcb035 100644 --- a/Forráskód/modules/menu/menuDraw.c +++ b/Forráskód/modules/menu/menuDraw.c @@ -4,9 +4,11 @@ ///A menüben lévő havazást kezeli, sokkal olcsóbb, mintha egy mapDrawt hívnánk. static void drawMenuParticles(int deltaTime) { int columns = getColumns(); + //álló képernyőn több sor látszik, mint oszlop, ezért a felső határ a sorok száma + int rows = getRows(); int i; for(i = 0; i < columns; i++) - drawParticles(i, 0, columns, deltaTime); + drawParticles(i, 0, rows, deltaTime); } ///A főmenüt rajzolja.