새 화면을 넣고 내 기기에서 확인했다. 잘 나와서 그대로 냈는데 버튼이 화면 밖으로 나가 안 눌린다는 얘기가 들어왔다.
Table of contents
Open Table of contents
무엇이 달랐나
내 기기는 WVGA 라 가로가 800이었다. 문의한 쪽은 HVGA 로 480이었다. 버튼은 getWinSize() 에서 일정 값을 뺀 자리에 뒀다.
btn->setPosition(ccp(win.width - 120, 60));
숫자만 보면 좁은 화면에서도 안쪽이다. 문제는 버튼 크기였다. CCSprite 는 만들 때 setAnchorPoint(ccp(0.5f, 0.5f)) 를 한다. 기준점이 가운데라는 뜻이다. 이미지 폭이 200이면 절반인 100이 오른쪽으로 더 나간다.
요소 크기를 기준으로 잡았다
고정 값 대신 getContentSize() 를 받아 모서리에서 띄우게 바꿨다.
btn->setPosition(ccp(win.width - btn->getContentSize().width / 2 - margin,
btn->getContentSize().height / 2 + margin));
비율로 잡는 방법도 있었는데 이쪽이 더 확실했다. 버튼 이미지 크기가 바뀌어도 안 나간다.
세로 비율도 달랐다
크기를 맞추고 나니 다른 것이 보였다. 세로가 800인 기기와 854인 FWVGA 기기가 있어 가로세로 비가 다르다.
배경을 꽉 채우려고 가로세로를 따로 늘렸다. 비가 다른 기기에서 찌그러졌다. 한 배율로 setScale() 하고 넘치는 부분을 잘라내는 쪽으로 바꿨다.
float s = MAX(win.width / bg->getContentSize().width,
win.height / bg->getContentSize().height);
bg->setScale(s);
비가 유지되고 화면은 다 덮인다. 대신 가장자리가 잘리니 중요한 것을 거기에 두지 않았다.
확인 목록과 그 밖의 차이
기기를 여러 대 못 구해서 AVD 를 네 개 만들어 뒀다. QVGA 와 HVGA 와 WVGA 와 가로 배치다. 화면을 하나 만들 때마다 넷을 돌려 봤고 대부분 첫 번째에서 걸렸다.
해상도만 다른 것이 아니었다. 메모리가 적은 기기에서는 텍스처를 많이 쓰는 스테이지가 꺼졌다. Android 판이 낮은 기기에서는 없는 기능을 부르다 실행 중에 죽었다. 다 갖출 수는 없다. 확인 가능한 것부터 목록으로 만들었다. 못 한 것은 못 했다고 적어 뒀다.
시험 빌드에는 getWinSize() 값을 화면에 띄웠다. 문의를 받았을 때 그 숫자를 물어보면 어느 조건인지 바로 안다. 없으면 기종을 듣고 사양을 찾아봐야 한다.
정리
- 한 대에서 확인한 것은 그 한 대에서 된다는 뜻이다
- 화면 끝에서 고정 값만큼 뺀 위치는 좁은 화면에서 밖으로 나간다
CCSprite는 기준점이 가운데라 폭의 절반이 더 나간다getContentSize()로 여백을 잡으면 크기가 바뀌어도 안 나간다- 가로세로를 따로 늘리면 찌그러지므로 한 배율로
setScale()한다 - 잘리는 가장자리에는 중요한 것을 두지 않는다
- 기기를 못 구하면
AVD를 해상도별로 만들어 둔다 - 시험 빌드에
getWinSize()를 띄우면 문의 조건을 바로 안다