Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Java libGDX] Skalowanie widoku i dopasowanie do ekranu

Ostatnio zmodyfikowano dzisiaj: 12h » 27 min
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
[Java libGDX] Skalowanie widoku i dopasowanie do ekranu
» 2025-12-13 21:24:36
Witam. Mam funkcję do skalowania widoku w SFML 3.0.2. Funkcja działa w ten sposób, że rozciąga obraz w taki sposób, by zachowane zostały proporcje. (czyli są czarne pasy poza widokiem). Jak to zrobić w Javie libGDx? Obecnie tak skaluje ... czyli nie skaluje w ogóle. Pewnie, że i można skalować sprajty no ale kod będzie wtedy gorszej jakości :-/


C/C++
void setScreenView( sf::View & view )
{
   
float windowRatio = float( window->getSize().x ) / float( window->getSize().y );
   
float viewRatio = float( view.getSize().x ) / float( view.getSize().y );
   
   
float sizeX = 1.f;
   
float sizeY = 1.f;
   
float posX = 0.f;
   
float posY = 0.f;
   
   
if( windowRatio > viewRatio ) {
       
sizeX = viewRatio / windowRatio;
       
posX =( 1.f - sizeX ) / 2.0f;
   
}
   
// wyższe niż widok → paski poziome
   
else {
       
sizeY = windowRatio / viewRatio;
       
posY =( 1.f - sizeY ) / 2.0f;
   
}
   
   
view.setViewport( sf::FloatRect( posX, posY, sizeX, sizeY ) );
   
   
window->setView( view );
}


package com.tbane.mysticgems;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.utils.viewport.Viewport;
import com.badlogic.gdx.utils.viewport.FitViewport;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.Texture;

public class Renderer {
    public static SpriteBatch batch = new SpriteBatch();

    public static int VIRTUAL_WIDTH = 720;
    public static int VIRTUAL_HEIGHT = 1612;
    public static OrthographicCamera camera;
    public static Viewport viewport;

    public void create() {
        camera = new OrthographicCamera();
        viewport = new FitViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, camera);

        camera.position.set(VIRTUAL_WIDTH / 2f, VIRTUAL_HEIGHT / 2f, 0);
        camera.update();
        batch = new SpriteBatch();
    }

    public void resize(int width, int height) {
        viewport.update(width, height);
        camera.position.set(VIRTUAL_WIDTH / 2f, VIRTUAL_HEIGHT / 2f, 0);
        camera.update();
        batch = new SpriteBatch();
    }
   
    public static void begin() {
        batch.begin();
    }

    public static void end() {
        batch.end();
    }
}

P-183638
skovv
» 2025-12-13 23:16:10
Ale nie lepiej zrobić tak że ustalasz: albo chcesz zachować w albo h okna? Wtedy jak chcesz trzymać szerokość okna(a wysokość dopasować) to liczysz sobie że jeśli docelowo było w500h1000 a masz w750 to h powinno wynosić 1500
P-183640
tBane
Temat założony przez niniejszego użytkownika
» 2025-12-13 23:19:28
No ale wtedy za każdym razem trzeba na nowo obliczać współrzędne. A z takim widokiem w sfml samo się to oblicza.
P-183641
skovv
» 2025-12-13 23:25:21
I chcesz mieć czarne paski w grze? Bez sensu. A współrzędne musisz liczyć tylko dla UI, mapa jest jaka jest. Ui tak czy siak musisz liczyć np przy obrocie ekranu
P-183643
tBane
Temat założony przez niniejszego użytkownika
» 2025-12-13 23:28:30
Tak, chce mieć czarne pasy :-)

Tak jak tu


P-183644
skovv
» 2025-12-13 23:34:58
Bez sensu ale jak wolisz

package com.tbane.mysticgems;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.utils.viewport.Viewport;
import com.badlogic.gdx.utils.viewport.FitViewport;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;

public class Renderer {

    public static SpriteBatch batch;
    public static final int VIRTUAL_WIDTH = 720;
    public static final int VIRTUAL_HEIGHT = 1612;

    public static OrthographicCamera camera;
    public static Viewport viewport;

    public void create() {
        camera = new OrthographicCamera();
        viewport = new FitViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, camera);

        // Ustawienie początkowej pozycji kamery
        camera.position.set(VIRTUAL_WIDTH / 2f, VIRTUAL_HEIGHT / 2f, 0);
        camera.update();

        batch = new SpriteBatch();
    }

    public void resize(int width, int height) {
        viewport.update(width, height, true); // true -> centrowanie kamery automatyczne
    }

    public static void begin() {
        batch.setProjectionMatrix(camera.combined);
        batch.begin();
    }

    public static void end() {
        batch.end();
    }
}
P-183645
tBane
Temat założony przez niniejszego użytkownika
» 2025-12-14 00:08:31
Nie działa :-/
P-183646
skovv
» 2025-12-14 00:14:37
Nie skaluje okna? Nie mam komputera przy sobie, będę dopiero w poniedziałek. Poczytaj kursy libgdx

Ale ogółem lepiej od razu obczaj jak zrobić fajne skalowanie bo czarne pasy po bokach to bieda
P-183647
« 1 » 2
  Strona 1 z 2 Następna strona