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

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리


반응형
오늘 공부할 Tables and Arrays 는 양이 매우 짧습니다.
그리고 제가 이 글을 회사에 1시간 일찍 출근해서 쓰는데요.
테이블 관련한 예제는 금방 만들어내기도 힘들고 해서 따로 예제를 올려드리지 못 할것 같구요.
그래서 오늘은 그냥 원문을 번역해 볼까 합니다.

아래 주소에서 복사해 왔습니다.
http://developer.anscamobile.com/content/tables-arrays

Tables and Arrays

Tables in Lua implement associative arrays. That is, they can be indexed not just with numbers, but also with strings or any other value of the language, except nil.

루아의 테이블은 배열 역할을 한다. 숫자값으로만이 아니라 스트링이나 다른 문자로도 인덱스 할 수 있다는 의미다. 단 nill은 제외한다.

This library provides generic functions for table manipulation. It provides all its functions inside the table table.

이 라이브러리는 테이블을 다루는 기능을 제공한다. 이 기능들은 table 이라는 테이블을 통해서 제공한다.

Most functions in the table library assume that the table represents a numerically-indexed array or list. For these functions, when we talk about the "length" of a table we mean the result of the length operator.

테이블 라이브러리의 대부분의 기능들은 숫자로 인덱스된 배열이나 리스트의 기능을 수행한다. 이 기능과 관련 우리가 테이블의 length라고 말하는 것은 length 오퍼레이터에 의해 받아온 결과를 말하는 것이다.

table.concat (table [, sep [, i [, j]]])

Given an array where all elements are strings or numbers, returns table[i]..sep..table[i+1] ... sep..table[j]. The default value for sep is the empty string, the default for i is 1, and the default for j is the length of the table. If i is greater than j, returns the empty string.

테이블 내에 있는 문자나 숫자들을 table[i]..sep..table[i+1] ... sep..table[j] 식으로 리턴한다.  sep의 디폴트 값은 empty string이고 i는 1, j 는 테이블의 length이다. i가 j 보다 크면 empty string을 반환한다.

table.insert (table, [pos,] value)

Inserts element value at position pos in table, shifting up other elements to open space, if necessary. The default value for pos is n+1, where n is the length of the table, so that a call table.insert(t,x) inserts x at the end of table t; however, if you are inserting at the end of the table, it is faster to use the length operator: t[#t + 1] = x.

테이블의 pos 위치에 해당 value를 삽입한다. 필요하면 다른 값들은 위치를 이동하게 된다. pos의 디폴트는 n+1이다. (n은 테이블의 length). 예를 들어 table.insert(t,x)라고하면 x를 테이블 t의 맨 마지막 요소로 삽입하게 된다.

table.maxn (table)

Returns the largest positive numerical index of the given table, or zero if the table has no positive numerical indices. (To do its job this function does a linear traversal of the whole table.)

해당 테이블에 있는 값들의 갯수를 리턴하게 된다. 값이 없으면 0를 리턴한다.

table.remove (table [, pos])

Removes from table the element at position pos, shifting down other elements to close the space, if necessary. Returns the value of the removed element. The default value for pos is n, where n is the length of the table, so that a call table.remove(t) removes the last element of table t.

pos위치에 있는 값 remove한다. 필요하면 다른 값들의 위치를 이동한다. 그리고 remove된 값을 리턴한다. pos의 디폴터 값은 n이다. table.remove(t) 하면 테이블 t의 마지막 값이 remove된다.

table.sort (table [, comp])

Sorts table elements in a given order, in-place, from table[1] to table[n], where n is the length of the table. If comp is given, then it must be a function that receives two table elements, and returns false when the first is less than the second (so that not comp(a[i+1],a[i]) will be false after the sort). If comp is not given, then the standard Lua operator < is used instead.

주어진 조건으로 테이블 내의 값들을 sorting한다. comp 값이 주어지면 두개의 테이블 값들을 받게 된다. 만약 첫번째가 두번째보다 적으면 false를 리턴한다. comp가 주어지지 않으면 Lua의 standard operator 인 < 가 사용된다.

The sort algorithm is not stable; that is, elements considered equal by the given order may have their relative positions changed by the sort.

소팅은 주어진 조건에 맞게 이루어지므로 항상 조건이 고정돼 있는 것은 아니다.

==================

코로나 SDK에서의 테이블(배열)에 대해 훑어 봤습니다.

다음 주제는 Math인데요. 이것도 Math관련 함수를 죽 정리해 놓은것 뿐이니까 이것도 간단히 정리하겠습니다.

원문은 아래 주소에 있습니다.

http://developer.anscamobile.com/content/math

This library is an interface to the standard C math library. It provides all its functions inside the table math.

이 라이브러리는 standard C 의 math 라이브러리를 사용한다. 이 기능들은 math라는 테이블을 통해 제공된다.

math.abs (x)

Returns the absolute value of x.

x의 절대값을 리턴한다.

math.acos (x)

Returns the arc cosine of x (in radians).

x의 원호 코사인을 리턴한다.

math.asin (x)

Returns the arc sine of x (in radians).

x의 원호 사인을 리턴한다.

math.atan (x)

Returns the arc tangent of x (in radians).

x의 원호 탄젠트를 리턴한다.

math.atan2 (y, x)

Returns the arc tangent of y/x (in radians), but uses the signs of both parameters to find the quadrant of the result. (It also handles correctly the case of x being zero.)

y/x의 원호 탄젠트를 리턴한다.

math.ceil (x)

Returns the smallest integer larger than or equal to x.

x보다 크거나 같은 최소값의 인티저를 리턴한다.

즉 소수값을 자연수로 고쳐준다.

math.cos (x)

Returns the cosine of x (assumed to be in radians).

x의 코사인을 리턴한다.

math.cosh (x)

Returns the hyperbolic cosine of x.

x의 쌍곡선 코사인을 리턴한다.

math.deg (x)

Returns the angle x (given in radians) in degrees.

x의 각도를 리턴한다.

math.exp (x)

Returns the value ex.

ex의 값을 리턴한다.

math.floor (x)

Returns the largest integer smaller than or equal to x.

x보다 작거나 같은 수 중 가장 큰 자연수를 리턴한다.

math.fmod (x, y)

Returns the remainder of the division of x by y that rounds the quotient towards zero.

x를 y로 나눈 값의 나머지를 리턴한다.

math.frexp (x)

Returns m and e such that x = m2e, e is an integer and the absolute value of m is in the range [0.5, 1) (or zero when x is zero).

x=m2e 같은 m,e 를 리턴한다. e는 m의 자연수이고 절대값이다. m은 [0.5,1] 사이에 있다.

math.huge

The value HUGE_VAL, a value larger than or equal to any other numerical value.

다른 수들보다 큰 수.

math.ldexp (m, e)

Returns m2e (e should be an integer).

m2e를 리턴한다. (e는 자연수라야 한다.)

math.log (x)

Returns the natural logarithm of x.

x의 로그를 리턴한다.

math.log10 (x)

Returns the base-10 logarithm of x.

x의 -10로그를 리턴한다.

math.max (x, ...)

Returns the maximum value among its arguments.

괄호 안의 값 들 중 가장 큰 수를 리턴한다.

math.min (x, ...)

Returns the minimum value among its arguments.

괄호 안의 값들 중 가장 작은 수를 리턴한다.

math.modf (x)

Returns two numbers, the integral part of x and the fractional part of x.

integral x와 팩토리얼 x 두개 값을 리턴한다.

math.pi

The value of pi.

파이 값

math.pow (x, y)

Returns xy. (You can also use the expression x^y to compute this value.)

xy를 리턴한다.

math.rad (x)

Returns the angle x (given in degrees) in radians.

각도 x의 라디안 값을 리턴한다.

math.random ([m [, n]])

This function is an interface to the simple pseudo-random generator function rand provided by ANSI C. (No guarantees can be given for its statistical properties.)

랜덤 값을 구한다.

When called without arguments, returns a uniform pseudo-random real number in the range [0,1). When called with an integer number m, math.random returns a uniform pseudo-random integer in the range [1, m]. When called with two integer numbers m and n, math.random returns a uniform pseudo-random integer in the range [m, n].

m,n이 주어지지 않으면 디폴트로 (0,1)의 값으로 계산한다. m이 주어지면 [1,m]으로 계산한다. m,n모두 주어지면 범위는 [m,n]이 된다.

math.randomseed (x)

Sets x as the "seed" for the pseudo-random generator: equal seeds produce equal sequences of numbers.

math.sin (x)

Returns the sine of x (assumed to be in radians).

x의 사인 값을 리턴한다.

math.sinh (x)

Returns the hyperbolic sine of x.

x의 쌍곡선 사인 값을 리턴한다.

math.sqrt (x)

Returns the square root of x. (You can also use the expression x^0.5 to compute this value.)

x의 square root 값을 리턴한다.

math.tan (x)

Returns the tangent of x (assumed to be in radians).

x의 탄젠트 값을 리턴한다.

math.tanh (x)

Returns the hyperbolic tangent of x.

x의 쌍곡선 탄젠트 값을 리턴한다.

===========================

조금 골치 아픈 공식들이죠?
저는 spin the bottle  게임 만들 때 테이블 관련해서는 table.maxn(table)을 사용했었구요. 병돌리기 위해 두 점 사이의 각도를 구하기 위해 radian구하는 공식과 각도 구하는 공식 등을 사용했는데요.
그건 위에 있는 함수를 사용하지는 않고 그냥 공식이 있는 함수를 만들어서 사용했었습니다.
위에 있는 수학 함수 중에는 math.ceil 이라던가 math.random 정도만 자주 쓰는 거 같애요.
아무래도 제 수학 실력과 프로그래밍 실력이 딸려서 그러겠죠?
게임 만들 때 이런 수학 함수 잘 사용하면 좋다고 그러던데...

오늘은 Corona SDK 에서의 배열인 table과 standard C 언어에서 가져온 코로나 SDK 의 수학함수에 대해서 알아봤습니다.

다음시간엔 Corona에서의 SQLite 데이타 베이스 사용법에 대해 다루겠습니다.

감사합니다.

반응형

Data and Files 첫번째 시간 - String -

2011. 10. 11. 22:47 | Posted by 솔웅


반응형

코로나에서 String을 다루는 방법이 첫번째 살펴볼 주제있니다.
Data and Files 에는 String, Table (Array), Math, Database (SQLite), Files, Crypto 등의 이슈가 있습니다.

첫번째 시간으로 String 인데요.
오늘 배울 부분들을 제가 연습하느라고 샘플 코드를 작성해서 공부했었는데요.
이것을 올려드릴께요.

오늘 글을 보면서 이 샘플코드에 직접 이것 저것 바꿔보면서 출력되는 것을 보면 좀 더 이해가 쉬울것 같습니다.


이 소스를 돌려보면 터미널에 결과값들이 찍힙니다.

String Manipulation

String Library 는 string 을 다루는 함수들을 제공해 줍니다.
루아에서 스트링을 인덱스 할 때 첫번째 문자는 포지션 1 입니다. (C 나 자바와 같이 0이 아닙니다.)
이 숫자는 마이너스도 허용합니다. 이 경우 스티링 맨 마지막에서부터 뒷쪽으로 검색하게 됩니다.
그러니까 마지막 문자가 -1이 됩니다.
String library는 테이블 스트링으로 이러한 함수기능을 제공합니다. 또한 스트링 테이블의 _index 필드에 스트링에 대한 메타테이블도 세팅 되어 있습니다. 이것을 개발자들은 객체 지향 개념으로 이용할 수 있습니다. 예를 들어 string.byte(s,i)는 s:byte(i)로 바꿔도 결과 값은 같습니다..

string.byte(s[,i[,j]])
문자 s[i],s[i+1] 문자의 내부 numerical code가 리턴 됩니다. 디폴트는 1 입니다. j의 디폴트 값은 i값입니다. 이 numerical code는 서로 다른 플랫폼간의 이동 및 공유가 되지 않습니다.

string.char(...)
0 이상의 integer를 Receive 받습니다. argument 숫자 길이 만큼 스트링이 리턴 됩니다. 근데 이건 제가 이것 저것 넣어 봤는데.. 결과값이 안 나오더라구요. 혹시 여러분 중에 무엇인지 아시는 분 댓글 부탁드립니다.

string.find(s,pattern[,init[,plain]])
스트링 s내에서 패턴에 맞는 첫번째를 찾습니다. 매치 되는 것을 찾으면 s의 인텍스를 리턴합니다. 없으면 nil을 리턴합니다. 세번째 옵션으로 있는 init 검색을 시작할 위치를 나타냅니다. 디폴트는 1이고 마이너스 값도 올 수 있습니다. 네번째 plain이 false일 경우 pattern matching 이 turn off 됩니다. plain이 있으면 init은 반드시 있어야 됩니다.
패턴이 검색 되면 이 검색된 패턴이 리턴됩니다.

string.format(formatstring,...)
매치 되면 미리 formatted 된 버전이 리턴됩니다. format string은 일반 C 함수의 printf 와 유사한 기능이 있습니다. 다른 점은 옵션들 입니다. l,L,n,p,h 는 support 되지 않습니다. 그리고 q 라는 옵션이 제공 됩니다. q는 루아 번역기가 읽기 쉬운 형태로 스트링을 포맷합니다.

예를 들어
  string.format('%q', 'a string with "quotes" and \n new line')

      "a string with \"quotes\" and \
      new line"
로 포맷 됩니다.

c, d, E, e, f, g, G, i, o, u, X, and x 옵션은 argument로 숫자가 들어가게 됩니다. 그리고 q와 s 는 문자가 들어가게 됩니다.

샘플코드에 이런 패턴들을 다 넣어 봤습니다. 결과값들이 다 다르게 나오는데 어떤건지 잘 와 닿지가 않네요. 실제 상황에서는 어떻게 써 먹는 건지도 모르겠구요.
제 프로그래밍 경력이 많지 않고 또 깊지 않아서 잘 모르는 것 같습니다. 혹시 이걸 어느 경우에 써 먹을 수 있는지 아시는 분들 조언 부탁 드립니다.

string.gmatch(s.pattern)
iterator 함수가 리턴 됩니다. 검색된 곳의 그 다음 capture 가 리턴 됩니다. 패턴이 없으면 전체가 매치된 것으로 나옵니다.
예를 들어
     s = "hello world from Lua"
     for w in string.gmatch(s, "%a+") do
       print(w)
     end
이것은 스트링 s의 모든 것을 iterate 합니다. 그리고 한줄당 하나씩 프린트 됩니다.
아래 예제는 key=value 의 모든 쌍들을 collect 합니다.
     t = {}
     s = "from=world, to=Lua"
     for k, v in string.gmatch(s, "(%w+)=(%w+)") do
       t[k] = v
     end

샘플코드에 있으니까 직접 결과 값을 확인 해 보세요.

string.gsub(s,pattern,repl[,n])
이건 해석하거나 설명하기 좀 복잡하네요.
아래 샘플을 보시죠.
     x = string.gsub("hello world", "(%w+)", "%1 %1")
     --> x="hello hello world world"
     
     x = string.gsub("hello world", "%w+", "%0 %0", 1)
     --> x="hello hello world"
     
     x = string.gsub("hello world from Lua", "(%w+)%s*(%w+)", "%2 %1")
     --> x="world hello Lua from"
     
     x = string.gsub("home = $HOME, user = $USER", "%$(%w+)", os.getenv)
     --> x="home = /home/roberto, user = roberto"
     
     x = string.gsub("4+5 = $return 4+5$", "%$(.-)%$", function (s)
           return loadstring(s)()
         end)
     --> x="4+5 = 9"
     
     local t = {name="lua", version="5.1"}
     x = string.gsub("$name-$version.tar.gz", "%$(%w+)", t)
     --> x="lua-5.1.tar.gz"

좀 헛갈리네요. 저도 소스를 잘 분석해 봐야겠어요.
뭐 그렇게 쓸일이 있을까? 싶지만요.

아래 함수들은 많이 쓰일 것 같네요.

string.len(s)
s의 length를 반환합니다. 아무 값도 없으면 length는 0 입니다. embeded 0도 카운트 됩니다. 그래서 "a\000bc\000" 의 length 는 5 입니다.

string.lower(s)
스트링을 모두 소문자로 바꿉니다.

string.match(s,pattern[,init])
패턴에 맞는 첫번째 조건을 찾습니다. 찾으면 찾은 값을 리턴해 줍니다. 없으면 nil을 리턴해 줍니다. 패턴이 아무것도 없으면 모든 문자를 리턴합니다. 세번째 옵션값인 init 은 검색을 시작할 위치를 표시합니다.

string.rep(s,n)
n개의 수만큼 s를 표시합니다.

string.reverse(s)
s의 거꾸로 된 값을 리턴합니다.

string.sub(s,i[,j])
i 번째에서 j번째까지의 문자를 표시합니다. i,j는 마이너스가 될 수 있습니다. j가 없으면 -1이 디폴트 입니다. string.sub(s,1,j)는 j에 -1값이 들어가고 string.sub(s,-i)는 length i의 suffix를 리턴합니다.

string.upper(s)
모든 문자를 대문자로 바꿔 줍니다.

### Patterns

Character Class

캐릭터 클래스는 문자들의 세트를 표현합니다.

. (dot) 모든 문자를 표시한다.
%a : 모든 문자를 표시한다.
%c : control character들을 표시한다.
%d : 숫자들을 표시한다.
%l : 소문자를 표시한다.
%p : 기능 문자들을 표시한다.
%s : 스페이스를 표시한다.
%u : 대문자를 표시한다.
%w : 알파뉴메릭을 표시한다.
%x : 헥사디시멀 숫자들을 표시한다.
%z : 0으포 표시되는 문자를 출력한다.
%x (x가 알파벳 문자가 아닌 경우) 캐릭터 x를 표시한다.
[set] : 세트 안의 모든 문자들의 집합 클래스를 표시한다.
%w 나 _%w는 모든 알파뉴메릭 문자와 언더스코어를 표시하고 [0-7] 은 8진수를 [0-7%l%-]은 8진수와 소문자와 -를 표시한다.
[^set] : 위에 해당하는 것의 반대로 표시한다.
 %a , %c 등으로 표시 되는데 이것을 대문자로 표시하면 그것의 반대로 표시한다.
예를 들어 %S 의 경우는 non-space 문자들을 출력한다.

pattern item
패턴 아이템은 아래와 같은 조건을 갖는다.
- 클래스의 싱글 캐릭터에 매치 되는 싱글 캐릭터 클래스
- *로 시작하는 싱글 캐릭터 클래스 0번 이상 반복되는 캐릭터. 이 반복되는 아이템들은 가능한 긴 시퀀스에 매치 된다.
- +로 시작하는 캐릭터. 1번 이상 반복되는 캐릭터. 이 반복되는 아이템들은 가능한 가장 긴 시퀀스에 매치된다.
- -로 시작하는 캐릭터. 0번 이상 반복되는 캐릭터. 이 반복되는 아이템들은 가능한 가장 짧은 시퀀스에 매치된다.
- ? 로 시작하는 캐릭터.
- %n n은 1~9 사이이다. n번째 무자를 말한다.
- %bxy x와 y 는 두개의 구별되는 문자들이다. x에서 시작해서 y에서 끝난다.

이렇게 코로나의 String 다루는 법을 정리했습니다.

다음엔 코로나에서 사용하는 배열인 tables 에 대해 알아보겠습니다.
반응형

코로나 애니메이션 Sprite Sheets.

2011. 10. 8. 20:53 | Posted by 솔웅


반응형
이 Sprite Sheets 는 조금 독특한 것 같습니다.
이전에 플래시 같은데서 썼던 개념인지 어떤지 모르겠지만.
여러 동작을 표현한 하나의 이미지 파일을 불러와서 특정 구역을 지정하면.
코로나는 그 특정구역별로 하나씩 이미지로 인식합니다.
그리고 그것을 Frame 단위로 display 하면서 애니메이션 효과를 냅니다.

글로만 쓰니까 잘 모르겠죠?

이렇게 하나의 이미지파일에 여러 동작을 그려 넣습니다.
개발자는 Sprite Sheets를 이용해서 저 하나하나별로 구역을 나눕니다.
그러면 코로나는 그 개별 구역을 개별 이미지로 인식해서 애니메이션을 연출합니다.

이렇게 하면 하나의 이미지 파일을 불러오니까 메모리 절약 효과도 있겠네요.
Loading 시간도 줄일 수 있겠구요.
그 외에 어떤 장점이 있는지 (MovieClips와 비교해서) 한번 알아보죠.

Corona 는 두가지 형태의 Sprite Sheets 를 제공합니다.
사이즈와 포지션이 일정한 것과 사이즈와 포지션이 일정하지 않은 것이 있습니다.

위에 있는 이미지는 uniformly-sized 프레임 입니다. (이 이미지는 코로나 샘플 파일의 sprites 폴더에 보면 있습니다.)

두번째는 외부 데이터 파일에서 그 크기와 위치를 지정하는 건데요. 이건 ZwoptexTexturePacker 같은 툴을 이용해서 만듭니다.

이 그림은 위에서 말한 샘플 코드 sprites 폴더 아래 있습니다. 그리고 외부 데이터 파일은 uma.lua 이름으로 있습니다.

코로나는 애니메이트 된 캐릭터에 대한 순서나 거꾸로 움직이기 등의 메소드를 제공하는 constructor들을 제공합니다. 이것은 frame-base 가 아니라 time-base로 주로 이용 됩니다.
샘플 코드 중 JungleScene 샘플 을 보시면 퓨마의 움직임하고 사람의 움직임이 약간 다릅니다. 정확히 속도가요.  이것은 두 객체가 다른 frame rate 으로 움직이기 때문입니다.


위에서 말한대로 이 JungleScene은 uniformly-sized frames를 사용했고 HorseAnimation 은 non-uniformly sized and positioned 방법을 사용했습니다.

혹시 다음에 시간 되면 이 샘플 소스들도 자세히 살펴 보도록 하겠습니다.
우선은 이 Sprite Sheets에 대한 진도를 계속 나가겠습니다.
주의 할 점은 이미지 사이즈가 디바이스의 맥시멈 사이즈를 넘으면 그림이 표시 되지 않습니다.
이 정보는 system.getinfo("maxTextureSize")를 통해서 얻을 수 있습니다.

이 sprite 효과를 사용하려면 아래와 같이 합니다.
require "sprite"
그리고 sprite.newSpriteSheet , sprite.newSpriteSheetFromData 이 두 함수는 새로운 sprite sheets를 생성합니다.

spriteSheet = sprite.newSpriteSheet("image.png", fromeWidth, fromeHeight)
이 코드는 uniformly-sized frames sprite sheet를 생성합니다.
spriteSheet = sprite.newSpriteSheetFromData("image.png", spriteData)
이 코드는 외부 파일에서 지정한 frame size와 포지션을 적용할 때 이용합니다.

외부 데이터 파일은 아래와 같은 형식으로 돼 있습니다.
-- test.lua
module (...)
 
function getSpriteSheetData()
 
        local sheet = {
                frames = {
                        {
                        name = "01.png",
                        spriteColorRect = { x = 38, y = 38, width = 50, height = 50 },
                        textureRect = { x = 2, y = 70, width = 50, height = 50 },
                        spriteSourceSize = { width = 128, height = 128 },
                        spriteTrimmed = true,
                        textureRotated = false
                        },
 
                        {
                        name = "02.png",
                        spriteColorRect = { x = 38, y = 36, width = 50, height = 52 }, 
                        textureRect = { x = 2, y = 242, width = 50, height = 52 }, 
                        spriteSourceSize = { width = 128, height = 128 }, 
                        spriteTrimmed = true,
                        textureRotated = false
                        },
                }
        }
        return sheet
end

위 소스는 이미지 파일을 두개의 이미지로 나누는데요. 위치와 사이즈 등을 설정하도록 돼 있습니다.

이 파일 (test.lua) 을 이용하려면 아래와 같이 합니다.
local sprite = require("sprite")
-- In this case, test.lua is exported from Zwoptex
local test = require("test.lua")
-- Method defined by test.lua that returns table data defining the sprites
local spriteData = test.getSpriteSheetData()
-- Load the sprite sheet in test.png using the sprite definitions from spriteData
local spriteSheet = sprite.newSpriteSheetFromData( "test.png", spriteData )

이 경우 밑에 두 줄은 아래와 같이 합칠 수도 있습니다.
local spriteSheet = sprite.newSpriteSheetFromData( "test.png", test.getSpriteSheetData() )

하나의 기본 이미지에 여러 캐릭터들이 들어 있을 때 관련 된 캐릭터들만 따로 세팅을 할 수 있습니다.
spriteSet = sprite.newSpriteSet(spriteSheet, startFrame, frameCount)

sprite에 추가 할 수도 있습니다.
sprite.add(spriteSet, "startFlying", startFrame,frameCount, time,[loopCount])

sprite sheet를 없애고 메모리에서 release시키려면 아래와 같이 합니다.
sprite.Sheet:dispose()
이 경우 removeSelf()도 불려 집니다.

======= o ========== o ========== o ========== o ========= o ===

si = sprite.newSprite( spriteSet )
sprite의 새로운 인스턴스를 만듭니다. 스프라이트는 Display Object입니다. 스프라이트는 한번에 하나의 애니메이션 시퀀스를 플레이 합니다.

si:prepare([sequence])
현재 플레이 되고 있는 애니메이션 시퀀스를 정지합니다. 현재 시퀀스를 바꿀수도 있고 첫번째 시퀀스의 프레임으로 갈 수도 있습니다.

si:play()
애니메이션 시퀀스를 플레이 합니다.현재의 프레임에서 시작합니다.
 
si:pause()
애니메이션을 정지시킵니다. 맨 마지막 display됐던 프레임이 남아 있게 됩니다.
 
si:addEventListener("sprite", listener)
스프라이트 인스턴스 애니메이션이 이벤트를 일으켰을 때 리스너에 통보 합니다.

이벤트는 리스너에게 다음과 같은 필드들을 전달합니다.

event.sprite
이벤트를 발생한 스프라이트; event.sprite.sequence 같이 현재 스프라이트의 프로퍼티들에 접근 할 수도 있습니다.

event.phase
phase는 다음과 같은 요소들이 있습니다.

"end" - 플레이를 멈춘다.
"loop" - 순차적으로 아니면 거꾸로 스프라이트를 루핑합니다.
"next" - 스프라이트의 다음 프레임이 플레이 됩니다.

======= o ========== o ========== o ========== o ========= o ===

여기까지 코로나의 Sprite Sheets로 애니메이션을 구현하는 방법에 대해 알아봤습니다.
근데 뭔가 어렵고 불편한 것 같은 느낌이 드네요.
뭔가 숙달이 안 되서 그런건가?

한번 다양한 방법으로 실습을 해 봐야겠습니다.
샘플을 보던지... 내가 직접 만들던지... 어쨌든 그래야 정확하게 내것이 되겠는데요.

일단 다음 주제는 데이터와 파일 단원에 들어가겠습니다.
SQLite (DB) 와 파일 (file) control도 하게 될 텐데요.

이 주제로 강좌를 진행하다가 sprite sheet 직접 실습해보고 sprite sheet 사용  방법을 알기 쉽게 한번 더 다룰께요.

그럼.......
반응형