=================================
=================================
=================================
출처: http://blog.naver.com/twishgod/90097578805
[팁] 아이폰 게임 안드로이드로 포팅할 때 해상도 문제 쉽게 해결하기 안드로이드 / 코딩이야기 2010/10/08 13:15 http://twishgod.blog.me/90097578805 |
아이폰과 안드로이드는 많은 차이가 있겠지만 가장 크면서도
가장 귀찮은 차이는 해상도다..
개발자 입장에서 아이폰은 어쩌면 꽤나 편한 플렛폼이다.
아이폰 게임이 있다고 치자. 이걸 안드로이드로 포팅해야 한다.
가장 귀찮은 것이 무엇일까?
480*320에 맞춰서 개발된 게임을 800*480혹은 그 외 해상도에
맞춰야 한다는 것 아닐까?
처음에는 800*480의 화면에 텍스쳐를 그릴 때 일일이 계산을 해서
좌표를 맞춰주었다. 번거롭지 않은가.. 그러다 생각해보니 완전히 바보짓이었다.
아래는 서피스 부분인데 2D게임이다.
public void onSurfaceChanged(GL10 gl, int width, int height) {
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL11.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(-0.0f,(float)480,(float)320,-0.0f,-32768.0f,32767.0f);
//위에 480,320에 원하는 해상도를 집어넣는다.
}
위 코드를 넣으면 OPENGL로 그릴 때 일일이 연산을 해서 좌표를 잡지 않아도 된다.
하지만 여기서 문제가 하나 생기는데 별거 아니다.
터치 좌표의 문제인데 해상도는 800*480인데 실제 그리는 것은 480*320이니
연산을 해줘야 한다.
float scale_value_x = width / 480.0f;
float scale_value_y = height / 320.0f;
int touch_x = X터치좌표 / scale_value_x;
int touch_y = Y터치좌표 / scale_value_y;
width,height는 위 코드 서피스에서 저장해 놓을 필요가 있다.
뭐 대충 설명했지만 이 정도면 충분하다.
게임은 보통 풀화면이기 때문에 dpi니 이런 것들 신경 쓸 필요도 없고
gl.glOrthof 잘 쓰면 비율에 맞추거나 하는 것도 어렵지 않아 보였다.
하여간 연구 좀 해보기 바란다.
=================================
=================================
=================================
출처: http://www.androidpub.com/1252926
[FAQ] 게임 해상도 모든 기기에 맞추기
바야바
http://www.androidpub.com/1252926
2011.01.28 23:25:52
7370
0 / -1
항상 펍에서 도움만 받는게 죄송해서 오늘 성공한 팁을 알려드리고자 합니다.
고수분들께서야 이미 당연히 알고 계시는 내용이겠지만 저를 비롯한 몇몇 분들은
이 내용에 대한 질문을 자주 올리셨고 저같은 초보들은 아직 모르실거라 생각되어
자문자답 형식으로 올려보겠습니다.
보통 안드로이드는 기계들이 다양한 해상도를 가지고 있어서 픽셀 좌표계가 아닌
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 : 게시판 성격에 맞지 않을수도 있습니다만,
질문/답변에서 검색하는 분들이 많으니까 여기 있으면 더 도움이 될듯 하네요.
엮인글 주소 : http://www.androidpub.com/index.php?document_srl=1252926&act=trackback&key=402
2011.01.28 23:30:11
바야바
추가로 이 방법을 쓰시는 경우 화면의 크기를 나타내는 getWidth()나 getHeight() 함수 등은 사용하시면 안됩니다. SCREEN_X = 320, SCREEN_Y = 480 이런 식으로 미리 변수를 정해두시고 getWidth() 대신 SCREEN_X를 쓰셔야 합니다. 아 그리고 이미지는 무조건 drawable-hdpi에 넣어두셔야 합니다. drawable 폴더에 넣어두시면 원하는 결과를 얻으실 수 없습니다.
2011.01.28 23:38:05
회색
자주하는 질문 카테고리에 넣었습니다. 감사합니다.
2011.09.11 02:58:24
티티
이방법을 사용하면 작은 해상도에서 확대는 가능하지만
축소는 문제가 생기더라구요
코드 예상할경우 이미지를 480x800을 기준으로 320*480사이즈로 축소할경우에
문제가 생기게 되더라구요
왜그런지 찾아보다가
큰해상도에서 작은해상도로 실행을할경우 자동으로 이미지를 줄여주는데
이게또 정확한 사이즈로 줄여주고하는것이 아니라 이미지가 화면보다 좀더크거나
화면보다 작거나 하는경우가 생기더라구요..
일단 다른 우회방식으로 하긴햇는데 이미지도 많이깨저서
자동 축소 기능을 없애는 방법을 혹시찾으셧나해서요
2012.01.06 16:38:38
저임ㅋ
좋은글 감사드립니다 !
2012.03.17 20:01:52
안드로데브쟁이
한가지더 알려드릴게요. 비트맵 팩토리에서 생성할때 비트맵에옵션을주지 않으면 제대로 되지않습니다.
weapon_sample=BitmapFactory.decodeResource(context.getResources(), R.drawable.weapon_barricade, Trooper.opt);
이런식으로 끝에 옵션을 주고, inScale값을 false로 주셔야만 잘됩니다.
2012.03.17 23:30:15
Godwish
canvas로 만드시나요? opengl하실줄 알았는데~
2012.03.17 23:53:26
바야바
2011년 1월에 쓴 글입니다. 제가 안드로이드를 처음 시작한게 2011년 11월부터니까 얼마 안되서였죠. 그후에 Canvas는 많은 문제점이 있단걸 알게되서 OpenGL로 갈아탄거죠. 이 글은 아마도 검색하시는 분들이 많아서 회색님이 위로 올려주신듯 합니다.
2012.05.29 01:37:13
리사심슨
정말 감사드립니다.
이미지가 늘어지는 면이 없지않아 있지만 아주 쉽게 해결이 가능하네요.
간단하고 좋은 방법이라고 생각합니다.
2013.03.27 18:39:14
laneige
@Override
public void onDraw(Canvas canvas) {
float ScaleX = canvas.getWidth()/ 320f;
float ScaleY = canvas.getHeight() / 480f;
canvas.scale( ScaleX, ScaleY );
canvas.drawBitmap(m_BackGroundImage, 0,0,null);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float Scale_X = 320f / canvas.getWidth();
float Scale_Y = 480f / canvas.getHeight();
int px = (int)event.getX();
int py = (int)event.getY();
}
현재 문제가 되고 있는 부분은 위에 빨간색 부분입니다.
onDraw 함수에서 지역변수 canvas를 선언했는데 다른 함수에서 사용하려고 보니 문제가 생기네요...ㅠ
어떻게 하면 쉽게 사용할 수 있을까요.??? 다른 class의 함수같은 경우는 새로운 객체를 생성해서 이용했엇는데 말이죠..
도움 부탁합니다.
[출처] [팁] 아이폰 게임 안드로이드로 포팅할 때 해상도 문제 쉽게 해결하기|작성자 Godwish
=================================
=================================
=================================
'스마트기기개발관련 > 안드로이드 개발' 카테고리의 다른 글
안드로이드|android bitmap,paint 효과 (안티엘리어싱, 부드럽게, 반전 등등) 적용 관련 (0) | 2020.09.19 |
---|---|
WebView 포커스 관련 ~ EditText 와 WebView 혼용 사용시 포커스 문제 (0) | 2020.09.19 |
안드로이드 탭 구현 관련 (0) | 2020.09.19 |
주요 안드로이드 기기 개발 해상도, DIP, DP, DPI, DENSITY 정리 관련 (0) | 2020.09.19 |
안드로이드 버튼 그라데이션 넣어주기 관련 (0) | 2020.09.19 |