항상 펍에서 도움만 받는게 죄송해서 오늘 성공한 팁을 알려드리고자 합니다.

고수분들께서야 이미 당연히 알고 계시는 내용이겠지만 저를 비롯한 몇몇 분들은

이 내용에 대한 질문을 자주 올리셨고 저같은 초보들은 아직 모르실거라 생각되어

자문자답 형식으로 올려보겠습니다.


보통 안드로이드는 기계들이 다양한 해상도를 가지고 있어서 픽셀 좌표계가 아닌

DIP 값(일종의 비율을 이용하는)을 이용해서 앱을 개발해야 한다고 합니다.

개념상으론 이해가 됩니다만, 이게 도통 구현하려면 어찌해야 할지 막막합니다.

게다가 게임은 Canvas를 사용하기 때문에 픽셀 좌표계를 사용하는게 더 쉽거든요.

가령 HVGA(320x480)에 최적화된 게임을 만든다면 WVGA(480x800)에서는 두가지 현상이 일어납니다.

매니페스트 설정에서 minSdkVersion="1" 일 때는 320x480이 480x800으로 강제적으로 맞춰지지만

가로 비율이 480 / 320 = 1.5이기 때문에 세로 화면은 480 X 1.5 = 720까지만 표현됩니다.

나머지 80도트는 블랭크 화면으로 나타나지요.

두번째는 minSdkVersion="7" 일 때는 480x800에서 320x480 만큼 절대적인 크기만 표시되고

나머지는 전부 블랭크로 표시됩니다.

저 같은 경우는 게임 화면이 좌우로 늘어나더라도 화면에 꽉 차게 나오길 원했습니다.

저처럼 게임 화면이 늘어나도 그렇게 나오길 희망하시는 분들이 많을거라 봅니다.

이걸 손쉽게 해결할 수 있는 방법이 있습니다.


Canvas의 scale( float x, float y ) 함수를 사용하는 방법입니다.

우선 게임을 320x480에 맞춰서 개발했다고 가정합니다. HVGA에선 당연히 문제없이 실행되겠지요.

그런데 WVGA에서 실행했다고 하면 scale 함수로 화면 비율을 다시 설정해주면

좌표값을 바꾸지 않고도 이미지의 위치와 크기가 자동적으로 늘어나게 할 수 있습니다.

float ScaleX = canvas.getWidth() / 320f;
float ScaleY = canvas.getHeight() / 480f;

이렇게 하면 ScaleX에는 480 / 320 = 1.5f. ScaleY에는 800 / 480 = 1.6666f가 저장되게 됩니다.

이 값을 canvas.scale( ScaleX, ScaleY );로 설정해주면 끝입니다.

이때 minSdkVersion은 반드시 1:1로 표시되는 "7"이어야 합니다.

이렇게 해주면 화면 사이즈가 얼마이든 간에 화면에 꽉 찬 게임 화면을 구현할 수 있습니다.

스케일이 늘어나는 것이므로 좌표를 수정하지 않아도 자동으로 보정이 됩니다.

그러니까 WVGA의 화면 480x800에 꽉 차게 게임 화면이 그려지면서도 좌표계는 320x480을 그대로 쓸 수 있다는거죠.

그 반대로도 가능합니다. WVGA로 만들어진 것을 HVGA에 출력해도 화면에 꽉 차게 나옵니다.

문제는 터치 스크린 좌표입니다.

터치 좌표계는 화면의 실제 해상도를 쓰게 되므로 이 값 역시 원하는 좌표계로 변환을 해줘야 합니다.

float Scale_X = 320f / canvas.getWidth();
float Scale_Y = 480f / canvas.getHeight();

터치 스크린에서 얻어진 가로 좌표에 Scale_X를 곱해주고, 세로 좌표에 Scale_Y를 곱해주면

해상도가 어떻든 간에 320x480 좌표계를 사용할 수 있습니다.

제가 만든 게임에 현재 적용했습니다만 매우 만족스런 결과를 얻었습니다.

이런 문제로 고민하셨던 분들에게 도움이 됐으면 좋겠네요.

감사합니다.

P.S : 게시판 성격에 맞지 않을수도 있습니다만,
          질문/답변에서 검색하는 분들이 많으니까 여기 있으면 더 도움이 될듯 하네요.