FAQ Wednesday #7
Posted by Tom Newman
수요일이 왔습니다. 다시 FAQ 시간이 됐네요. 아래 5개의 FAQ 가 있습니다.
Question 1
왜 시뮬레이터하고 디바이스하고 텍스트 spacing/positioning이 약간 다른가요?
Answer
시뮬레이터와 디바이스는 서로 폰트들이 다릅니다. native.systemFont는 OS에 따라 다르게 됩니다. 맥에서는 LucidaGrande 24 pt이고 iOS에서는 Helvetica 입니다. 그리고 윈도우즈는 또 다릅니다. 다른 폰트는 사이즈가 같더라도 약간 다른 공간을 차지합니다. 그래서 alignment에 다른점들이 있게 됩니다.
같은 폰트라도 OS가 랜드링을 하면서 다를 수가 있습니다. 맥OS와 iOS는 비슷한 code paths를 사용하지만 기본 text drawing은 약간 다릅니다. 같은 폰트라도 약간 다르게 glyph를 랜더링 할 수가 있습니다. 그것은 저희쪽에서 어떻게 할 수 있는 문제가 아닙니다.
이렇게 서로 다르게 나타나는 것을 방지하려면 bitmap fonts를 사용하는 수밖에 없습니다.
Question 2
display.newText로 text를 aligning 하는데 문제가 있습니다. 제대로 잘 하려면 어떻게 해야죠?
Answer
display.newText는 x,y 파라미터를 top, left를 위치시키는데 사용하게 됩니다. 여러분이 객체를 생성하고 난 후 x,y를 세팅하면 디폴트로 text의 중앙을 세팅하게 됩니다. object가 생성될 때와 같은 alignment를 사용하려면 bject:setReferencePoint( display.TopLeftReferencePoint )를 사용하실 수 있습니다. (좀 헛갈리죠? 그래서 이런 factory methods로 x,y 파라미터의 alignment를 컨트롤 할 수 있도록 준비하고 있으니 조만간 나오는 Daily Build 에서 반영 될 겁니다.)
그리고 display.newText가 call 되는 방법에 따라 width(w)와 height(h)를 어떻게 계산하는지도 이해하는게 헛갈리기도 합니다.
w,h 가 제공되지 않으면 display.newText는 한줄짜리 객체를 생성하고 제공된 string에 맞게 대략적으로 사이즈도 생성됩니다. 이 w,h에 따라 x,y 포지션이 결정됩니다.
w,h 가 정해져 있으면 display.newText는 제공된 width/height 를 사용해 포지션을 계산합니다. 그렇게 해서 x,y가 top left 가 됩니다. (만약 h가 0dlaus height는 해당 string에 따라 달라집니다.)
그러니까 생성하고 난 후 x,y를 세팅할 때 (예. txt.x = xAlign) 여러분은 디폴트로 object의 center를 세팅하게 됩니다. 그래서 두개의 text 객체가 같은 string 이지만 다른 width를 가질 수 있습니다. 그렇게 되니까 center로 세팅하면 좌측 정열이 되지 않는겁니다.
Question 3
여러 API를 사용해 baseDirectory를 봤는데요. 왜 이건 subdirectory를 지원하지 않죠?
Answer
display.newImage와 다른 API들이 사용하는 baseDirectory 파리미터는 시뮬레이터나 디바이스에서 사전에 지정된 시스템 디렉토리를 명시하기 위한 optional parameter 입니다. 이 파일 시스템은 sandboxed 입니다. 그래서 baseDirectory는 다음과 같은 것들 중 하나 입니다.:system.ResourceDirectory, system.TemporaryDirectory, system.DocumentsDirectory. 만약 아무런 baseDirectory가 명시돼 있지 않으면 디폴트로 system.ResourceDirectory가 됩니다.
만약 subdirectory를 참조할 필요가 있으면 그 디렉토리는 file name에 추가 되야 합니다. baseDirectory 파라미터에 추가 되지 않습니다. 아래에 Resource directory와 Document directory안에 myImages 라는 서브디렉토리의 이미지에 접근하기 위한 몇개의 샘플코드가 있습니다.
local image1 = display.newImage( "myImages/redBall.png", 10, 200 )
-- This next line is the same as the previous
local image2 = display.newImage( "myImages/redBall.png", system.ResourceDirectory, 10, 200 )
local image3 = display.newImage( "myImages/redBall.png", system.DocumentsDirectory, 10, 200 )
Note: Documents directory는 이미지나 파일들을 저장하는데 사용될 수 있습니다. 이 때 어플리케이션은 반드시 먼저 그 디렉토리에 파일을 create/copy 해야 합니다.
여러분은 system.pathForFile인 디렉토리를 명시하거나 subdirectory의 path를 명시하는데 사용될거라고 생각할 수 있습니다. 하지만 baseDirectory가 필요한 곳에서는 제대로 작동하지 않을 겁니다.
Question 4
. 와 / 를 사용해서 subdirectory들에 접근하는게 잘 혼동되요.
Answer
간단하게 답변을 드리면 . 는 require API로 로드된 서브 디렉토리안의 모듈에 접근하는데 사용되고 / 는 다른 모든 API들에 사용됩니다. (이전 질문 답에서 보여드렸던 display.newImage 같은 겁니다.) storyboard.gotoScene도 require를 사용하므로 . 가 서브디렉토리의 scene 모듈에 접근하는데 사용되는 겁니다.
만약 movieclip.lua 모듈과 Image가 assetes 서브디렉토리에 있다면 어떻게 접근해야 하는지 아래에 예제가 있습니다.
local movieclip = require( "assets.movieclip" )
local image1 = display.newImage( "assets/redBall.png", 10, 200 )
Question 5
File I/O API에서 baseDirectory를 찾아 볼 수가 없어요. 어떻게 이 디렉토리를 명시하죠?
Answer
io.open API는 파일을 읽고 쓰기 위해 open을 사용합니다. 여기서 디렉토리와 파일 이름이 포함된 스트링인 path를 명시하죠. 이 스트링은 system.pathForFile로 생성됩니다. 아래에 File I/O를 사용해서 어떻게 디렉토리를 명시하는지 보여드립니다.
local path = system.pathForFile( "data.txt", system.DocumentsDirectory )
-- Open a file path
local fh, reason = io.open( path, "r" )
if fh then
-- Read all the contents of the file into a string
local contents = fh:read( "*a" )
print( "Contents of " .. path .. "\n" .. contents )
else
print( "Reason open failed: " .. reason )
end
만약 서브디렉토리 안의 파일에 접근하실 필요가 있다면 파일 이름에 서브디렉토리를 append 하시면 됩니다. 아래 예제는 Resource directory에서 서브디렉토리로 접근하기 위해 path를 사용하는 방법을 보여 드립니다.
local path = system.pathForFile( "myFiles/data.txt", system.ResourceDirectory )
오늘은 여기까지 입니다. 즐거우셨기를 바라구요. 새로운거 몇가지를 배울 수 있는 기회가 됐다면 좋겠네요.
'Corona SDK > Corona SDK TIPs' 카테고리의 다른 글
FAQ Wednesday: Mac Simulator 와 Native Fonts (0) | 2012.08.26 |
---|---|
FAQ Wednesday: Display Object Listeners (2) | 2012.08.21 |
수요일의 FAQ - Simulator 관련 질문들 (2) | 2012.08.03 |
FAQ Wednesday: 페이스북 관련 질문들... (0) | 2012.07.26 |
수요일의 FAQ - 070412 - (0) | 2012.07.08 |
애플에 버그 report 하기 (1) | 2012.06.09 |
FAQ Wednesday #6 (2) | 2012.05.25 |
수요일의 FAQ 5 번째 시간 (0) | 2012.05.21 |
FAQ Wednesday #4 - Corona SDK - (2) | 2012.05.10 |
Corona SDK 수요일의 FAQ - 4/25/2012 (4) | 2012.04.27 |