Skalowanie widoku i dopasowanie do ekranu

Skalowanie widoku i dopasowanie do ekranu
tBane
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 538
0

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 :-/

badView.png

Kopiuj
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);
}
Kopiuj
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();
    }
}

Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6965
1

Ja bym pozycję Ortho Camera ustawił na środek i wszystko w grze też bym wyświetlał względem środka układu współrzędnych.

Kopiuj
viewport = new FitViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, camera);
camera.position.set(0.0f, 0.0f, 0.0f);
//...
viewport.update(width, height, true); // true -> wycentruj kamerę

Wartości VIRTUAL_WIDTH i VIRTUAL_HEIGHT powinieneś tak dobrać, żeby sprite tła zajmował cały obszar.
FitViewport zrobi resztę - dodaje czarne pasy w zależności od proporcji ekranu.


W jaki sposób teraz konfigurujesz/ładujesz sprite? Z jakimiś domyślnymi ustawieniami?
Skąd gra ma wiedzieć, że chcesz aby renderowana wielkość sprite'ów była oparta o ich wysokość/szerokość w pikselach, a nie jakąś inną miarę?

tBane
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 538
1

Ok. Działa :D Dzięki za pomoc! :-)

Kopiuj
package com.tbane.mysticgems;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.math.Vector2;
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;
import com.tbane.mysticgems.Input.Input;

import java.util.Vector;

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;

    static {
        camera = new OrthographicCamera();
        viewport = new FitViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, camera);

        camera.position.set( Gdx.graphics.getWidth()/2, Gdx.graphics.getHeight()/2, 0);

        //camera.update();
        resize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        batch.setProjectionMatrix(camera.combined);
    }

    public static void resize(int width, int height) {
        viewport.update(width, height, true);
        camera.update();

    }

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

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

}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.