반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리

Corona SDK 프로그래밍 테크닉 3

2011. 11. 10. 18:02 | Posted by 솔웅


반응형
코로나는 외부 라이브러리를 만들거나 로딩할 때 루아 모듈 기능을 사용 합니다. 코로나 SDK와 함께 제공되는 여러 라이브러리들이 있습니다. (예:ui.lua, sprite.lua)
그리고 별도로 파일로 제공되는 라이브러리들도 있습니다. (예:Button, Movieclip, direction 등등)
개발자가 별도로 자신만의 모듈을 만들어 낼 수도 있습니다.

외부 라이브러리 만들기
가장 쉬운 예제는 아래 샘플 코드처럼 하는 겁니다. 이렇게 module() 부분을 넣으면 main.lua에서 불러와서 사용할 수 있습니다. 이 파일의 이름은 확장자가 .lua이어야 합니다.  이 파일을 main.lua와 같은 폴더에 넣습니다. (하위나 상위 폴더에 넣으면 안 되더라구요.)

module(..., package.seeall)
 
-- Declare the functions you want in your module
function hello()
        print ("Hello, module")
end

파일의 확장자는 .lua라야 합니다.

외부 라이브러리 로딩 하기
외부 라이브러리를 로드하려면 require(module name)을 사용해야 합니다.
그러면 외부 모듈 파일 안에 있는 함수를 사용 할 수 있습니다.

-- Load external library (should be in the same folder as main.lua)
local testlib = require("testlib")
 
-- Now the functions in "testlib.lua" are available here:
 
-- call the testlib library function hello(). The "slow" way
testlib.hello()
 
-- cache same function, if you call more than once
local hello = testlib.hello
 
-- now all future invocations are "fast"
hello()

위 예제 코드는 testlib.lua 파일을 require하는 겁니다. main.lua 윗부분에 require 라인을 넣습니다. 그러면 testlib.lua파일 안에 있는 함수(클래스)를 사용할 수 있습니다.
사용하는 방법은 require한 변수.함수 이름 (testlib.hello) 형식으로 사용할 수 있습니다.

Syntax
module(name[,…])
모듈을 생성합니다. 모듈 안에 있는 함수를 불러올 때 그 함수는 글로벌 함수 이거나 글로벌 변수에 대입되거나 해야 합니다. 즉 외부에서 곧바로 로컬 변수나 함수를 불러올 수 없습니다. 다면 외부에서 부른 글로벌 변수에 로컬 함수나 변수를 대입된 경우 사용할 수 있습니다. (좀 헛갈릴 수도 있는데요. 샘플 예제를 보면 쉽게 이해 되실거예요. 샘플 예제는 아래 '외부 모듈 접근 방법 예' 를 보시면 나옵니다.)

require(modname)
해당 모듈을 로딩 합니다.

외부 모듈 접근 방법 예

한 파일(main.lua)에 모든 코드를 다 넣으면 너무 길어서 프로그램을 짠 프로그래머도 이해하기 어려워 질 겁니다. 이 경우 모듈을 이용해서 외부 파일을 만들고 단지 이를 불러오게 되면 코드의 가독성이 높아 질 겁니다.
또한 그 코드가 여러곳에서 여러번 불릴때는 더 많은 코딩의 절약을 할 수 있습니다.

모듈 사용의 한 예를 보여드리겠습니다.
level1.lua
module(..., package.seeall)
 
function loadLevel()

-- create a group for this level
local screenGroup = display.newGroup()

-- create some content for this level
local levelText = display.newText( "Level One", 20, 20, "Helvetica-Bold", 24 )

-- insert the text into this level's group
screenGroup:insert( levelText )

-- calling loadlevel will return the display group
return screenGroup
end
위 코드를 level1.lua로 저장하세요.

그리고 main.lua에 아래 코드를 넣으세요.

local levelGroup = require( "level1" ).loadLevel()
이러면 main.lua를 실행시키면 level1.lua의 loadLevel() 함수가 실행 됩니다.
main.lua안에 있는 코드는 아래와 내용이 같습니다.

local levelGroup = require("level1")
levelGroup.loadLevel()

아래 하나를 더 볼까요?

module(..., package.seeall)

function testFunction1()
    print( "Test 1" )
end

function testFunction2()
    print( "Test 2" )
end

function testFunction3()
    print( "Test 3" )
end

위 코드를 gamefunctions.lua로 저장을 하구요.

local examplemod = require "examplemodule"

examplemod.testFunction1() -- prints "Test 1" to terminal
examplemod.testFunction2() -- prints "Test 2" to terminal
examplemod.testFunction3() -- prints "Test 3" to terminal

이 코드를 main.lua에 저장하세요.

그러면 터미널에 gamefunctions.lua에 있는 세개의 함수 실행결과 Test 1 Test 2 Test 3 가 찍힐 겁니다.

그러면 gamefunctions.lua를 아래와 같이 바꿔보세요.

-- define a local table to store all references to functions/variables
local M = {}

-- functions are now local:
local testFunction1 = function()
    print( "Test 1" )
end
-- assign a reference to the above local function
M.testFunction1 = testFunction1

local testFunction2 = function()
    print( "Test 2" )
end
M.testFunction2 = testFunction2

local testFunction3 = function()
    print( "Test 3" )
end
M.testFunction3 = testFunction3

-- Finally, return the table to be used locally elsewhere
return M

이 코드를 실행 해 보면 결과값이 같을 겁니다.
그런데 이 코드에는 module(..., package.seeall) 가 없습니다.
이것 없이 모든 변수와 함수를 local로 선언해서 사용했습니다.

이렇게 모듈을 로컬로 선언해서 사용할 수 있으면 메모리 관리에 더 좋은 잇점이 있을 겁니다.

루아에서 module() 기능은 점점 중요도가 떨어질 거라는 얘기도 있습니다.

기본적인 모듈 사용법을 숙지 하신 후 실제 프로젝트에서는 나중에 제시한 방법을 사용하시면 좋을 것 같습니다. 혹시 이런 방법에 한계가 있다면 기본 모듈 사용법을 사용해야 할 수도 있으니까요.

Corona API TuneUP

Display library

Properties:
display.contentCenterX -- (equals 0.5*display.contentWidth)
화면의 x좌표 중앙입니다.
display.contentCenterY -- (equals 0.5*display.contentHeight)
화면의 y좌표 중앙입니다.
display.contentScaleX -- (the ratio between content pixel and screen pixel width)
전체 화면 대비 x좌표의 픽셀 비율입니다.
display.contentScaleY -- (the ratio between content pixel and screen pixel height)
전체 화면 대비 y좌표의 픽셀 비율입니다.

Functions:
display.setDefault( key, ... )
Sets default color values for fill, stroke, text, line. See Display Object Color Defaults (below) for details.
오브젝트를 채우는 디폴트 칼라 값을 지정합니다. 자세한 사항은 아래에 설명 됩니다.
display.newGroup( [child1 [, child2 [, child3 ... ]]] )
With no arguments, this will create an empty group and set parent to root (original behavior).
newGroup을 만들 때 사용합니다. 이 그룹은 여러 객체들을 하나의 객체처럼 관리하기 위해 사용 됩니다. 괄호 안에 값들이 없으면 empty group을 생성하게 됩니다. 이렇게 빈 그룹을 먼저 생성 한 후에 insert 할 수 있습니다.
Display Objects
Properties:
object.contentBounds -- (equivalent to object.stageBounds which is deprecated)
객체의 Bound 입니다. 이전 버전에서는 object.stageBounds였었습니다.
object.contentWidth -- (equivalent to object.stageWidth which is deprecated)
객체의 너비입니다. 이전 버전에서는 object.stageWidth 였었습니다.
object.contentHeight -- (equivalent to object.stageHeight which is deprecated)
객체의 높이 입니다. 이전 버전에서는 object.stageHeight였었습니다.

Object methods:
object:toFront() -- moves object to visual front of its parent group (object.parent)
객체를 소속된 그룹의 맨 앞으로 가져 옵니다.
object:toBack() -- moves object to visual back of its parent group (object.parent)
객체를 소속 된 그룹의 맨 뒤로 가져 갑니다.
object:localToContent( x, y ) -- maps x,y in object's local coordinates to content coordinates
로컬 좌표를 content 좌표로 바꿉니다.
object:contentToLocal( x, y ) -- maps x,y in content coordinates to object's local coordinates
content좌표를 local 좌표로 바꿉니다.

Display Object Color Defaults
조 앞에서 잠시 선보였던 겁니다. 여기서 좀 더 자세히 살펴 보겠습니다.
display.setDefault( key, ... )
괄호 안에 들어올 수 있는 키들은 아래와 같습니다.
    •    "fillColor" corresponds to the default fill color for vector objects. The default is initially white.
    •    벡터 객체를 위한 디폴트 fill color. 디폴트 값은 흰색입니다.
    •    "strokeColor" corresponds to the default stroke color for vector objects. The default is initially white.
    •    벡터 객체를 위한 stroke color. 디폴트 값은 흰색입니다.
    •    "lineColor" corresponds to the default line color for line objects. The default is initially white.
    •    라인 객체를 위한 디폴트 라인 칼라. 디폴트 값은 흰색 입니다.
    •    "textColor" corresponds to the default text color for text objects. The default is initially white.
    •    텍스트 객체를 위한 디폴트 텍스트 칼라. 디폴트 값은 흰색입니다.

위 값들은 굳이 바꿀 필요가 있나 하는 생각이 들지만 혹시 모르죠 개발 하다 보면 바꿔야 할 때가 있을지도요…

아래는 fillColor에 대한 예제입니다.
display.setDefault( "fillColor", gray )
display.setDefault( "fillColor", gray, alpha )
display.setDefault( "fillColor", red, green, blue )
display.setDefault( "fillColor", red, green, blue, alpha )
반응형