Skip to content
isdnetworks
Go back

같은 이미지가 다르게 보였다

Cocos2d-x 로 모바일 게임을 만들게 됐다. 내 기기에서 확인했을 때는 잘 나왔다. 다른 Android 기기에서 켜니 배치가 어긋나 있었다.

Table of contents

Open Table of contents

좌표를 숫자로 박아 뒀다

버튼 위치를 이렇게 적어 뒀다.

button->setPosition(ccp(240, 400));

기기마다 화면 크기가 다르다. 내 기기는 가로가 480이라 240이 가운데인데, 가로가 320인 기기에서는 오른쪽 끝 밖이다. 같은 좌표가 다른 위치가 된다.

비율로 바꿨다

CCDirector 에서 화면 크기를 얻어 비율로 계산했다.

CCSize s = CCDirector::sharedDirector()->getWinSize();
button->setPosition(ccp(s.width * 0.5f, s.height * 0.5f));

가운데가 어느 기기에서든 가운데가 됐다.

여기서 한 번 헷갈렸다. getWinSize()getWinSizeInPixels() 가 따로 있다. 앞은 포인트이고 뒤는 실제 픽셀이다. setContentScaleFactor 를 준 상태면 둘이 다른 값이 된다. 배치는 포인트 쪽으로 하는 것이 맞았다.

그런데 이번엔 버튼이 작아 보였다. 이미지 크기가 픽셀로 고정돼 있어서다. 화면이 800일 때 버튼 100은 8분의 1이고 화면이 480이면 5분의 1쯤이다. 같은 100인데 화면에서 차지하는 비중이 다르다.

크기도 화면에 맞춰 조절했다. 기준 화면을 하나 잡고 그 비율로 키우거나 줄인다.

float scale = s.height / 800.0f;
button->setScale(scale);

기준 화면 하나를 정해 두는 것이 요점이었다. 기준이 없으면 기기마다 따로 맞춰야 한다.

우리가 쓰는 판에는 이걸 대신 해 주는 것이 없었다. CCDirectorenableRetinaDisplay 는 있는데 iPhone 4 와 iPod touch 4 만 본다. Android 의 여러 해상도는 손으로 맞춰야 했다.

화면 비율이 다르면 또 어긋났다

크기를 맞췄는데도 어긋나는 기기가 있었다. 가로세로 비율이 달랐다. 높이를 맞추면 가로가 남거나 모자라고 너비를 맞추면 세로가 그렇다. 둘 다 맞출 수는 없다.

방법이 셋 있었다. 여백을 두면 전부 보이는 대신 검은 띠가 생긴다. 잘라내면 꽉 차는 대신 가장자리가 잘린다. 늘리면 꽉 차는 대신 그림이 찌그러진다. 찌그러지는 것은 바로 눈에 띄어서 뺐다.

여백 쪽은 CCEGLViewsetViewPortInPoints 로 그릴 자리를 좁혀서 만든다.

배경과 버튼의 차이

남은 둘을 놓고 보다가 배경과 버튼의 성격이 다르다는 것을 알았다. 배경은 가장자리가 잘려도 되지만 버튼은 잘리면 못 누른다.

그래서 나눴다. 배경은 화면을 덮게 하고 버튼은 안전 영역 안에 뒀다. setAnchorPoint 를 가운데로 두면 배율을 바꿔도 기준점이 안 흔들린다. 하나로 정할 문제가 아니라 대상마다 다르게 정할 문제였다.

확인은 양 끝 기기로 했다. 가장 작은 화면과 가장 큰 화면과 가장 긴 비율을 본다. 그러면 가운데는 대체로 따라온다. 한 기기에서만 보면 그 기기에서만 맞는다.

이걸 나중에 고치느라 좌표를 전부 다시 썼다. 처음부터 비율로 썼으면 숫자만 다르게 적으면 될 일이었다. 이후로는 좌표를 비율로 쓰고 크기를 기준 화면 대비 배율로 쓰고 중요한 것을 안전 영역에 두는 셋을 처음부터 지켰다.

정리


Share this post on:

Previous Post
물려받은 규칙을 확인 없이 따랐다
Next Post
한꺼번에 보냈더니 한도에 걸렸다