Independência de resolução em libGDX

22

Como faço para independente da minha resolução / densidade de jogo libGDX? Existe uma maneira de especificar tamanhos de imagem como "absolutos", independentemente da densidade subjacente?

Estou fazendo um jogo infantil muito simples; apenas um monte de sprites exibidos na tela e algum texto para menus (menu de opções principalmente). O que eu quero saber é: como faço para que minha resolução de sprites / fontes seja independente? (Eu as envolvi em minhas próprias aulas para facilitar as coisas.)

Como é um jogo simples para crianças, não preciso me preocupar com a "área jogável" do jogo; Quero usar o máximo de espaço possível na tela.

O que estou fazendo agora, o que parece super incorreto, é simplesmente criar imagens adequadas para grandes resoluções e, em seguida, reduzir (ou raramente aumentar) para ajustar ao tamanho da tela. Isso parece funcionar bem (na versão desktop), mesmo com mapeamento linear nas minhas texturas, mas as resoluções menores parecem feias.

Além disso, isso parece estar atrapalhando os "pixels independentes de dispositivo" (DPs) do Android. Ou talvez eu esteja perdendo alguma coisa e a libGDX já cuide disso de alguma forma?

Qual é a melhor maneira de lidar com isso? Eu encontrei este link; esta é uma boa maneira de resolver o problema ?: http://www.dandeliongamestudio.com/2011/09/12/android-fragmentation-density-independent-pixel-dip/

Ele menciona como controlar as imagens, mas não menciona como especificar os tamanhos de fonte / imagem, independentemente da densidade.

ashes999
fonte
Possivelmente relacionado? gamedev.stackexchange.com/questions/34/…
thedaian
@thedaian não é bem assim. Isso é sobre resolução; Estou mais preocupado com a interação entre densidade e resolução.
ashes999

Respostas:

12

Como você pode ler a densidade do dispositivo e renderizar fontes durante o tempo de execução no libgdx, eu uso esta solução para obter um tamanho de fonte independente da densidade:

float densityIndependentSize = origFontSize * Gdx.graphics.getDensity();
int fontSize = Math.round(densityIndependentSize );
BitmapFont font = generator.generateFont(fontSize );
Pascalius
fonte
Minha discussão é sobre imagens e fontes. +1 para a renderização dinâmica da fonte (eu já faço isso).
ashes999
10

Para conseguir isso na libgdx, você pode usar a "orthographicCamera" lá atribuindo o tamanho que deseja usar, e em todas as resoluções poderá ver todas as suas imagens dimensionadas para esse tamanho (eu uso a 800X480 porque é a tela maior no Android ) e funciona bem :)

public class GameStage extends Stage 
{ 
     public GameStage(float width, float height, boolean stretch) 
     { 
          this.camera = new OrthographicCamera(800, 480);
          this.camera.position.set(800/2, 480/2, 0f); 
     } 
}
Rudy_TM
fonte
Posso obter um exemplo de código, por favor?
ashes999
Esse é o código, e você cria uma classe que implementa a interface Screen, no construtor que constrói seu estágio e no método render, você coloca stage.draw (). Se você não quiser usar os Estágios, poderá declarar uma variável na classe implementada Tela do tipo Câmera e fazer o mesmo que no Estágio, mas no método de renderização você aplica uma atualização à câmera.
Rudy_TM
Isso realmente funciona muito bem.
usar o seguinte código
4

Acredito que os "pixels independentes de dispositivo" do Android são apenas um dispositivo de medição para classificar dispositivos e, na verdade, não estão disponíveis como pixels renderizáveis. Portanto, você não está perdendo nenhuma infraestrutura mágica de solução de DPI. Tanto quanto eu entendo o estado da arte aqui, você descobriu todas as opções. Existem duas abordagens básicas para lidar com dispositivos diferentes:

  1. Escale imagens pré-existentes para corresponder ao DPI real do dispositivo.
  2. Escolha entre uma variedade de imagens pré-dimensionadas em tempo de execução, com base no DPI.

Obviamente, você pode fazer uma mistura dos dois (escolher uma imagem mais precisa e depois escalá-la) ou usar abordagens diferentes para diferentes elementos da sua interface do usuário (por exemplo, imagens pré-existentes para fontes / texto e escala dinâmica para a jogabilidade sprites).

O que seu jogo específico está tentando fazer pode realmente fazer a diferença em qual abordagem faz mais sentido. Por exemplo, se você tiver um menu na tela, verifique se os botões têm um tamanho múltiplo razoável da ponta dos dedos (para que o botão seja sempre fácil de apertar, mas não seja maior que o necessário em grandes dispositivos como tablets). Como alternativa, se você estiver tentando criar um jogo de quebra-cabeça em que deseja garantir que todo o quebra-cabeça fique visível de uma só vez, precisará dimensionar os elementos para caber na tela (por exemplo, com um tic-tac-toe) jogo, talvez você queira que cada elemento use aproximadamente 1/3 da tela).

Penso em coisas como fontes com muitos detalhes, que você deseja ter uma variedade de imagens pré-renderizadas com texto e depois escolher a melhor. Portanto, os botões podem mudar sua forma / tamanho relativo de um dispositivo para outro, mas geralmente sempre ficam bonitos.

Dê uma olhada nos Jogos Android de Mario Zerchner para começar a discutir os problemas e algumas soluções. Observe que Mario é o autor do libGDX; portanto, a abordagem do livro reflete a libGDX (observe que eles não são individuais, o livro cobre a criação de uma biblioteca semelhante à libGDX, mas não a própria libGDX).

PT
fonte
Mesmo se eu selecionar coleções de imagens pré-criadas com base no DPI, não vejo como garantir que "esse sprite DEVE exibir 64x64".
ashes999
1
Eu estava assumindo que você configurou sua câmera OpenGL para corresponder à exibição física, então 1 pixel OpenGL é mapeado para 1 pixel de exibição. Nesse ponto, uma imagem de 64x64 será exibida como 64x64 na tela. Como Rudy_TM aponta, você pode mexer no mapeamento da câmera para obter o dimensionamento da tela inteira.
PT
Ok, isso parece o "molho secreto" que eu estava procurando. Vou verificar e informar, obrigado.
ashes999
0

Uma maneira de fazer isso é definir a proporção mínima e a proporção máxima para o seu jogo. Essas serão as proporções que você deseja apoiar. Então você precisa usar uma Viewport que agora é fornecida no libGdx. A janela de visualização escalará seu mundo de acordo com as configurações que você fornecer.

Existem vários tipos de viewports e você precisa selecionar a mais apropriada para o seu jogo.

Você pode usar o ExtendViewport, por exemplo, corrigir sua altura ou largura e calcular a outra. Então você precisa garantir que todos os gráficos possam ser vistos na proporção mínima. A janela de extensão estenderá os gráficos para a proporção correta sem distorcer os gráficos. No entanto, o ExtendViewport funciona adicionando espaço adicional ao seu mundo, para que você também forneça gráficos para planos de fundo, por exemplo, que cubram toda a extensão de proporções cobertas, quando o mundo for menor que a proporção máxima, a parte extra dos gráficos não ser mostrado.

dilom
fonte