libGDX의 해상도 독립


22

libGDX 게임 해상도 / 밀도를 어떻게 독립적으로 만들 수 있습니까? 기본 밀도에 관계없이 이미지 크기를 "절대"로 지정하는 방법이 있습니까?

저는 아주 간단한 어린이 게임을 만들고 있습니다. 화면에 표시되는 스프라이트와 메뉴에 대한 일부 텍스트 (주로 옵션 메뉴). 내가 알고 싶은 것은 스프라이트 / 글꼴 해상도를 어떻게 독립적으로 만들 수 있습니까? (나는 일을 더 쉽게하기 위해 자신의 수업에 포장했습니다.)

단순한 어린이 게임이기 때문에 게임의 "재생 가능 영역"에 대해 걱정할 필요가 없습니다. 가능한 한 많은 화면 공간을 사용하고 싶습니다.

내가 잘못하고있는 것처럼 지금하고있는 일은 단순히 큰 해상도에 적합한 이미지를 만든 다음 화면 크기에 맞게 축소 (또는 드물게)하는 것입니다. 텍스처에 선형 매핑을 사용하더라도 (데스크톱 버전에서) 제대로 작동하는 것 같지만 작은 해상도는보기에 좋지 않습니다.

또한 이것은 안드로이드의 "장치 독립 픽셀"(DP)에 직면 한 것으로 보인다. 아니면 뭔가 빠졌고 libGDX가 이미 어떻게 든 처리합니까?

이것을 해결하는 가장 좋은 방법은 무엇입니까? 이 링크를 찾았습니다. 이것이 문제를 해결하는 좋은 방법입니까? : http://www.dandeliongamestudio.com/2011/09/12/android-fragmentation-density-independent-pixel-dip/

이미지를 제어하는 ​​방법은 설명하지만 밀도에 관계없이 글꼴 / 이미지 크기를 지정하는 방법은 언급하지 않습니다.


아마도 관련이 있습니까? gamedev.stackexchange.com/questions/34/…
thedaian

@thedaian이 아닙니다. 그것은 해결에 관한 것입니다. 밀도와 해상도 간의 상호 작용이 더 중요합니다.
ashes999

답변:


12

libgdx 에서 런타임 동안 장치 밀도를 읽고 글꼴을 렌더링 할 수 있으므로이 솔루션을 사용하여 밀도 독립적 글꼴 크기를 얻을 수 있습니다.

float densityIndependentSize = origFontSize * Gdx.graphics.getDensity();
int fontSize = Math.round(densityIndependentSize );
BitmapFont font = generator.generateFont(fontSize );

내 토론은 글꼴뿐만 아니라 이미지에 관한 것입니다. 동적 글꼴 렌더링의 경우 +1입니다 (이미 수행함).
ashes999

10

libgdx에서이 작업을 수행하려면 "orthographicCamera"를 사용하여 사용하려는 크기를 지정하고 모든 해상도에서 모든 이미지가 해당 크기로 조정 된 것을 볼 수 있습니다 (Android에서 더 큰 화면이기 때문에 800X480을 사용함) ) 잘 작동합니다 :)

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

코드 샘플을 얻을 수 있습니까?
ashes999

코드를 작성하고 Screen 인터페이스를 구현하는 클래스를 만들고 생성자에서 스테이지를 만들고 render 메서드에 stage.draw ()를 넣습니다. Stages를 사용하지 않으려면 Camera 유형의 Screen 구현 클래스에서 변수를 선언하고 Stage에서와 동일한 작업을 수행 할 수 있지만 render 메서드에서는 업데이트를 카메라에 적용합니다.
Rudy_TM

이것은 실제로 꽤 잘 작동합니다.
you786

4

안드로이드의 "장치 독립 픽셀"은 장치를 분류하기위한 측정 용 스틱이며 실제로 렌더링 가능한 픽셀로 사용할 수는 없다고 생각합니다. 따라서 환상적인 DPI 해결 인프라를 놓치지 마십시오. 여기에서 최신 기술을 이해하는 한 모든 옵션을 발견했습니다. 다른 장치를 다루는 두 가지 기본 접근법이 있습니다.

  1. 기존 장치 이미지를 실제 장치 DPI에 맞게 조정하십시오.
  2. DPI를 기반으로 런타임에 다양한 사전 배율 이미지 중에서 선택하십시오.

물론 두 가지를 혼합하거나 (거의 정확한 이미지를 선택한 다음 크기 조정) UI의 다른 요소 (예 : 글꼴 / 텍스트의 기존 이미지 및 게임 플레이의 동적 크기 조정)에 대해 서로 다른 접근 방식을 사용할 수 있습니다. 스프라이트).

특정 게임에서 수행하려는 작업은 접근 방식이 더 합리적이라는 점에서 실제로 차이를 만들 수 있습니다. 예를 들어, 온 스크린 메뉴가있는 경우 버튼이 손가락 끝 크기의 적절한 배수인지 확인해야합니다 (따라서 버튼을 항상 누르기 쉽지만 필요한 것보다 크지 않아야 함) 태블릿과 같은 큰 기기). 또는 전체 퍼즐을 한 번에 볼 수 있도록 퍼즐 게임을 만들려는 경우 화면에 맞게 요소를 조정해야합니다 (예 : 틱택 토 사용) 게임은 아마도 각 요소가 대략 1/3의 화면을 사용하기를 원할 것입니다).

텍스트가 포함 된 다양한 사전 렌더링 된 이미지를 원할 때 가장 세부적인 부분이 많은 글꼴과 같은 것을 생각합니다. 따라서 버튼은 상대 기기의 모양 / 크기를 한 기기에서 다른 기기로 변경할 수 있지만 일반적으로 항상 좋아 보입니다.

Mario Zerchner의 Beginning Android 게임 에서 문제에 대한 토론과 해결책을 확인하십시오. Mario는 libGDX의 저자이므로이 책의 접근 방식은 libGDX를 반영합니다 (일대일이 아니며,이 책은 libGDX와 유사한 라이브러리를 작성하지만 libGDX 자체는 다루지 않습니다).


DPI를 기반으로 사전 제작 된 이미지 컬렉션에서 선택하더라도 "이 스프라이트는 반드시 64x64로 표시되어야합니다"라는 보장이 없습니다.
ashes999

1
OpenGL 카메라를 실제 디스플레이와 일치하도록 설정했다고 가정하면 1 개의 OpenGL 픽셀이 1 개의 디스플레이 픽셀에 매핑됩니다. 이때 64x64 이미지가 화면에 64x64로 표시됩니다. Rudy_TM이 지적했듯이 전체 화면 스케일링을 얻기 위해 카메라 매핑을 망칠 수 있습니다.
PT

좋아, 이것은 내가 추구했던 "비밀 소스"처럼 보인다. 감사합니다. 확인하고 알려 드리겠습니다.
ashes999

0

이를 수행하는 한 가지 방법은 게임의 최소 종횡비와 최대 종횡비를 정의하는 것입니다. 지원하려는 비율이됩니다. 그런 다음 libGdx에서 제공되는 뷰포트를 사용해야합니다. 뷰포트는 사용자가 제공 한 설정에 따라 세상을 확장합니다.

뷰포트에는 여러 유형이 있으며 게임에 가장 적합한 뷰포트를 선택해야합니다.

예를 들어 ExtendViewport를 사용하여 높이 또는 너비를 고정하고 다른 것을 계산할 수 있습니다. 그런 다음 모든 그래픽을 최소 종횡비로 볼 수 있는지 확인해야합니다. 확장 뷰포트는 그래픽을 왜곡하지 않고 그래픽을 올바른 종횡비로 조정합니다. 그러나 ExtendViewport는 월드에 추가 공간을 추가하여 작동하므로 월드가 최대 종횡비보다 작을 때 그래픽의 추가 부분이 차지하지 않는 전체 종횡비를 커버하는 배경 그래픽을 제공해야합니다. 표시됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.