<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Jasu</title>
		<link>http://jasu.tistory.com/</link>
		<description>Flash ActionScript for User Interface &amp; Communication</description>
		<language>ko</language>
		<pubDate>Fri, 27 Apr 2012 10:32:00 +0900</pubDate>
		<generator>Tistory 1.1 (http://www.tistory.com/)</generator>
		<managingEditor>jasu</managingEditor>
		<image>
			<title>Jasu</title>
			<url>http://cfile1.uf.tistory.com/image/162301374EC5303A187B75</url>
			<link>http://jasu.tistory.com</link>
			<description>Flash ActionScript for User Interface &amp; Communication</description>
		</image>
		<item>
			<title>iOS의 SQLite-FMDB 사용</title>
			<link>http://jasu.tistory.com/608</link>
			<description>&lt;p&gt;iOS에서 데이터를 저장하는 방식 중에는 크게&amp;nbsp;번들 plist 파일에 저장하는 방법과 SQLite로 db방식으로 저장하는 방법이 있다. plist는 파일 형식으로 저장하는 방법, SQLite는 db 형식으로 저장하는 방법으로 이해할 수 있는데 SQLite를 사용하기 위해서는 db를 쓰고 읽는 기능을 하기 위해서는 적지 않은 코드를 작성해야하는 번거로움이 있다. 이를 해결하고자 FMDB라는 Wrapper library를&amp;nbsp;GitHub에서 배포하고 있다. 정리 차원에서 일본 블로거 &lt;a href=&quot;http://akabeko.me/blog/2011/11/ios-sqlite-fmdb/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;포스트&lt;/a&gt;&amp;nbsp;내용을 번역하여 정리해 본다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt; &quot;&gt;1. FMDB 란?&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;FMDB는 SQLite를 iOS의 Objective-C에서 사용하기 편하도록&amp;nbsp;Wrapper Library를&amp;nbsp;GitHub에서 공개하고 있다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/ccgus/fmdb&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://github.com/ccgus/fmdb&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;인터페이스는&amp;nbsp;JDBC 또는 ADO.NET에 가깝다. 따라서, 이것을 사용한 적이&amp;nbsp;있으면 원활하게 이해할 수 있을 것이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt; &quot;&gt;2. FMDB 준비&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;먼저 FMDB를 이용하고 싶은 프로젝트에 SQLite 라이브러리를 추가한다.&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; &quot;&gt;1. Xcode 왼쪽 창의 탐색창에서&amp;nbsp;프로젝트를 선택&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; &quot;&gt;2.&amp;nbsp;오른쪽 창에 PROJECT와 TARGET이 표시되며&amp;nbsp;TARGET을&amp;nbsp;선택&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; &quot;&gt;3. 오른쪽 창,&amp;nbsp;상단&amp;nbsp;탭에서 Build Phases 선택&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; &quot;&gt;4. 빌드에 대한 설정 항목이 표시되는데&amp;nbsp;그 중에서 Link Binary With Libraries를 선택&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; &quot;&gt;5. Link Binary With Libraries 왼쪽 아래에&amp;nbsp;+를 클릭&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; &quot;&gt;6. Choose framework and libraries add :라는 메시지가 표시되고&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; &quot;&gt;7. 검색을 통해서 프레임워크와&amp;nbsp;라이브러리 목록에서 libsqlite3.0.dylib 선택&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; &quot;&gt;8. 대화 상자 오른쪽 아래 Add 버튼을 클릭&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그 다음으로 FMDB 소스를 프로젝트에 추가한다.&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; &quot;&gt;1. FMDB 프로젝트 페이지에서 ZIP 파일을 내려 받는다.&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; &quot;&gt;2. 압축을 풀고&amp;nbsp;src 폴더에서 fmdb.m 파일을 제외하고 프로젝트에 import&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; &quot;&gt;3.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; &quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt; &quot;&gt;3.&amp;nbsp;데이터베이스 만들기 및 open / close&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;데이터베이스를 제공하는 경우 미리 만든 데이터베이스 파일을 프로젝트 리소스에 통합하고 그 것을 복사하거나 SQLite를 생성해야한다.&amp;nbsp;iOS 애플리케이션 작업 영역에 app.db라는 데이터베이스 파일을 생성하는 경우는&amp;nbsp;다음과 같이 처리한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;pre class=&quot;brush:as3&quot;&gt;&lt;p&gt;NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *dir = [paths objectAtIndex : 0];
FMDatabase *db = [FMDatabase databaseWithPath:[dir stringByAppendingPathComponent:@&quot;app.db&quot;]];
NSLog(@&quot;%@&quot;, db);
[db open];
[db close];
&lt;/p&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;databaseWithPath 메소드에 파일의 경로를 지정하여 파일이 기존에 존재하면 참조하고 없을 경우에는 새로 만들고 연결된 FMDatabase 인스턴스를 반환한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;데이터베이스 작업을 시작하면 이 인스턴스에 대한 open 메소드를 호출한다. 종료는 close 메소드, close를 호출하면 데이터베이스를 닫고 변경된 내용을 파일에 저장한다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt; &quot;&gt;4. CREATE&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;테이블 생성은 다음과 같다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;pre class=&quot;brush:as3&quot;&gt;NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *dir = [paths objectAtIndex : 0];
FMDatabase *db = [FMDatabase databaseWithPath:[dir stringByAppendingPathComponent:@&quot;app.db&quot;]];
NSString *sql = @&quot;CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT);&quot;;
[db open];
[db executeUpdate:sql];
[db close];
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;FMDatabase - executeUpdate 메소드에 CREATE 문장을 지정하여 작업을 수행한다. SQLite는 IF NOT EXISTS에 대응하고, 이 것을 붙이면 테이블이 존재하지 않을 때만 생성 해주기 때문에 편리하다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt; &quot;&gt;5. INSERT&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;행을 추가하는 것은 다음과 같다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;pre class=&quot;brush:as3&quot;&gt;NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *dir = [paths objectAtIndex : 0];
FMDatabase *db = [FMDatabase databaseWithPath:[dir stringByAppendingPathComponent:@&quot;app.db&quot;]];
NSString *sql = @&quot;INSERT INTO users (name) VALUES (?)&quot;;

[db open];
[db executeUpdate:sql, @&quot;이름&quot; ];
[db close];
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;executeUpdate는 Prepared Statement에 대응하고 있다. SQL 문장에서 ?를 작성한 매개변수 부분에 가변 인자를 할당한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt; &quot;&gt;6. DELETE&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;행 삭제는 다음과 같다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;pre class=&quot;brush:as3&quot;&gt;NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *dir = [paths objectAtIndex : 0];
FMDatabase *db = [FMDatabase databaseWithPath:[dir stringByAppendingPathComponent:@&quot;app.db&quot;]];

NSString *sql = @&quot;DELETE FROM users WHERE id =?&quot;;
[db open];
[db executeUpdate:sql, [NSNumber numberWithInteger:14]];
[db close];
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt; &quot;&gt;7. SELECT&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;데이터 선택은 다음과 같다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;pre class=&quot;brush:as3&quot;&gt;NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *dir = [paths objectAtIndex : 0];
FMDatabase *db = [FMDatabase databaseWithPath:[dir stringByAppendingPathComponent:@&quot;app.db&quot;]];

NSString *sql = @&quot;SELECT id, name FROM users;&quot;;
[db open];

FMResultSet *results = [db executeQuery:sql];
NSMutableArray *users = [[NSMutableArray alloc] initWithCapacity:0];

while ([results next])
{
      User *user = [[User alloc] init];
      user.userId = [results intForColumnIndex:0];
      user.name = [results stringForColumnIndex:2];
      [users addObject:user];
}

[db close];
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;FMDatabase - executeQuery 처리 결과를 FMResultSet 인스턴스로 반환한다.&lt;/p&gt;&lt;p&gt;FMResultSet - next를 호출하여 가져온 행을 순차적으로 불러온다. 행이 있는 경우 YES, 끝이면 NO를 반환하므로 이 메소드를 호출하는 while 조건문을 통해서 모든 행이 열거된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt; &quot;&gt;8. 트랜잭션&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;SQLite는 암묵적으로 트랜잭션 제어를 한다. 평상시에는 문제가 없지만&amp;nbsp;대량의 INSERT를 실행하면&amp;nbsp;그때마다&amp;nbsp;BEGIN ~ COMMIT이 실행되기 때문에 속도가 크게 저하된다. 이러한 작업을 수행하려면 대상 구간을 명시적으로 트랜잭션 처리하는 것이 좋다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;FMDB가 명시적으로 트랜잭션 FMDatabase - beginTransaction 메서드에서 시작되고 commit으로 종료된다. 오류 등으로 처리 전의 상태로 되돌리려면&amp;nbsp;rollback 메소드를 실행한다.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;pre class=&quot;brush:as3&quot;&gt;NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *dir = [paths objectAtIndex : 0];
FMDatabase *db = [FMDatabase databaseWithPath:[dir stringByAppendingPathComponent:@&quot;app.db&quot;]];

NSString *sql = @&quot;SELECT id, name FROM users;&quot;;
[db open];

FMResultSet *results = [db executeQuery:sql];
NSMutableArray *users = [NSMutableArray array];

while ([results next])
{
      User *user = [[User alloc] init];
      user.userId = [results intForColumnIndex:0];
      user.name = [results stringForColumnIndex:2];
      NSLog(@&quot;%@&quot;, user.name);
      [users addObject:user];
}

[db close];


// Transaction
sql = @&quot;INSERT INTO users (name) VALUES (?)&quot;;

[db open];
[db beginTransaction];

BOOL isSucceeded = YES;
for( User* user in users )
{
      NSLog(@&quot;name:%@&quot;, user.name);
      if( ![db executeUpdate:sql, user.name] )
      {
isSucceeded = NO;
break;
      }
}

if( isSucceeded )
{
      [db commit];
}
else
{
      [db rollback];
}

[db close];
&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;명시적 트랜잭션을 실행하는 동안에는 데이터베이스 전체가 잠긴다. 따라서 구간 내에서 새로운 데이터베이스를 open하면 응답 없음으로 간주한다.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt; &quot;&gt;9. 형식&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;FMDB를 이용하여 데이터를 취득, 설정하는 형식에 대한 정리.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;데이터를 취득하기 위해서는 FMDatabase - executeQuery의 결과로 반환된 FMResultSet 인스턴스 메소드를 사용한다. 메소드 이름은 typeForColumn 또는 typeForColumnIndex 다. 각 컬럼 이름과 위치 인덱스 값을 얻을 수 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;예를 들어, stringForColumn에 &quot;name&quot;을 지정했다면 name 문자열(TEXT)의 컬럼을 가져온다. intForColumnIndex:4를 지정하면 SELECT 문을 검색할 4 번째 정수(INTEGER)를 얻을 수 있다. 대표적인 데이터 형식 대응은&amp;nbsp;아래와 같다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;696&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; border-image: initial; border-collapse: collapse; font-family: 돋움; font-size: 12px; width: 696px; &quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); border-top-width: 1px; border-top-style: solid; border-top-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204); width: 246px; &quot;&gt;&lt;p style=&quot;text-align: center; &quot;&gt;&lt;b&gt;SQLite&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); border-top-width: 1px; border-top-style: solid; border-top-color: rgb(204, 204, 204); width: 196px; &quot;&gt;&lt;p style=&quot;text-align: center; &quot;&gt;&lt;span&gt;&lt;b&gt;Objective-C&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); border-top-width: 1px; border-top-style: solid; border-top-color: rgb(204, 204, 204); width: 253px; &quot;&gt;&lt;p style=&quot;text-align: center; &quot;&gt;&lt;span style=&quot;background-color: rgb(189, 189, 189); &quot;&gt;&lt;span style=&quot;background-color: rgb(189, 189, 189); &quot;&gt;&lt;span style=&quot;background-color: rgb(0, 0, 0); &quot;&gt;&lt;span style=&quot;background-color: rgb(255, 255, 255); &quot;&gt;&lt;span&gt;&lt;b&gt;검색 메소드&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204); width: 246px; height: 24px; &quot;&gt;&lt;p&gt;&amp;nbsp;TEXT&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); width: 196px; height: 24px; &quot;&gt;&lt;p&gt;NSString&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); height: 24px; width: 253px; &quot;&gt;&lt;p&gt;stringForColumn, stringForColumnIndex&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204); width: 246px; &quot;&gt;&lt;p&gt;INTEGER&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); width: 196px; &quot;&gt;&lt;p&gt;int&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); width: 253px; &quot;&gt;&lt;p&gt;intForColumn, intForColumnIndex&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204); width: 246px; &quot;&gt;&lt;p&gt;BOOL&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); width: 196px; &quot;&gt;&lt;p&gt;BOOL&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); width: 253px; &quot;&gt;&lt;p&gt;boolForColumn, boolForColumnIndex&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204); width: 246px; &quot;&gt;&lt;p&gt;REAL&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); width: 196px; &quot;&gt;&lt;p&gt;double&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); width: 253px; &quot;&gt;&lt;p&gt;doubleForColumn, doubleForColumnIndex&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204); width: 246px; &quot;&gt;&lt;p&gt;DATETIME&amp;nbsp;(INTEGER, REAL, TEXT)&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); width: 196px; &quot;&gt;&lt;p&gt;NSDate&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); width: 253px; &quot;&gt;&lt;p&gt;dateForColumn, dateForColumnIndex&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204); width: 246px; &quot;&gt;&lt;p&gt;BLOB&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); width: 196px; &quot;&gt;&lt;p&gt;NSData&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); width: 253px; &quot;&gt;&lt;p&gt;dataForColumn, dataForColumnIndex&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;FMDatabase - executeQuery로 지정하는 매개변수는 런타임에 유형검사를 한다. TEXT면&amp;nbsp;NSString, INTEGER면 NSNumber로 대응하며 잘 못된 형식을 지정하면 런타임 에러를 발생시킨다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;데이터 취득의 경우, &amp;nbsp;FMResultSet이 Objective-C의 변환을 담당하지만 설정시에 변환은 직접 해야한다. 변환 대응은 아래와 같다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;696&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; border-image: initial; border-collapse: collapse; font-family: 돋움; font-size: 12px; width: 696px; &quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); border-top-width: 1px; border-top-style: solid; border-top-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204); width: 246px; &quot;&gt;&lt;p style=&quot;text-align: center; &quot;&gt;&lt;b&gt;&amp;nbsp;SQLite&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); border-top-width: 1px; border-top-style: solid; border-top-color: rgb(204, 204, 204); width: 196px; &quot;&gt;&lt;p style=&quot;text-align: center; &quot;&gt;&lt;b&gt;Objective-C&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); border-top-width: 1px; border-top-style: solid; border-top-color: rgb(204, 204, 204); width: 253px; &quot;&gt;&lt;p style=&quot;text-align: center; &quot;&gt;&lt;b&gt;변환 방법&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204); width: 246px; &quot;&gt;&lt;p&gt;&amp;nbsp;TEXT&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); width: 196px; &quot;&gt;&lt;p&gt;NSString&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); width: 253px; &quot;&gt;&lt;p&gt;변환 불필요&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204); width: 246px; &quot;&gt;&lt;p&gt;INTEGER&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); width: 196px; &quot;&gt;&lt;p&gt;NSInteger&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); width: 253px; &quot;&gt;&lt;p&gt;NSNumber - numberWithInt&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204); width: 246px; &quot;&gt;&lt;p&gt;BOOL&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); width: 196px; &quot;&gt;&lt;p&gt;BOOL&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); width: 253px; &quot;&gt;&lt;p&gt;NSNumber - numberWithBool&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204); width: 246px; &quot;&gt;&lt;p&gt;REAL&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); width: 196px; &quot;&gt;&lt;p&gt;double&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); width: 253px; &quot;&gt;&lt;p&gt;NSNumber - numberWithDouble&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204); width: 246px; &quot;&gt;&lt;p&gt;DATETIME (INTEGER, REAL, TEXT)&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); width: 196px; &quot;&gt;&lt;p&gt;NSDate&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); width: 253px; &quot;&gt;&lt;p&gt;변환 불필요&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204); width: 246px; &quot;&gt;&lt;p&gt;BLOB&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); width: 196px; &quot;&gt;&lt;p&gt;NSData&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;height: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: solid; border-right-color: rgb(204, 204, 204); width: 253px; &quot;&gt;변환 불필요.&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;SQLite의 날짜 형식은 다음과 같이 정의되어 있다. (&lt;a href=&quot;http://www.sqlite.org/datatype3.html&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;Datatypes In SQLite Version 3 &lt;/a&gt;에서 인용).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; &quot;&gt;TEXT as ISO8601 strings (“YYYY-MM-DD HH:MM:SS.SSS”).&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; &quot;&gt;REAL as Julian day numbers, the number of days since noon in Greenwich on November 24, 4714 B.C. according to the proleptic Gregorian calendar.&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; &quot;&gt;INTEGER as Unix Time, the number of seconds since 1970-01-01 00:00:00 UTC.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;DATETIME은 고유의&amp;nbsp;형식이 있는 것은 아니고 TEXT, REAL, INTEGER를 사용한다. SQLite 클라이언트는 TEXT 밖에 허용하지 않으며 System.Data.SQLite과 같이 연결 문자열 DATETIME 형식의 해석 방법을 선택할 수 있다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;FMDB의 경우 내부적으로 Unix Timestamp에서 운용하고 있으므로 형식을 정의할 때 INTEGER로 하면 좋다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;10. Lita(데이터베이스 관리 프로그램)&lt;/p&gt;&lt;p&gt;FMDB를 이용한 데이터베이스 작업을 했을 때 그 결과가 어떻게 반영되었는지 확인하고 싶을 때가 있다. 또한 애플리케이션에서 사용하는 SQL 문을 검토하기 위해 실제 데이터베이스에 대해 SQL을 실행하고 싶은 경우도 많다. 이럴 때 사용하면 유용한 AIR 애플리케이션이 바로 Lita 다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.dehats.com/drupal/?q=node/58&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;Lita – SQLite Administration Tool&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;iPhone 시뮬레이터를 통해 SQLite 데이터베이스를 생성한 경우, Mac의 다음 위치에 파일이 생성된다.&lt;/p&gt;&lt;p&gt;/Users/사용자이름/Library/Application Support/iPhone Simulator/5.0/Applications/애플리케이션 ID/Documents&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;만들어진 파일을 Lita에서 열고 애플리케이션이 데이터베이스 작업을 행한 후, Lita에서 갱신하면 저장된 데이터의 변경을 쉽게 할 수 있다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-608-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-608-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-608-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align:right; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=jasu.tistory.com/608&amp;amp;layout=button_count&amp;amp;show_faces=true&amp;amp;width=90&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=dark&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:90px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
</description>
			<category>iOS&amp;Objective-C</category>
			<category>FMDB</category>
			<category>ios</category>
			<category>Lita</category>
			<category>Objective-C</category>
			<category>SQL</category>
			<category>SQLite</category>
			<category>Xcode</category>
			<author>jasu jasu</author>
			<guid>http://jasu.tistory.com/608</guid>
			<comments>http://jasu.tistory.com/608#entry608comment</comments>
			<pubDate>Fri, 27 Apr 2012 10:29:16 +0900</pubDate>
		</item>
		<item>
			<title>iOS XML parser NSXMLParser[2]</title>
			<link>http://jasu.tistory.com/605</link>
			<description>&lt;p&gt;&lt;a href=&quot;http://jasu.tistory.com/604&quot; target=&quot;_top&quot; class=&quot;tx-link&quot;&gt;이전 포스트&lt;/a&gt;에서는 NSXMLParser를 사용할 때 호출되는 기본적인 델리게이트 메소드들을 살펴보았다. 이번에는 각 element및 attribute 값들을 객체를 이용하여 저장해 본다. 저장 방식은 iOS5 programming cookbook 샘플소스를 수정해서 사용했다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;먼저 사용할 xml 데이터는 아래와 같은 형식이다.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;pre class=&quot;brush:as3&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;root&amp;gt;
      &amp;lt;person id=&quot;1&quot;&amp;gt;
            &amp;lt;firstName&amp;gt;Anthony&amp;lt;/firstName&amp;gt;
            &amp;lt;lastName&amp;gt;Robbins&amp;lt;/lastName&amp;gt;
            &amp;lt;age&amp;gt;51&amp;lt;/age&amp;gt;
      &amp;lt;/person&amp;gt;

      &amp;lt;person id=&quot;2&quot;&amp;gt;
            &amp;lt;firstName&amp;gt;Richard&amp;lt;/firstName&amp;gt;
            &amp;lt;lastName&amp;gt;Branson&amp;lt;/lastName&amp;gt;
            &amp;lt;age&amp;gt;61&amp;lt;/age&amp;gt;
      &amp;lt;/person&amp;gt;
&amp;lt;/root&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래는 개별 element들을 저장하기 위한 클래스다. XML&amp;nbsp;트리형식의 구조로 상위 element 데이터에 접근할 수 있도록 parent라는 자신과 같은 객체 형식의 참조 속성을 포함하고 있다. 단순히 참조하는 형태이기 때문에 weak로 생성한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;XMLElement.h&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;pre class=&quot;brush:as3&quot;&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;

@interface XMLElement : NSObject

@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *text;
@property (nonatomic, strong) NSDictionary *attributes;
@property (nonatomic, strong) NSMutableArray *subElements;
@property (nonatomic, weak) XMLElement *parent;

@end
&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;XMLElement.m&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;pre class=&quot;brush:as3&quot;&gt;#import &quot;XMLElement.h&quot;

@implementation XMLElement

@synthesize name;
@synthesize text;
@synthesize attributes;
@synthesize subElements;
@synthesize parent;

- (NSMutableArray *) subElements{
  if (subElements == nil){
    subElements = [[NSMutableArray alloc] init];
  }
  return subElements;
}

@end&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;subElements 최초 참조시 객체가 생성되지 않았을 때는 생성해서 return하도록 처리되어 있다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;아래는 메인 델리게이트  클래스다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;pre class=&quot;brush:as3&quot;&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;

@class XMLElement;

@interface Parsing_XML_with_NSXMLParserAppDelegate
           : UIResponder &amp;lt;UIApplicationDelegate, NSXMLParserDelegate&amp;gt;

@property (nonatomic, strong) UIWindow *window;
@property (nonatomic, strong) NSXMLParser *xmlParser;
@property (nonatomic, strong) XMLElement *rootElement;
@property (nonatomic, strong) XMLElement *currentElementPointer;

@end
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;pre class=&quot;brush:as3&quot;&gt;#import &quot;Parsing_XML_with_NSXMLParserAppDelegate.h&quot;
#import &quot;XMLElement.h&quot;

@implementation Parsing_XML_with_NSXMLParserAppDelegate

@synthesize window = _window;
@synthesize xmlParser;
@synthesize rootElement;
@synthesize currentElementPointer;

- (void)parserDidStartDocument:(NSXMLParser *)parser{
      self.rootElement = nil;
      self.currentElementPointer = nil;
}

- (void)parserDidEndDocument:(NSXMLParser *)parser{
      self.currentElementPointer = nil;
}

- (void)        parser:(NSXMLParser *)parser 
       didStartElement:(NSString *)elementName 
          namespaceURI:(NSString *)namespaceURI
         qualifiedName:(NSString *)qName
            attributes:(NSDictionary *)attributeDict{
  
      if (self.rootElement == nil){
            /* 루트 element가 생성되지 않았을 때 */
            
            self.rootElement = [[XMLElement alloc] init];
            self.currentElementPointer = self.rootElement;
      } else {
            /* 루트 element가 있을 때 새로운 XMLElement 객체를 만들고 현재 참조 element를 parent로
             새로 만들어진 element를 현재 참조 element로 연결 */
            
            XMLElement *newElement = [[XMLElement alloc] init];
            newElement.parent = self.currentElementPointer;
            [self.currentElementPointer.subElements addObject:newElement];
            self.currentElementPointer = newElement;
      }

      self.currentElementPointer.name = elementName;
      self.currentElementPointer.attributes = attributeDict;
  
}

- (void)        parser:(NSXMLParser *)parser
         didEndElement:(NSString *)elementName
          namespaceURI:(NSString *)namespaceURI
         qualifiedName:(NSString *)qName{
      
      /* element를 빠져 나올 때 현재 XMLElement에서 parent로 참조하고 있는 element를
       현재 참조로 대입 */
      self.currentElementPointer = self.currentElementPointer.parent;
  
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
  
      self.currentElementPointer.text = string;

}

- (BOOL)            application:(UIApplication *)application 
  didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

      NSString *xmlFilePath = [[NSBundle mainBundle] pathForResource:@&quot;MyXML&quot;
                                                          ofType:@&quot;xml&quot;];

      NSData *xml = [[NSData alloc] initWithContentsOfFile:xmlFilePath];

      self.xmlParser = [[NSXMLParser alloc] initWithData:xml];
      
      self.xmlParser.delegate = self;

      if ([self.xmlParser parse]){
            NSLog(@&quot;The XML is parsed.&quot;);
            XMLElement *element;
            XMLElement *subElement;
            for(element in self.rootElement.subElements){
                  NSLog(@&quot;person ID : %@&quot;, [element.attributes objectForKey:@&quot;id&quot;]);
                  for(subElement in element.subElements){
                        NSLog(@&quot;\t%@ : %@&quot;, subElement.name, subElement.text);
                  }
            }
      } else{
            NSLog(@&quot;Failed to parse the XML&quot;);
      }
  
      self.window = [[UIWindow alloc] initWithFrame:
                 [[UIScreen mainScreen] bounds]];

      self.window.backgroundColor = [UIColor whiteColor];
      [self.window makeKeyAndVisible];
      return YES;
}
@end
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;위 코드에서 가장 핵심이 되는 부분은 아래 부분이다. 새로은 element를 생성한 후, 생성된 element객체 parent를 현재 참조하고 있는 element로 설정한다. 이는 현재 element 에서 자식 element가 새롭게 생성되어 연결되는 과정을 보여준다. 새로은 element를 addObject로 추가하고 마지막으로는 새롭게 생성된 element를 현재 element에 대입하여 새롭게 생성된 element가 현재 element가 되도록 처리해 준다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre class=&quot;brush:as3&quot;&gt;&lt;p&gt;XMLElement *newElement = [[XMLElement alloc] init];
newElement.parent = self.currentElementPointer;
[self.currentElementPointer.subElements addObject:newElement];
self.currentElementPointer = newElement;&lt;/p&gt;&lt;/pre&gt;&lt;pre class=&quot;brush:as3&quot;&gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;다음은 출력된 결과다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;pre class=&quot;brush:as3&quot;&gt;The XML is parsed.
person ID : 1
	firstName : Anthony
	lastName : Robbins
	age : 51
person ID : 2
	firstName : Richard
	lastName : Branson
	age : 61
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-605-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-605-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-605-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align:right; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=jasu.tistory.com/605&amp;amp;layout=button_count&amp;amp;show_faces=true&amp;amp;width=90&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=dark&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:90px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
</description>
			<category>iOS&amp;Objective-C</category>
			<category>ios</category>
			<category>NSXMLParser</category>
			<category>Objective-C</category>
			<category>parser</category>
			<category>xml</category>
			<author>jasu jasu</author>
			<guid>http://jasu.tistory.com/605</guid>
			<comments>http://jasu.tistory.com/605#entry605comment</comments>
			<pubDate>Sat, 21 Apr 2012 19:11:59 +0900</pubDate>
		</item>
		<item>
			<title>iOS XML parser NSXMLParser[1]</title>
			<link>http://jasu.tistory.com/604</link>
			<description>&lt;p&gt;iOS에서 사용할 수 있는 XML 파서가 꽤 많다.&amp;nbsp;대체적으로 메모리 사용량이나 속도면에서 TBXML을 많이 사용하는 듯 하다. 무료도 제공되는 라이브러리가 성능면에서는 좋은&amp;nbsp;것 같은데... 문제는 iOS의 빠른 업데이트를 따라가려면 좀 시간이 걸린다는 것... TBXML에서는 아직 xCode에서 업데이트 된 ARC(Automatic Reference Counting)를 지원하지 않는 것 같아서 일단 기본 제공되는 NSXMLParser 사용법 부터 정리해 보기로 한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;NSXMLParser도 delegate 메소드를 통해서 element의 값들에 접근할 수 있다. iOS를 공부하면서 가장 이해하기 어려웠던 부분이 바로&amp;nbsp;delegate 메소드 호출방식이었다. 전혀 속도면에서 도움이 될 것 같지 않은 방법을 채택하고&amp;nbsp;있는지라 초기에는 왜 이렇게 해야만하는지에 대한 의문에 사로잡혀 있다보니&amp;nbsp;한 없이&amp;nbsp;복잡하고 어려웠다. 아무튼 공부는 이해가 안되면 그냥 정신줄을 놓고 외워서 받아들이는 편이&amp;nbsp;정신 건강에 좋다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;본론으로 들어가서... 본인도 틈틈히 개인적으로 공부하는 차원에서 정리하고&amp;nbsp;있기 때문에 내용에서&amp;nbsp;오류가 발견될 수도 있다. 오류가 있으면 알려주시면 좋겠다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;NSXMLParser는 parse 메소드에 메시지를 전달하면 delegate로 연결된 객체에서&amp;nbsp;처리해 놓은 일련의 메소드들을 호출하면서 파싱을 진행한다. 아래는 NSXMLParser가 파싱을 하면서 실행되는 메소드들의 순서다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;NSXMLParser 객체 parse 메소드 호출 후,&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; &quot;&gt;1. parserDidStartDocument&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; &quot;&gt;2. didStartElement&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; &quot;&gt;3. foundCharacters&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; &quot;&gt;4. didEndElement&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; &quot;&gt;5. parserDidEndDocument&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이 과정에서 오류가 발견되면 parseErrorOccurred 메소드가 호출된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래는 샘플로 활용할 xml 내용이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;pre class=&quot;brush:as3&quot;&gt;&lt;p&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;catalog&amp;gt;
   &amp;lt;book id=&quot;bk101&quot;&amp;gt;
      &amp;lt;author&amp;gt;Gambardella, Matthew&amp;lt;/author&amp;gt;
      &amp;lt;title&amp;gt;XML Developer's Guide&amp;lt;/title&amp;gt;
      &amp;lt;genre&amp;gt;Computer&amp;lt;/genre&amp;gt;
      &amp;lt;price&amp;gt;44.95&amp;lt;/price&amp;gt;
      &amp;lt;publish_date&amp;gt;2000-10-01&amp;lt;/publish_date&amp;gt;
      &amp;lt;description&amp;gt;An in-depth look at creating applications 
      with XML.&amp;lt;/description&amp;gt;
   &amp;lt;/book&amp;gt;
&amp;lt;/catalog&amp;gt;
&lt;/p&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;일단 번들에 있는 xml 데이터를 불러와서 파싱을 시작한다.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;pre class=&quot;brush:as3&quot;&gt;NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@&quot;sample.xml&quot;];
    NSData *data = [NSData dataWithContentsOfFile:path];
    
    self.xmlParser = [[NSXMLParser alloc] initWithData:data];
    self.xmlParser.delegate = self;
    if([self.xmlParser parse]){
        NSLog(@&quot;The XML is Parsed.&quot;);
        
    }else {
        NSLog(@&quot;Failed to parse the XML&quot;);
    }
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;[self.xmlParser parse] 메소드를 호출하여 파싱을 시작하면 처음으로 호출되는 메소드는 parserDidStartDocument&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;pre class=&quot;brush:as3&quot;&gt;-(void) parserDidStartDocument:(NSXMLParser *)parser{
      NSLog(@&quot;parserDidStartDocument&quot;);
      // tab 처리를 위한 전역 변수
      tabString = [NSMutableString new];
}
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;그리고 순차적으로 element들을 탐색하기 시작한다. 각 element에 접근할 때마다 아래 메소드가 실행된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;pre class=&quot;brush:as3&quot;&gt;-(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
                                          namespaceURI:(NSString *)namespaceURI 
                                          qualifiedName:(NSString *)qName 
                                          attributes:(NSDictionary *)attributeDict{
      tabString = [[tabString stringByAppendingString:@&quot;\t&quot;] mutableCopy];
      NSLog(@&quot;%@&quot;, [tabString stringByAppendingString:elementName]);
      
}
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;elementName가 각 element명이다. 여기서는 NSLog 쓸 때 tab을 하나씩 추가하여 들여쓰기를 한다. &amp;nbsp;해당 노드의 attribute들은 NSDictionary형으로 attributeDict을&amp;nbsp;참조해서 사용하면 된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그 다음으로 실행되는 것이&amp;nbsp;아래 메소드다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;pre class=&quot;brush:as3&quot;&gt;-(void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
      NSLog(@&quot;%@&quot;, [tabString stringByAppendingString:string]);
}
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;didStartElement 메소드에서 접근한 element의 value 값을 확인할 수 있다. 그 다음으로는 element의 값까지 접근했으니 element가 닫히는 부분이다. 여기서는 일단 elementName을 출력하고 tabString의 끝에 있는&amp;nbsp;'\t'을 하나씩 제거하여 들여쓰기를 전 단계로 되돌린다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;pre class=&quot;brush:as3&quot;&gt;-(void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
                                          namespaceURI:(NSString *)namespaceURI 
                                          qualifiedName:(NSString *)qName{
      NSLog(@&quot;%@&quot;, [tabString stringByAppendingString:elementName]);
      tabString = [[tabString substringToIndex:[tabString length]-1] mutableCopy];
}
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;이렇게 뎁스 안쪽으로 탐색을 하여 값을 참조하고 밖으로 나오면서 최종 root element를 닫으면&amp;nbsp;아래 메소드가 실행되고 parsing을 종료하게 된다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;pre class=&quot;brush:as3&quot;&gt;-(void) parserDidEndDocument:(NSXMLParser *)parser{
      NSLog(@&quot;parserDidEndDocument&quot;);
      tabString = nil;
}
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;output 결과 &amp;gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;pre class=&quot;brush:as3&quot;&gt;parserDidStartDocument
	catalog
	
   
		book
		
      
			author
			Gambardella, Matthew
			author
		
      
			title
			XML Developer's Guide
			title
		
      
			genre
			Computer
			genre
		
      
			price
			44.95
			price
		
      
			publish_date
			2000-10-01
			publish_date
		
      
			description
			An in-depth look at creating applications 
      with XML.
			description
		
   
		book
	

	catalog
parserDidEndDocument
The XML is Parsed.
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;element value가 없는 것들도 메소드는 실행되기 때문에 줄 내림이 생기는 것을 알 수 있다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;이제 해야할 일은 각 element와 attribute에 접근하여 값을 확인할 수 있으니 이것을 나름의 데이터에 저장해서 활용하면 된다. &lt;a href=&quot;http://jasu.tistory.com/605&quot; target=&quot;_top&quot; class=&quot;tx-link&quot;&gt;다음 포스트&lt;/a&gt;에서는&amp;nbsp;참조된 데이터를&amp;nbsp;저장하여 사용하는&amp;nbsp;부분을&amp;nbsp;추가하도록 하겠다.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-604-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-604-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-604-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align:right; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=jasu.tistory.com/604&amp;amp;layout=button_count&amp;amp;show_faces=true&amp;amp;width=90&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=dark&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:90px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
</description>
			<category>iOS&amp;Objective-C</category>
			<category>ios</category>
			<category>NSXMLParser</category>
			<category>Objective-C</category>
			<category>parser</category>
			<category>TBXML</category>
			<category>xml</category>
			<author>jasu jasu</author>
			<guid>http://jasu.tistory.com/604</guid>
			<comments>http://jasu.tistory.com/604#entry604comment</comments>
			<pubDate>Fri, 20 Apr 2012 00:43:38 +0900</pubDate>
		</item>
		<item>
			<title>형식이 있는 문자열이 사용할 수 있는 토큰</title>
			<link>http://jasu.tistory.com/603</link>
			<description>&lt;p&gt;&lt;/p&gt;&lt;p&gt;Objective-C에서 형식이 있는 문자열이 사용할 수 있는 토큰&lt;br /&gt;&lt;br /&gt;&lt;table class=&quot;datatable&quot; style=&quot;border-collapse: collapse; line-height: 24px; margin-top: 1px; margin-right: 0px; margin-bottom: 1px; margin-left: 0px; font-size: 12px; color: rgb(0, 0, 0); font-family: arial, 굴림, Gulim, dotum, 돋움, sans-serif; width: 703px; &quot; width=&quot;703&quot;&gt;&lt;thead style=&quot;line-height: 2em; &quot;&gt;&lt;tr style=&quot;line-height: 2em; &quot;&gt;&lt;th style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; background-color: rgb(116, 116, 116); width: 237px; &quot;&gt;&lt;span style=&quot;color: rgb(217, 229, 255); &quot;&gt;심벌&lt;/span&gt;&lt;/th&gt;&lt;th style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; background-color: rgb(116, 116, 116); width: 463px; &quot;&gt;&lt;span style=&quot;color: rgb(217, 229, 255); &quot;&gt;표시&lt;/span&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;line-height: 2em; &quot;&gt;&lt;tr style=&quot;line-height: 2em; &quot;&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; height: 25px; background-color: rgb(189, 189, 189); width: 237px; &quot;&gt;&amp;nbsp;%@&lt;/td&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; height: 25px; background-color: rgb(189, 189, 189); width: 463px; &quot;&gt;&amp;nbsp;id&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;line-height: 2em; &quot;&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 237px; &quot;&gt;&amp;nbsp;%d, %D, %i&lt;/td&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 463px; &quot;&gt;long&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;line-height: 2em; &quot;&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 237px; &quot;&gt;&amp;nbsp;%u, %U&lt;/td&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 463px; &quot;&gt;unsigned long&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;line-height: 2em; &quot;&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 237px; &quot;&gt;&amp;nbsp;%hi&lt;/td&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 463px; &quot;&gt;short&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;line-height: 2em; &quot;&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 237px; &quot;&gt;&amp;nbsp;%hu&lt;/td&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 463px; &quot;&gt;unsigned short&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;line-height: 2em; &quot;&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 237px; &quot;&gt;&amp;nbsp;%qi&lt;/td&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 463px; &quot;&gt;long long&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;line-height: 2em; &quot;&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 237px; &quot;&gt;&amp;nbsp;%qu&lt;/td&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 463px; &quot;&gt;unsigned long&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;line-height: 2em; &quot;&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 237px; &quot;&gt;&amp;nbsp;%x, %X&lt;/td&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 463px; &quot;&gt;16진법으로 표시한 unsigned long&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;line-height: 2em; &quot;&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 237px; &quot;&gt;&amp;nbsp;%o, %O&lt;/td&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 463px; &quot;&gt;8진법으로 표시한&amp;nbsp;unsigned long&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;line-height: 2em; &quot;&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 237px; &quot;&gt;&amp;nbsp;%f, %e, %E, %g, %G&lt;/td&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 463px; &quot;&gt;double&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;line-height: 2em; &quot;&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 237px; &quot;&gt;&amp;nbsp;%c&lt;/td&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 463px; &quot;&gt;ASCII 문자인 unsigned char&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;line-height: 2em; &quot;&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 237px; &quot;&gt;&amp;nbsp;%C&lt;/td&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 463px; &quot;&gt;유니코드 문자인 unichar&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;line-height: 2em; &quot;&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 237px; &quot;&gt;&amp;nbsp;%s&lt;/td&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 463px; &quot;&gt;char* (ASCII&amp;nbsp;문자들.&amp;nbsp;NULL로 끝을 나타내는 C&amp;nbsp;문자열)&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;line-height: 2em; &quot;&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 237px; &quot;&gt;&amp;nbsp;%S&lt;/td&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 463px; &quot;&gt;unichar* (유니코드 문자들. NULL로 끝을 나타내는 C 문자열)&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;line-height: 2em; &quot;&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 237px; &quot;&gt;&amp;nbsp;%p&lt;/td&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 463px; &quot;&gt;void* (0x로 시작하는 16진법으로&amp;nbsp;표시한 주소)&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;line-height: 2em; &quot;&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 237px; &quot;&gt;&amp;nbsp;%%&lt;/td&gt;&lt;td style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; line-height: 2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); border-image: initial; overflow-x: hidden; overflow-y: hidden; background-color: rgb(189, 189, 189); width: 463px; &quot;&gt;% 문자&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: normal;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-603-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-603-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-603-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align:right; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=jasu.tistory.com/603&amp;amp;layout=button_count&amp;amp;show_faces=true&amp;amp;width=90&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=dark&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:90px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
</description>
			<category>iOS&amp;Objective-C</category>
			<category>ios</category>
			<category>Objective-C</category>
			<author>jasu jasu</author>
			<guid>http://jasu.tistory.com/603</guid>
			<comments>http://jasu.tistory.com/603#entry603comment</comments>
			<pubDate>Tue, 10 Apr 2012 13:20:07 +0900</pubDate>
		</item>
		<item>
			<title>UIColor 매크로(RGB, RGBA, HTML)</title>
			<link>http://jasu.tistory.com/602</link>
			<description>&lt;p&gt;&lt;span style=&quot;text-align: left; &quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-align: left; &quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;#define RGB(r, g, b) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1]&lt;/p&gt;&lt;p&gt;#define RGBA(r, g, b, a) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:a]&lt;/p&gt;&lt;p&gt;#define HTML(rgb) RGB((double)(rgb &amp;gt;&amp;gt; 16 &amp;amp; 0xff), (double)(rgb &amp;gt;&amp;gt; 8 &amp;amp; 0xff), (double)(rgb &amp;amp; 0xff))&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-align: left; &quot;&gt;//////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;// Code without the macro&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; msgLabel.textColor =&amp;nbsp;[UIColor colorWithRed:255/255.0 green:251/255.0 blue:204/255.0 alpha:1];&lt;/p&gt;&lt;p&gt;&lt;i&gt;// Or like this...&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; msgLabel.textColor = [UIColor colorWithRed:1.0 green:.98 blue:.8 alpha:1];&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;i&gt;// Code with macro&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; msgLabel.textColor = RGB(255, 251, 204);&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; &quot;&gt;[label setTextColor:HTML(0xff0000)];&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;참고 :&amp;nbsp;&lt;a href=&quot;http://iphonedevelopertips.com/cocoa/uicolor-macros.html&quot;&gt;http://iphonedevelopertips.com/cocoa/uicolor-macros.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;&lt;a href=&quot;http://iphonedevelopertips.com/cocoa/uicolor-macros.html&quot;&gt;&lt;br /&gt;&lt;/a&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-602-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-602-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-602-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align:right; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=jasu.tistory.com/602&amp;amp;layout=button_count&amp;amp;show_faces=true&amp;amp;width=90&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=dark&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:90px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
</description>
			<category>iOS&amp;Objective-C</category>
			<category>color</category>
			<category>ios</category>
			<category>Macros</category>
			<category>Objective-C</category>
			<category>RGB</category>
			<category>UIColor</category>
			<category>매크로</category>
			<category>태그를 입력해 주세요.</category>
			<author>jasu jasu</author>
			<guid>http://jasu.tistory.com/602</guid>
			<comments>http://jasu.tistory.com/602#entry602comment</comments>
			<pubDate>Wed, 04 Apr 2012 17:49:45 +0900</pubDate>
		</item>
		<item>
			<title>AIR 3 &amp; FP11 - RTMFP + Starling framework</title>
			<link>http://jasu.tistory.com/599</link>
			<description>&lt;iframe src=&quot;http://player.vimeo.com/video/35173287?title=0&amp;amp;portrait=0&amp;amp;color=FF6600&quot; width=&quot;700&quot; height=&quot;393&quot; frameborder=&quot;0&quot; webkitAllowFullScreen mozallowfullscreen allowFullScreen&gt;&lt;/iframe&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-599-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-599-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-599-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align:right; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=jasu.tistory.com/599&amp;amp;layout=button_count&amp;amp;show_faces=true&amp;amp;width=90&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=dark&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:90px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
</description>
			<category>Framework</category>
			<category>ActionScript</category>
			<category>ActionScript3.0</category>
			<category>Adobe</category>
			<category>AIR 3</category>
			<category>AS3</category>
			<category>CS5.5</category>
			<category>flash</category>
			<category>Flash Player</category>
			<category>FP11</category>
			<category>framework</category>
			<category>RTMFP</category>
			<category>Stage3D</category>
			<category>Starling</category>
			<category>액션스크립트</category>
			<category>플래시</category>
			<author>jasu jasu</author>
			<guid>http://jasu.tistory.com/599</guid>
			<comments>http://jasu.tistory.com/599#entry599comment</comments>
			<pubDate>Tue, 17 Jan 2012 11:36:13 +0900</pubDate>
		</item>
		<item>
			<title>Starling 이미지 로드 및 scale &amp; rotation</title>
			<link>http://jasu.tistory.com/598</link>
			<description>&lt;div&gt;
&lt;object classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,12,36&quot; id=&quot;jasudev&quot; width=&quot;700&quot; height=&quot;360&quot;&gt;&lt;param name=&quot;bgcolor&quot; value=&quot;#000000&quot; /&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.ifacies.com/blog/custom02.swf&quot; /&gt;&lt;param name=&quot;wmode&quot; value=&quot;direct&quot; /&gt;&lt;param name=&quot;allowFullscreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot; /&gt;&lt;embed src=&quot;http://www.ifacies.com/blog/custom02.swf&quot; type=&quot;application/x-shockwave-flash&quot; name=&quot;jasudev&quot; allowScriptAccess=&quot;always&quot; allowFullscreen=&quot;true&quot; wmode=&quot;direct&quot; width=&quot;700&quot; height=&quot;360&quot; bgcolor=&quot;#000000&quot; /&gt;&lt;/object&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;package {
	import starling.events.Event;
	import starling.core.Starling;
	import starling.display.Sprite;
	import starling.display.Button;
	import starling.display.Image;
	import starling.textures.Texture;
	import starling.events.Touch;
	import starling.events.TouchEvent;
	import starling.events.TouchPhase;
	import starling.animation.Tween;
	import starling.animation.Transitions;
	import starling.utils.deg2rad;
	import starling.display.DisplayObject;
	import starling.text.TextField;
    import starling.utils.HAlign;
    import starling.utils.VAlign;
    
    import utils.TouchSheet;
	
	import flash.geom.Rectangle;
	import flash.geom.Point;
	import flash.display.Bitmap;
	import flash.net.URLRequest;
	import flash.display.Loader;
	import flash.events.Event;

	public class Demo extends Sprite {

		private var _loader:Loader;
		private var _image:Image;
		private var _posText:TextField;
		private var _sheet:TouchSheet;
		
		public function Demo() {
			_loader = new Loader();
			_loader.load(new URLRequest(&quot;http://cfile24.uf.tistory.com/image/11252E424F0ADA1C069349&quot;));
			_loader.contentLoaderInfo.addEventListener(flash.events.Event.COMPLETE, onLoadedHandler);
		}

		
		private function onLoadedHandler(e:flash.events.Event):void{
			var bitmap:Bitmap = _loader.content as Bitmap;
			var texture:Texture = Texture.fromBitmap(bitmap);
			_image = new Image(texture);
			
			
			 var description:String = 
                &quot;- touch and drag to move the images \n&quot; +
                &quot;- pinch with 2 fingers to scale and rotate \n&quot; +
                &quot;- double tap brings an image to the front \n&quot; +
                &quot;- use Ctrl/Cmd &amp;amp; Shift to simulate multi-touch&quot;;
            
            var infoText:TextField = new TextField(300, 75, description);
            infoText.x = 10;
			infoText.y = 35;
			infoText.fontSize = 12;
			infoText.color = 0x999999;
            infoText.vAlign = VAlign.TOP;
            infoText.hAlign = HAlign.LEFT;
            addChild(infoText);
			
			_sheet = new TouchSheet(_image);
			_sheet.scaleX = 0.2;
			_sheet.scaleY = 0.2;
			setAlignCenter(_sheet);
			_sheet.addEventListener(TouchEvent.TOUCH, onTouchHandler);
			addChild(_sheet);
			
			_posText = new TextField(400, 480, &quot;&quot;);
			_posText.x = 10;
			_posText.y = 105;
			_posText.fontSize = 12;
			_posText.color = 0xBBBBBB;
            _posText.vAlign = VAlign.TOP;
            _posText.hAlign = HAlign.LEFT;
			_posText.touchable = false;
            addChild(_posText);
			
			stage.addEventListener(starling.events.Event.RESIZE, onResizeHandler);
			
		}
		
		private function onTouchHandler(e:TouchEvent):void{
			var touches:Vector.&amp;lt;Touch&amp;gt; = e.getTouches(_sheet);
			_posText.text = &quot;_sheet.x : &quot;+_sheet.x+&quot;\n&quot;+
							&quot;_sheet.y : &quot;+_sheet.y+&quot;\n&quot;+
							&quot;_sheet.width  : &quot;+_sheet.width+&quot;\n&quot;+
							&quot;_sheet.height : &quot;+_sheet.height;
			
			var len:int = touches.length;
			for(var i:int=0;i&amp;lt;len;i++){
				var touch:Touch = touches[i];
				var currentPoint:Point = touch.getLocation(_sheet);
				var previousPoint:Point = touch.getPreviousLocation(_sheet);
				_posText.text +=&quot;\n\n&quot;+&quot;touches[&quot;+i+&quot;]========================\n&quot;+
								&quot;previousGlobalX : &quot;+touch.previousGlobalX+&quot;\n&quot;+
								&quot;previousGlobalY : &quot;+touch.previousGlobalY+&quot;\n&quot;+
								&quot;globalX : &quot;+touch.globalX+&quot;\n&quot;+
								&quot;globalY : &quot;+touch.globalY+&quot;\n&quot;+
								&quot;getLocation().x : &quot;+currentPoint.x+&quot;\n&quot;+
								&quot;getLocation().y : &quot;+currentPoint.y+&quot;\n&quot;+
								&quot;getPreviousLocation().x : &quot;+previousPoint.x+&quot;\n&quot;+
								&quot;getPreviousLocation().y : &quot;+previousPoint.y;
			}
			
		}
		
		private function onResizeHandler(e:starling.events.Event):void{
			
		}

		private function setAlignCenter(inTarget:DisplayObject):void{
			inTarget.x = stage.stageWidth &amp;gt;&amp;gt; 1;
			inTarget.y = stage.stageHeight &amp;gt;&amp;gt; 1;
		}

		public override function dispose():void {
			super.dispose();
		}
	}
}
&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-598-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-598-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-598-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align:right; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=jasu.tistory.com/598&amp;amp;layout=button_count&amp;amp;show_faces=true&amp;amp;width=90&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=dark&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:90px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
</description>
			<category>Framework</category>
			<category>ActionScript</category>
			<category>actionscript 3.0</category>
			<category>Adobe</category>
			<category>AS3</category>
			<category>BitmapData</category>
			<category>flash</category>
			<category>Flash Player 11</category>
			<category>FP11</category>
			<category>framework</category>
			<category>image</category>
			<category>load</category>
			<category>loader</category>
			<category>rotation</category>
			<category>scale</category>
			<category>Starling</category>
			<category>Touch</category>
			<category>TouchEvent</category>
			<category>액션스크립트</category>
			<category>플래시</category>
			<author>jasu jasu</author>
			<guid>http://jasu.tistory.com/598</guid>
			<comments>http://jasu.tistory.com/598#entry598comment</comments>
			<pubDate>Thu, 12 Jan 2012 10:52:22 +0900</pubDate>
		</item>
		<item>
			<title>Starling performance test</title>
			<link>http://jasu.tistory.com/597</link>
			<description>&lt;div&gt;
&lt;object classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,12,36&quot; id=&quot;jasudev&quot; width=&quot;700&quot; height=&quot;360&quot;&gt;&lt;param name=&quot;bgcolor&quot; value=&quot;#000000&quot; /&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.ifacies.com/blog/custom01.swf&quot; /&gt;&lt;param name=&quot;wmode&quot; value=&quot;direct&quot; /&gt;&lt;param name=&quot;allowFullscreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot; /&gt;&lt;embed src=&quot;http://www.ifacies.com/blog/custom01.swf&quot; type=&quot;application/x-shockwave-flash&quot; name=&quot;jasudev&quot; allowScriptAccess=&quot;always&quot; allowFullscreen=&quot;true&quot; wmode=&quot;direct&quot; width=&quot;700&quot; height=&quot;360&quot; bgcolor=&quot;#000000&quot; /&gt;&lt;/object&gt;&lt;/div&gt;
&lt;br /&gt;&lt;div&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;package {
	import starling.events.Event;
	import starling.core.Starling;
	import starling.display.Sprite;
	import starling.display.Button;
	import starling.textures.Texture;
	import starling.display.DisplayObject;
	import starling.display.Image;
	import starling.utils.deg2rad;
	import flash.display.Bitmap;


	public class Demo extends Sprite {

		[Embed(source = &quot;f60.png&quot;)]
		private var MyBitmap:Class;
		
		private var _myTexture:Texture;
		private var _arrButterflys:Vector.&amp;lt;Butterfly&amp;gt;;

		public function Demo() {
			// addedToStage 이벤트에 대한 리스너 추가
			addEventListener( Event.ADDED_TO_STAGE , onAddedToStage);
		}


		private function onAddedToStage(e:Event):void {
			var myBitmap:Bitmap = new MyBitmap() as Bitmap;
			_myTexture = Texture.fromBitmap(myBitmap);

			var len:int = 800;
			
			_arrButterflys = new Vector.&amp;lt;Butterfly&amp;gt;(len, false);
			
			for (var i:int = 0; i&amp;lt;len; i++) {
				var fly:Butterfly = new Butterfly(_myTexture);
				
				fly.alpha = Math.random();
				fly.destX = Math.random()*stage.stageWidth;
				fly.destY = Math.random()*stage.stageHeight;
				
				fly.setVertexColor(0, Math.random()*0xFFFFFF);
				fly.setVertexColor(1, Math.random()*0xFFFFFF);
				fly.setVertexColor(2, Math.random()*0xFFFFFF);
				fly.setVertexColor(3, Math.random()*0xFFFFFF);
				
				fly.x = Math.random()*stage.stageWidth;
				fly.y = Math.random()*stage.stageHeight;
				fly.rotation = deg2rad(Math.random()*360);
				
				fly.pivotX = fly.width &amp;gt;&amp;gt; 1;
				fly.pivotY = fly.height &amp;gt;&amp;gt; 1;
				
				_arrButterflys[i] = fly;
				addChild(fly);
			}

			stage.addEventListener(Event.ENTER_FRAME, onFrame);
		}
		
		private function onFrame(e:Event):void{

			var len:uint = _arrButterflys.length;

			for (var i:int = 0; i &amp;lt; len; i++){

				// move the sausages around
				var fly:Butterfly = _arrButterflys[i];
				
				fly.x -= ( fly.x - fly.destX ) * .1;
				fly.y -= ( fly.y - fly.destY ) * .1;

				if (Math.abs(fly.x - fly.destX)&amp;lt;1 &amp;amp;&amp;amp; Math.abs(fly.y-fly.destY) &amp;lt; 1){
					fly.destX = Math.random()*stage.stageWidth;
					fly.destY = Math.random()*stage.stageHeight;
					fly.rotation = deg2rad(Math.random()*360);
				}
			}
		}

		public override function dispose():void {
			removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
			_myTexture.dispose();
			super.dispose();
		}
	}
}

import starling.display.Image;
import starling.textures.Texture;

class Butterfly extends Image{
	
	public var destX:Number = 0;
	public var destY:Number = 0;
	
	public function Butterfly(inTexture:Texture):void{
		super(inTexture);
	}
}
&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-597-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-597-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-597-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align:right; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=jasu.tistory.com/597&amp;amp;layout=button_count&amp;amp;show_faces=true&amp;amp;width=90&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=dark&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:90px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
</description>
			<category>Framework</category>
			<category>ActionScript</category>
			<category>actionscript 3.0</category>
			<category>Adobe</category>
			<category>AS3</category>
			<category>bitmap</category>
			<category>BitmapData</category>
			<category>deg2rad</category>
			<category>flash</category>
			<category>FP11</category>
			<category>framework</category>
			<category>Performance</category>
			<category>Programming</category>
			<category>Starling</category>
			<category>액션스크립트</category>
			<category>프로그래밍</category>
			<category>플래시</category>
			<author>jasu jasu</author>
			<guid>http://jasu.tistory.com/597</guid>
			<comments>http://jasu.tistory.com/597#entry597comment</comments>
			<pubDate>Tue, 10 Jan 2012 21:58:59 +0900</pubDate>
		</item>
		<item>
			<title>[Starling-10] 터치 이벤트와 Touch 클래스</title>
			<link>http://jasu.tistory.com/596</link>
			<description>Starling은 손가락의 조작이나 마우스 조작 모두 동일한 이벤트( TouchEvent )로 취급한다. Flash Player의 마우스 이벤트와는 달리 이벤트 종류는 TouchEvent.TOUCH 하나 뿐이다. 따라서 클릭 및 이동 등의 조작 상태는 이벤트에 포함되어 있는 Touch 객체 속성에서 판단하게 되어 있다.&lt;br /&gt;
&lt;br /&gt;
Starling의 모든 표시 객체(Sprite, Stage, Quad, …)는 TouchEvent을 처리할 수 있다. 단, Button 클래스는 내부적으로 터치 이벤트를 triggered 이벤트로 변환하고 있기 때문에 자신의 리스너를 추가하는 것은 주의가 필요하다. 또한 표시 객체 자신이나 부모 개체 touchable 속성이 false의 경우는 TouchEvent를 받을 수 없다.&lt;br /&gt;
&lt;br /&gt;
아무튼 Starling에서 터치 작업을 처리하려면 우선 표시 객체에 TouchEvent.TOUCH 이벤트 리스너를 추가해야 한다. 아래는 샘플이다.&lt;br /&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;&lt;br /&gt;
import starling.events.TouchEvent;	&lt;br /&gt;
myImage.addEventListener(TouchEvent.TOUCH,onTouch);	&lt;br /&gt;
&lt;br /&gt;
private function onTouch(e:TouchEvent):void {		&lt;br /&gt;
        trace(e.target);	&lt;br /&gt;
}&lt;/pre&gt;&lt;br /&gt;
Starling의 이벤트는 표시 목록에 버블링하기 위해 아래의 계층 객체에서 이벤트도 검색할 수 있다. (참고:사양에서는 계층의 위에서 아래로 전파하지만 지금의 구현에서는 Stage에서 이벤트를 받을 수도 있는 것 같다.)&lt;br /&gt;
&lt;br /&gt;
샘플에서 사용하는 target 속​​성과 currentTarget 속​​성 사용법은 Flash Player 표준 이벤트와 동일하다. 기타 TouchEvent에는 다음과 같은 속성도 있다. 모든 읽기 전용이다.&lt;br /&gt;
&lt;br /&gt;
ctrlKey : 이벤트가 발생할 때 Ctrl 키가 눌리고 있었는지 나타내는&lt;br /&gt;
shiftKey : 이벤트 발생시 Shift 키가 눌리고 있었는지 나타내는&lt;br /&gt;
timestamp : 터치가 시작된 이후의 시간(초)&lt;br /&gt;
touches : 사용 가능한 Touch 객체의 벡터&lt;br /&gt;
&lt;br /&gt;
마지막 touches은 이벤트와 관련된 하나 이상의 Touch 객체의 벡터다. Touch 객체는 이벤트 발생시킨 손가락이나 마우스 조작 정보를 보유하고 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Touch 객체 가져오기&lt;/b&gt;&lt;br /&gt;
TouchEvent에는 Touch 객체를 취득하기 위한 메소드가 포함되어 있다. 멀티 터치를 사용하지 않는 경우 getTouch()메소드에서 Touch 객체를 얻을 수 있다. (멀티 터치의 경우는 후술)&lt;br /&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;&lt;br /&gt;
private function onTouch(e:TouchEvent):void {		&lt;br /&gt;
        var touch:Touch = e.getTouch(stage);		&lt;br /&gt;
         if (touch) {			&lt;br /&gt;
        &amp;nbsp;         trace(e.target, touch.target);		&lt;br /&gt;
        }	&lt;br /&gt;
}&lt;/pre&gt;&lt;br /&gt;
getTouch() 메소드의 첫 번째 인수는 검색할 Touch 객체를 좁히려는 조건이다. 작업의 대상이 된 표시 객체가 인수로 지정된 오브젝트와 일치하는 또는 인수 계층 아래에​​ 포함된 경우, getTouch()는 값을 반환한다. 실제 작업의 대상은 Touch 객체 취득 후에 target 속​​성에서 볼 수 있다. (작업의 대상과 이벤트의 대상은 반드시 일치하지 않는다는 것에 유의)&lt;br /&gt;
&lt;br /&gt;
Touch객체는 target 이외에도 작업을 식별하는 특성이 몇 가지가 더 있다.&lt;br /&gt;
&lt;br /&gt;
target : 터치 조작의 대상이 된 표시 객체&lt;br /&gt;
id : 터치를 식별하는 숫자&lt;br /&gt;
timestamp : 터치 조작 시간 (터치 시작으로부터 초)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;TouchPhase&lt;/b&gt;&lt;br /&gt;
위에서 이야기한 것처럼, Touch 객체는 작업 상태를 나타내는 속성이 있다. 속성 이름은 phase다. &lt;br /&gt;
&lt;br /&gt;
phase : 현재 터치 상황&lt;br /&gt;
&lt;br /&gt;
phase 속성에 설정 가능한 값은 TouchPhases 클래스에 정의되어 있다. 자주 사용되는 값은 다음 세 가지다.&lt;br /&gt;
&lt;br /&gt;
BEGAN : 손가락이 화면에 접한 또는 마우스 버튼이 눌러진&lt;br /&gt;
MOVED : 손가락이 화면을 이동하거나 마우스 버튼이 눌러진 상태 이동&lt;br /&gt;
ENDED : 손가락이 화면에서 떨어진 또는 마우스 버튼에서 떨어진&lt;br /&gt;
&lt;br /&gt;
BEGAN이 한 번, MOVED가 0 이상 반복되고, ENDED가 한 번 발생하는 것이 기본적인 흐름이다.다음과 같은 상태도 있다.&lt;br /&gt;
&lt;br /&gt;
STATIONARY : 손가락 또는 마우스가 이전 프레임에서 이동&lt;br /&gt;
&lt;br /&gt;
일반적으로 이 상태에서는 이벤트가 발생되지 않아야하지만, 멀티 터치를 취급하는 경우에는 STATIONARY가 포함될 수 있다.마지막으로 마우스 이용 때만 나타나는 상태다.&lt;br /&gt;
&lt;br /&gt;
HOVER : 마우스 버튼이 눌러지지 않은 상태에서 표시 객체에 포인터가 있을 때&lt;br /&gt;
&lt;br /&gt;
손가락으로 (지금까지) 접하지 않고 포인터를 이동시킬 수 없기 때문에 OVER는 있어도 HOVER는 없다는 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;포인터 위치 가져오기&lt;/b&gt;&lt;br /&gt;
Touch 객체는 스테이지의 현재 위치와 이전 위치 속성을 가지고 있다. 다음 네 가지다. 형태는 모두 Number.&lt;br /&gt;
&lt;br /&gt;
globalX : 스테이지 좌표를 기준으로 한 현재의 손가락 (포인터)의 x 좌표&lt;br /&gt;
globalY : 스테이지 좌표를 기준으로 한 현재의 손가락 (포인터)의 y 좌표&lt;br /&gt;
previousGlobalX : 스테이지 좌표를 기준으로 이전의 손가락 (포인터)의 x 좌표&lt;br /&gt;
previousGlobalY : 스테이지 좌표를 기준으로 이전의 손가락 (포인터)의 y 좌표&lt;br /&gt;
&lt;br /&gt;
그러나 대부분의 경우 다른 좌표계에서의 위치를​​ 계산하게 될 것이다. 그래서, Touch 클래스에는 위의 속성 값을 특정 객체를 기준으로 한 좌표로 변환하는 메소드를 제공 한다.&lt;br /&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;&lt;br /&gt;
public function getLocation(space:DisplayObject):Point&lt;br /&gt;
public function getPreviousLocation(space:DisplayObject):Point&lt;/pre&gt;&lt;br /&gt;
이 두 메소드는 인수 객체의 좌표를 기준으로 한 현재의 위치 또는 마지막 위치를 반환한다.아래는 Touch 객체의 위치 정보를 사용하는 샘플이다.&lt;br /&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;&lt;br /&gt;
var touch:Touch = event.getTouch(this, TouchPhase.MOVED);	&lt;br /&gt;
if (touch) {		&lt;br /&gt;
        // 부모 개체를 기준으로 이동 거리를 계산하는		&lt;br /&gt;
         var currentPos:Point = touch.getLocation(parent);		&lt;br /&gt;
         var previousPos:Point = touch.getPreviousLocation(parent);		&lt;br /&gt;
         var delta:Point = currentPos.subtract(previousPos);		&lt;br /&gt;
&lt;br /&gt;
        // 객체의 위치를​​ 변경		&lt;br /&gt;
         x +=  delta.x;		&lt;br /&gt;
         y +=  delta.y;	&lt;br /&gt;
}&lt;/pre&gt;&lt;br /&gt;
getTouch() 메소드의 두 번째 인수는 원하는 상태를 지정할 수 있다. 위의 예제에서는 손가락 이동 정보를 취급하기 위하여 TouchPhase.MOVED를 지정하고 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;더블 클릭의 사용 방법&lt;/b&gt;&lt;br /&gt;
Touch 객체를 통해 더블 클릭을 감지할 수 있도록 tapCount 속성이 있다. 이 속성을 사용하여 더블 클릭에 해당하는 코드를 작성한 것이 아래의 예제다.&lt;br /&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;&lt;br /&gt;
touch = event.getTouch(this, TouchPhase.ENDED); &lt;br /&gt;
if (touch &amp;amp; &amp;amp; touch.tapCount == 2)  parent.addChild (this);&lt;/pre&gt;&lt;br /&gt;
작동 상태가 ENDED의 Touch 객체가 존재하며 탭 횟수가 2 회인 경우를 검색하고 있다.멀티 터치Starling은 멀티 터치도 지원한다. 멀티 터치를 처리하려면 Starling 객체에 다음과 같이 설정한다.&lt;br /&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;&lt;br /&gt;
mStarling.simulateMultitouch = true;&lt;/pre&gt;&lt;br /&gt;
이 상태에서 실제로 멀티 터치를 하면 터치 때마다 Touch 객체가 만들어진다. 그리고 TouchEvent에 전달된다. TouchEvent에서 여러 Touch 개체를 가져오려면 getTouches() 메소드를 사용한다. 아래는 그 예제다.&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;var touches:Vector.&amp;lt;Touch&amp;gt;=touchEvent.getTouches(this);&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
반환 값은 Touch 벡터다. getTouch()뿐만 아니라 두 번째 인수로 원하는 상태를 지정할 수 있다.참고로 Ctrl 키를 사용하여 데스크탑 환경에서도 멀티 터치를 시뮬레이션할 수 있게 되어 있다. 물론 실제 터치 디바이스에서는 손가락으로 조작하면 된다.&lt;br /&gt;
&lt;br /&gt;
원본 :&amp;nbsp;&lt;a href=&quot;http://cuaoar.jp/2012/01/starling-touch.html&quot;&gt;http://cuaoar.jp/2012/01/starling-touch.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;&lt;object classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,12,36&quot; id=&quot;jasudev&quot; width=&quot;700&quot; height=&quot;360&quot;&gt;&lt;param name=&quot;bgcolor&quot; value=&quot;#000000&quot; /&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.ifacies.com/blog/sample10.swf&quot; /&gt;&lt;param name=&quot;wmode&quot; value=&quot;direct&quot; /&gt;&lt;param name=&quot;allowFullscreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot; /&gt;&lt;embed src=&quot;http://www.ifacies.com/blog/sample10.swf&quot; type=&quot;application/x-shockwave-flash&quot; name=&quot;jasudev&quot; allowScriptAccess=&quot;always&quot; allowFullscreen=&quot;true&quot; wmode=&quot;direct&quot; width=&quot;700&quot; height=&quot;360&quot; bgcolor=&quot;#000000&quot; /&gt;&lt;/object&gt;&lt;/div&gt;
&lt;br /&gt;&lt;div&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;package {
	import starling.events.Event;
	import starling.events.Touch;
	import starling.events.TouchEvent;
	import starling.events.TouchPhase;
	import starling.core.Starling;
	import starling.display.Sprite;
	import starling.display.Image;
	import starling.textures.Texture;
	import starling.display.DisplayObject;
	import starling.animation.Tween;
	import starling.animation.Transitions;
	import starling.utils.deg2rad;
	import flash.display.Bitmap;
	import flash.geom.Point;


	public class Demo extends Sprite {

		[Embed(source=&quot;icon128.png&quot;)]
		private var MyBitmap:Class;
		
		private var myButton:Image;

		public function Demo() {
			// addedToStage 이벤트에 대한 리스너 추가
			addEventListener( Event.ADDED_TO_STAGE , onAddedToStage);
		}


		private function onAddedToStage(e:Event):void {
			var myBitmap:Bitmap = new MyBitmap() as Bitmap;
			var myTexture:Texture = Texture.fromBitmap(myBitmap);
			
			myButton = new Image(myTexture);
			myButton.addEventListener(TouchEvent.TOUCH, onTouchHandler);
			
			myButton.pivotX = myButton.width &amp;gt;&amp;gt; 1;
			myButton.pivotY = myButton.height &amp;gt;&amp;gt; 1;
			addChild(myButton);
			setAlign(myButton);

		}
		
		private function onTouchHandler(e:TouchEvent):void{
			var touch:Touch = e.getTouch(myButton);
			if(touch){
				switch(touch.phase){
					case TouchPhase.BEGAN : myButton.setVertexColor(0, 0xFF6600);
											myButton.setVertexColor(1, 0xFF6600);
											myButton.setVertexColor(2, 0xFF6600);
											myButton.setVertexColor(3, 0xFF6600);
					break;
					case TouchPhase.MOVED : 
					break;
					case TouchPhase.ENDED : myButton.setVertexColor(0, 0xFFFFFF);
											myButton.setVertexColor(1, 0xFFFFFF);
											myButton.setVertexColor(2, 0xFFFFFF);
											myButton.setVertexColor(3, 0xFFFFFF);
				}
			}
			
			
			/*
			touch = e.getTouch(myButton, TouchPhase.MOVED);   
			if (touch) {        
					// 부모 개체를 기준으로 이동 거리를 계산하는      
					 var currentPos:Point = touch.getLocation(parent);      
					 var previousPos:Point = touch.getPreviousLocation(parent);     
					 var delta:Point = currentPos.subtract(previousPos);        
			 
					// 객체의 위치를​​ 변경     
					 myButton.x +=  delta.x;     
					 myButton.y +=  delta.y; 
			}
			*/
			
			touch = e.getTouch(this, TouchPhase.ENDED); 
			if (touch &amp;amp;&amp;amp; touch.tapCount == 2){
				rotationToTween(0.6, 90, Transitions.EASE_OUT_BOUNCE);
			}
			
			var touches:Vector.&amp;lt;Touch&amp;gt; = e.getTouches(stage); 
			if(touches.length == 2){
				var firstPos:Point = touches[0].getLocation(parent);      
				var secondPos:Point = touches[1].getLocation(parent);  
				var distance:Number = Point.distance(firstPos, secondPos);

				scaleToTween(0.2, distance*0.01, Transitions.EASE_OUT);
			}else{
				touch = e.getTouch(this, TouchPhase.MOVED); 
				if (touch){
					moveToTween(0.14, touch.globalX, touch.globalY, Transitions.EASE_OUT);
				}
			}
			
		}
		
		private function rotationToTween(inTime:Number, inRot:int, inEase:String):void{
			var tween:Tween = new Tween(myButton, inTime, inEase);
			tween.animate(&quot;rotation&quot;, myButton.rotation+deg2rad(inRot));
			Starling.juggler.add(tween);
		}
		
		private function moveToTween(inTime:Number, inX:int, inY:int, inEase:String):void{
			var tween:Tween = new Tween(myButton, inTime, inEase);
			tween.moveTo(inX, inY);
			Starling.juggler.add(tween);
		}
		
		private function scaleToTween(inTime:Number, inScale:Number, inEase:String):void{
			var tween:Tween = new Tween(myButton, inTime, inEase);
			tween.scaleTo(inScale);
			Starling.juggler.add(tween);
		}

		private function setAlign(inTarget:DisplayObject):void {
			inTarget.x = stage.stageWidth &amp;gt;&amp;gt; 1;
			inTarget.y = stage.stageHeight &amp;gt;&amp;gt; 1;
		}

		public override function dispose():void {
			removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
			super.dispose();
		}
	}
}
&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-596-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-596-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-596-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align:right; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=jasu.tistory.com/596&amp;amp;layout=button_count&amp;amp;show_faces=true&amp;amp;width=90&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=dark&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:90px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
</description>
			<category>Framework</category>
			<category>ActionScript</category>
			<category>actionscript 3.0</category>
			<category>Adobe</category>
			<category>AS3</category>
			<category>BitmapData</category>
			<category>flash</category>
			<category>Flash Player 11</category>
			<category>FP11</category>
			<category>framework</category>
			<category>simulateMultitouch</category>
			<category>Starling</category>
			<category>Touch</category>
			<category>TouchEvent</category>
			<category>vector</category>
			<category>액션스크립트</category>
			<category>플래시</category>
			<author>jasu jasu</author>
			<guid>http://jasu.tistory.com/596</guid>
			<comments>http://jasu.tistory.com/596#entry596comment</comments>
			<pubDate>Tue, 10 Jan 2012 14:39:01 +0900</pubDate>
		</item>
		<item>
			<title>[Starling-09] Starling의 Button 클래스 사용</title>
			<link>http://jasu.tistory.com/595</link>
			<description>Starling은 버튼을 쉽게 구현할 수 있도록 Button 클래스가 포함되어 있다. Button 클래스는 DisplayObjectContainer 클래스의 서브 클래스다. 따라서 모든 표시 객체를 자식으로 가질 수 있지만 보통은 스킨 이미지와 제목을 표시한다. 그리고 버튼 클릭을 알리는 기능이 있다.
&lt;br /&gt;
&lt;br /&gt;
아래가 Button의 생성자다. 첫 번째 인수는 버튼에 대한 스킨이 되는 텍스처이고 옵션으로, 두 번째 인수에 제목을, 3번 째 인수에는 누를 때 표시할 텍스처를 지정할 수 있다. 

&lt;pre class=&quot;brush:as3&quot;&gt;Button(upState:Texture, text:String = &quot;&quot;, downState:Texture=null)
&lt;/pre&gt;

&lt;br /&gt;
Flash Professional에서 만든 버튼과 달리, &quot;오버&quot; 스킨은 지정할 수 없다. 아마도 이것은 터치 장치의 이용을 전제로 하고 있기 때문이라고 생각된다.

&lt;br /&gt;
&lt;br /&gt;
버튼을 클릭하면 (또는 탭하면) triggered라는 이벤트가 발생한다. 클릭시 실행하고 싶은 처리는 triggered 이벤트 리스너 함수에 작성한다.

아래는 그 예제다. 텍스처 포함 관련 부분은 여러번 나왔기 때문에 생략한다.

 &lt;pre class=&quot;brush:as3&quot;&gt;import starling.display.Button;
	import starling.events.Event;

	private var myButton:Button;

	private function onAddedToStage(e:Event):void {
		var myBitmap:Bitmap = new MyBitmap  ;
		var myTexture:Texture = Texture.fromBitmap(myBitmap);

		// 텍스처를 지정하여 단추의 객체를 생성
		myButton = new Button(myTexture);

		// triggered 이벤트 수신기를 추가
		myButton.addEventListener(Event.TRIGgered, onTriggered);
	}

	private function onTriggered(e:Event):void {
		// 이벤트를 발생 개체를 가져
		trace(e.target);
	}
&lt;/pre&gt;

&lt;br /&gt;
Staring 이벤트는 Flash Player의 이벤트처럼 버블링(표시 목록 계층 간에 전파, 자식에서 부모 방향으로만 지원) 하는 여러 버튼을 사용할 때는 triggered 이벤트를 부모 객체에서 처리하는 것도 가능하다.
&lt;br /&gt;

&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;스킨 지정
&lt;/b&gt;&lt;br /&gt;
Starling 버튼은 터치하면 (또는 버튼에 마우스가 눌러진 상태가 되면), 버튼의 표시 크기가 조금 작아진다. 손가락을 떼면 원래 크기로 돌아간다. 이 것은 버튼에 표준 텍스처 하나만 지정된 경우의 동작이다. 버튼을 눌린 상태에 해당하는 텍스처를 지정하면 텍스처가 작아지는 대신 스킨이 바뀐다.

&lt;br /&gt;
&lt;br /&gt;
이 두 텍스처는 생성자에 지정할 수 있지만 나중에 속성에서도 설정할 수 있다. 아래가 속성 목록이다.

&lt;br /&gt;
&lt;br /&gt;
upState : 버튼이 터치되지 않은 상태로 표시되는 텍스처
&lt;br /&gt;
downState : 버튼이 터치되는 상태로 표시되는 텍스처
&lt;br /&gt;
scaleWhenDown : 터치되어있는 상태 텍스처의 표시 비율
&lt;br /&gt;
&lt;br /&gt;
upState과 downState가 각 상태로 표시하는 텍스처를 설정하는 속성이다. (upState는 생성자에서 지정 필수) 성능의 관점에서 어느 텍스처도 같은 텍스처 아틀라스에 있는 것이 바람직할 것이다. 마지막 scaleWhenDown는 0에서 1 사이의 숫자를 지정한다. 이 값은 downState = null의 경우에만 사용할 수 있다.

&lt;br /&gt;
&lt;br /&gt;
위에서도 썼지만, 단순한 장식 추가가 필요한 경우, 2 개의 텍스처 이외에도 항시 표시 객체를 추가할 수 있다. 만약 동작을 변경하려면, 커스텀 버튼 클래스를 만드는 편이 빠를지도 모른다.
&lt;br /&gt;

&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;텍스트 표시
&lt;/b&gt;&lt;br /&gt;
Starling의 버튼은 텍스처로 지정한 이미지에 텍스트를 표시할 수 있다. 텍스트는 생성자에서 지정하거나 인스턴스 생성 후, text 속성에 설정한다. textBounds 속성을 사용하여 텍스트의 위치를​​ 지정할 수도 있다. &lt;br /&gt;

&lt;br /&gt;
text : 버튼에 표시되는 텍스트
&lt;br /&gt;
textBounds : 텍스트 표시 영역을 Rectangle로 지정

&lt;br /&gt;
&lt;br /&gt;
텍스트 표시에 사용할 글꼴의 모양을 설정하는 속성도 있다. 거의 TextField의 경우와 동일하다.

&lt;br /&gt;
&lt;br /&gt;
fontName : 텍스트 표시에 사용할 글꼴 이름
&lt;br /&gt;
fontSize : 텍스트 표시에 사용할 글꼴의 크기
&lt;br /&gt;
fontColor : 글꼴 색상
&lt;br /&gt;
fontBold : 글꼴을 굵게 표시 여부를 지정
&lt;br /&gt;
&lt;br /&gt;
포함된 글꼴과 비트맵 글꼴을 사용할 수 있다.
&lt;br /&gt;

&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;버튼 비활성화
&lt;/b&gt;&lt;br /&gt;
버튼을 사용할 수 없는 상태라면 enabled 속성의 값을 false로 적용한다.
&lt;br /&gt;
&lt;br /&gt;
enabled : 버튼을 사용할 수 있는지 여부를 지정
&lt;br /&gt;
alphaWhenDisabled : 버튼이 비활성화 때 알파 값

&lt;br /&gt;
&lt;br /&gt;
기본적으로 단추를 비활성화하면 버튼의 표시가 반투명하게 된다. 그 때 사용되는 알파 값은 alphaWhenDisabled에 설정된 값이다.
&lt;br /&gt;

&lt;br /&gt;
&lt;br /&gt;
원본 : &lt;a href=&quot;http://cuaoar.jp/2012/01/starling-button.html&quot; target=&quot;_blank&quot; title=&quot;[http://cuaoar.jp/2012/01/starling-button.html]로 이동합니다.&quot;&gt;http://cuaoar.jp/2012/01/starling-button.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;br /&gt;&lt;div&gt;
&lt;object classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,12,36&quot; id=&quot;jasudev&quot; width=&quot;700&quot; height=&quot;360&quot;&gt;&lt;param name=&quot;bgcolor&quot; value=&quot;#000000&quot; /&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.ifacies.com/blog/sample09.swf&quot; /&gt;&lt;param name=&quot;wmode&quot; value=&quot;direct&quot; /&gt;&lt;param name=&quot;allowFullscreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot; /&gt;&lt;embed src=&quot;http://www.ifacies.com/blog/sample09.swf&quot; type=&quot;application/x-shockwave-flash&quot; name=&quot;jasudev&quot; allowScriptAccess=&quot;always&quot; allowFullscreen=&quot;true&quot; wmode=&quot;direct&quot; width=&quot;700&quot; height=&quot;360&quot; bgcolor=&quot;#000000&quot; /&gt;&lt;/object&gt;&lt;/div&gt;
&lt;br /&gt;&lt;div&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;package {
	import starling.events.Event;
	import starling.core.Starling;
	import starling.display.Sprite;
	import starling.display.Button;
	import starling.textures.Texture;
	import starling.display.DisplayObject;
	import flash.geom.Rectangle;
	import flash.display.Bitmap;

	public class Demo extends Sprite {

		[Embed(source=&quot;icon128.png&quot;)]
		private var MyBitmap:Class;
		
		private var myButton:Button;

		public function Demo() {
			// addedToStage 이벤트에 대한 리스너 추가
			addEventListener( Event.ADDED_TO_STAGE , onAddedToStage);
		}


		private function onAddedToStage(e:Event):void {
			var myBitmap:Bitmap = new MyBitmap() as Bitmap;
			var myTexture:Texture = Texture.fromBitmap(myBitmap);

			// 텍스처를 지정하여 단추의 객체를 생성
			myButton = new Button(myTexture);
			
			// 터치 상태일 때, 텍스처의 표시 비율
			myButton.scaleWhenDown = 0.95;
			
			myButton.fontColor = 0xFFFFFF;
			myButton.fontBold = true;
			myButton.fontSize = 24;
			myButton.text = &quot;BUTTON&quot;;
			myButton.textBounds = new Rectangle(myButton.width-60&amp;gt;&amp;gt;1, 85, 60, 30);
			
			// 
			addChild(myButton);
			setAlign(myButton);
			
			// triggered 이벤트 수신기를 추가
			myButton.addEventListener(Event.TRIGGERED, onTriggered);
		}

		private function onTriggered(e:Event):void {
			// 이벤트를 발생 개체를 가져
			trace(e.target);
			myButton.fontColor = Math.random()*0xFFFFFF;
		}

		private function setAlign(inTarget:DisplayObject):void {
			inTarget.x = stage.stageWidth - inTarget.width &amp;gt;&amp;gt; 1;
			inTarget.y = stage.stageHeight - inTarget.height &amp;gt;&amp;gt; 1;
		}

		public override function dispose():void {
			removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
			super.dispose();
		}
	}
}
&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-595-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-595-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-595-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align:right; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=jasu.tistory.com/595&amp;amp;layout=button_count&amp;amp;show_faces=true&amp;amp;width=90&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=dark&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:90px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
</description>
			<category>Framework</category>
			<category>ActionScript</category>
			<category>actionscript 3.0</category>
			<category>Adobe</category>
			<category>alphaWhenDisabled</category>
			<category>AS3</category>
			<category>BitmapData</category>
			<category>button</category>
			<category>downState</category>
			<category>flash</category>
			<category>scaleWhenDown</category>
			<category>Skin</category>
			<category>Starling</category>
			<category>TextField</category>
			<category>triggered</category>
			<category>upstate</category>
			<category>비트맵</category>
			<category>아틀라스</category>
			<category>액션스크립트</category>
			<category>텍스처</category>
			<category>플래시</category>
			<author>jasu jasu</author>
			<guid>http://jasu.tistory.com/595</guid>
			<comments>http://jasu.tistory.com/595#entry595comment</comments>
			<pubDate>Mon, 09 Jan 2012 11:22:13 +0900</pubDate>
		</item>
		<item>
			<title>[Starling-08] Starling에서 TextFiled의 사용</title>
			<link>http://jasu.tistory.com/594</link>
			<description>Starling에서는 문자를 표시하기 위해 TextField 라는 클래스가 제공하고 있다. 글꼴 종류, 크기, 색상, 위치 등을 지정하여 텍스트를 화면에 표시할 수 있다.

&lt;br /&gt;
&lt;br /&gt;
그렇다고해도, GPU에서 직접 글꼴을 취급할 수는 없다. 사실, 뒤에서 Flash Player의 TextFiled를 사용하여 CPU에서 그린 것을 비트맵화 하여 GPU에 업로드하는 형식으로 사용한다. 즉, Starling의 TextField가 제공하는 것은 주어진 텍스트 및 글꼴에서 동적으로 텍스처를 생성하는 기능인 것이다. 따라서 커서가 표시되는 입력 텍스트와 같이 문자를 선택하는 등의 작업은 할 수 없다.(비트맵이므로)

&lt;br /&gt;
&lt;br /&gt;
또한, 동적으로 생성할 이유가 없는 텍스트는 TextField를 사용하는 것보다는 사전에 텍스처로 준비하여 사용하는 것이 효율적이다. &lt;br /&gt;


&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;TextField 인스턴스 생성
&lt;/b&gt;&lt;br /&gt;
아래는 TextField의 ​​생성자 정의를 보여준다. 표시 영역의 너비와 높이, 표시할 텍스트의 3개의 인수가 필요하다.

&lt;pre class=&quot;brush:as3&quot;&gt;TextField (width:int, height:int, text:String, fontName:String = &quot;Verdana&quot;, fontSize:Number=12,
  color:uint=0x0, bold:Boolean=false);&lt;br /&gt;
//&lt;/pre&gt;

&lt;br /&gt;
어떤 값을 나중에 변경할 수 있지만 효율 측면에서 너비와 높이를 바꾸지 않는 것이 좋다.
아래는 Hello World를 표시하는 예제다. 글꼴 크기와 색상을 인스턴스 생성 후에 지정하고 있다.

&lt;pre class=&quot;brush:as3&quot;&gt;import starling.text.TextField;

	private var myTextField:TextField;

	private function onAddedToStage(e:Event):void {
		// TextField 인스턴스를 생성
		myTextField = new TextField(160,80,&quot;Hello World&quot;);

		// TextField 인스턴스에 속성을 지정
		myTextField.fontSize = 16;
		myTextField.color = 0x993333;
		myTextField.border = true;

		addChild(myTextField);
	}
&lt;/pre&gt;

&lt;br /&gt;
border 속성 값을 true로 하면 TextField 영역을 눈으로 확인할 수 있기 때문에 개발시 유용하다. Starling의 TextField에는 지정된 너비와 높이에서 텍스트를 초과하지 않게 글꼴 크기를 자동 조정하는 편리한 기능이 있다.

&lt;pre class=&quot;brush:as3&quot;&gt;myTextField.autoScale = true;
&lt;/pre&gt;

&lt;br /&gt;
TextField 객체의 autoScale 속성을 true로 설정하면 전체 텍스트 표시가 글꼴 크기 지정보다 우선한다. 


Starling 유용한 클래스
Starling은 색상을 지정하는 Color라는 유용한 클래스가 있다. TextField의 color 속성의 지정에 사용할 수 있다.

&lt;pre class=&quot;brush:as3&quot;&gt;import starling.utils.Color;
 
myTextField.color = Color.AQUA;
&lt;/pre&gt;

&lt;br /&gt;
또한 텍스트 배치 값을 가진 클래스도 있다. 세로 배치는 HAlign, 가로 배치는 VAligin 다.

&lt;pre class=&quot;brush:as3&quot;&gt;import starling.utils.HAlign ;
import starling.utils.VAlign ;
 
// TextField의 ​​왼쪽을 기준으로 문자를 배치
myTextField.hAlign = HAlign.LEFT;
myTextField.vAlign = VAlign.TOP;

&lt;/pre&gt;HAlign에 정의되어 있는 값은 LEFT, CENTER, RIGHT 이렇게 3 종류이고 VAlign에  정의되어 있는 값은, TOP, CENTER, BOTTOM 이렇게 3 종류다.


글꼴 포함
Starling의 TextField에서 포함된 TrueType 글꼴 이용이 가능하다. 글꼴을 포함하면 표시 결과가 실행 환경에 의존하지 않기 때문에 권장한다. 다음은 글꼴 포함된 샘플이다. Ubuntu라는 글꼴을 포함하고 있다.

&lt;pre class=&quot;brush:as3&quot;&gt;[Embed(source=&quot;Ubuntu-R.ttf&quot;,embedAsCFF=&quot;false&quot;, fontFamily=&quot;Ubuntu&quot;)]
	private static const UbuntuRegular:Class;

	private function onAddedToStage(e:Event):void {
		myTextField = new TextField(160,80,&quot;Hello World&quot;,&quot; Ubuntu &quot;,16);
		myTextField.color = 0x993333;
		addChild(myTextField);
	}
&lt;/pre&gt;
&lt;br /&gt;
Embed 지정 시에는 embedAsCFF 계정은 필수다.


비트맵 글꼴 사용
Starling의 TextField에서 비트맵 글꼴을 사용할 수 있다. 비트맵 글꼴은 문자를 비트맵으로 내보낸 것이다. 개별 문자 파일의 위치 정보 등은 별도 XML 형식으로 작성한다. XML 파일은 다음과 같은 형식으로되어 있다. 기본 정보, 문자 코드와 텍스처 관련, 그리고 옵션으로 커닝 정보다.

&lt;pre class=&quot;brush:xml&quot;&gt;&lt;font&gt;
  &lt;info face=&quot;Desyrel&quot; size=&quot;35&quot;&gt;
  &lt;common lineheight=&quot;40&quot;&gt;
  &lt;pages&gt;
    &lt;page id=&quot;0&quot; file=&quot;desyrel.png&quot;&gt;
  &lt;/page&gt;&lt;/pages&gt;
  &lt;chars&gt;
    &lt;char id=&quot;48&quot; x=&quot;23&quot; y=&quot;1&quot; width=&quot;24&quot; height=&quot;23&quot; xoffset=&quot;3&quot; yoffset=&quot;13&quot; xadvance=&quot;23&quot;&gt;
    &lt;char id=&quot;49&quot; x=&quot;48&quot; y=&quot;1&quot; width=&quot;12&quot; height=&quot;23&quot; xoffset=&quot;3&quot; yoffset=&quot;12&quot; xadvance=&quot;12&quot;&gt;
  &lt;/char&gt;&lt;/char&gt;&lt;/chars&gt;
  &lt;kernings&gt; 
    &lt;kerning first=&quot;83&quot; second=&quot;8​​3&quot; amount=&quot;-4&quot;&gt;
  &lt;/kerning&gt;&lt;/kernings&gt;
&lt;/common&gt;&lt;/info&gt;&lt;/font&gt;
&lt;/pre&gt;

&lt;br /&gt;
이러한 비트맵 글꼴 정보는 BitmapFont 클래스에 로드한다. 다음은 그 절차다. 먼저 각각의 파일을 포함한다. 여기는 텍스처 아틀라스와 동일한 절차다.

&lt;pre class=&quot;brush:as3&quot;&gt;[Embed (source=&quot;desyrel.png&quot;)]
private static const DesyrelTexture:Class;
 
[Embed (source = &quot;desyrel.fnt&quot;mimeType = &quot;application / octet - stream&quot;)]
private static const DesyrelXml:Class;
&lt;/pre&gt;

다음 BitmapFont 객체를 생성한다.

&lt;pre class=&quot;brush:as3&quot;&gt;import starling.text.BitmapFont;
	import starling.textures.Texture;

	private function onAddedToStage(e:Event):void {
		
		// 비트맵 글꼴로드
		var texture:Texture = Texture.fromBitmap(new DesyrelTexture);
		
		// 문자 정보 가져오기
		var xml:XML = XML(new DesyrelXml);

		// BitmapFont 인스턴스 생성
		var myBitmapFont:BitmapFont = new BitmapFont(texture,xml);

		//... 앞으로는 아래에 계속
	}
&lt;/pre&gt;

&lt;br /&gt;
생성한 BitmapFont객체는 사용하기 전에 registerBitmapFont() 메소드를 통해서 TextField 클래스에 등록한다. (registerBitmapFont()는 정적 메서드다)

그 후, TextField의 ​​fontName 속성에 비트맵 글꼴의 이름을 설정하면 표시된다. 글꼴 이름은 BitmapFont 객체의 name 속성에서 가져올 수 있다.

&lt;pre class=&quot;brush:as3&quot;&gt;import starling.text.TextField;
	private function onAddedToStage(e:Event):void {
		//... 위에서 계속

		// TextField 클래스 비트맵 글꼴을 등록
		TextField.registerBitmapFont(myBitmapFont);

		// TextField 인스턴스를 생성;
		myTextField = new TextField(300,150,&quot;Hello World&quot;);

		// 비트맵 폰트의 폰트 이름을 설정
		myTextField.fontName = myBitmapFont.name;

		addChild(myTextField);
	}
&lt;/pre&gt;

&lt;br /&gt;
필요하지 않은 비트맵 글꼴은 unregisterBitmapFont() 메소드로 등록을 삭제할 수 있다. 인수에는 삭제할 글꼴 이름을 지정한다. 이 때 삭제된 BitmapFont 대해 dispose()가 실행된다. 이것을 피하고 싶은 경우에는 두 번째 인수에 false를 지정한다.

&lt;pre class=&quot;brush:as3&quot;&gt;TextField.unregisterBitmapFont (myBitmapFont.name, false );
&lt;/pre&gt;

&lt;br /&gt;
비트맵 글꼴 텍스처는 독립적인 파일이 아닌 일반 텍스처 아틀라스와 함께 파일에 추가하는 형태로 사용할 수 있다. 이는 텍스처 전환을 줄일 수 있다.


비트맵 글꼴 표시 설정
비트맵 글꼴을 제작시의 크기로 표시하고 싶을 때는 TextField 객체의 fontSize 속성 BitmapFont.NATIVE_SIZE를 지정한다. 

&lt;pre class=&quot;brush:as3&quot;&gt;// 비트맵 글꼴의 원래 크기로 보기
myTextField.fontSize = BitmapFont.NATIVE_SIZE ;
&lt;/pre&gt;

&lt;br /&gt;
또한 비트맵 글꼴을 제작시 모양으로 표시하고 싶을 때는 TextField 객체의 fontSize 속성 Color.WHITE을 지정한다.

&lt;pre class=&quot;brush:as3&quot;&gt;// 비트맵 글꼴 텍스처 그대로보기
myTextField.color = Color.WHITE ;
&lt;/pre&gt;

&lt;br /&gt;
color 속성의 기본 값은 아무 것도 지정하지 않으면 검은색 텍스트가 렌더링된다. 마지막으로 비트맵 글꼴의 제작에는 다음과 같은 것을 권장하고 있다.
&lt;br /&gt;
&lt;br /&gt;
Windows : Bitmap Font Generator (Angel Code : 무료)
&lt;br /&gt;
Mac OS : Glyph Designer (71squared : 유료)



&lt;br /&gt;

&lt;br /&gt;
&lt;br /&gt;
원본 : &lt;a href=&quot;http://cuaoar.jp/2011/12/starling-textfiled.html&quot; target=&quot;_blank&quot; title=&quot;[http://cuaoar.jp/2011/12/starling-textfiled.html]로 이동합니다.&quot;&gt;http://cuaoar.jp/2011/12/starling-textfiled.html&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(51, 51, 51); -webkit-text-decorations-in-effect: none; &quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;div&gt;&lt;object classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,12,36&quot; id=&quot;jasudev&quot; width=&quot;700&quot; height=&quot;360&quot;&gt;&lt;param name=&quot;bgcolor&quot; value=&quot;#000000&quot; /&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.ifacies.com/blog/sample08.swf&quot; /&gt;&lt;param name=&quot;wmode&quot; value=&quot;direct&quot; /&gt;&lt;param name=&quot;allowFullscreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot; /&gt;&lt;embed src=&quot;http://www.ifacies.com/blog/sample08.swf&quot; type=&quot;application/x-shockwave-flash&quot; name=&quot;jasudev&quot; allowScriptAccess=&quot;always&quot; allowFullscreen=&quot;true&quot; wmode=&quot;direct&quot; width=&quot;700&quot; height=&quot;360&quot; bgcolor=&quot;#000000&quot; /&gt;&lt;/object&gt;&lt;/div&gt;
&lt;br /&gt;&lt;div&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;package {
	import starling.events.Event;
	import starling.core.Starling;
	import starling.display.Sprite;
	import starling.text.TextField;

	public class Demo extends Sprite {

		private var _myTextField:TextField;

		public function Demo() {
			// addedToStage 이벤트에 대한 리스너 추가
			addEventListener( Event.ADDED_TO_STAGE , onAddedToStage);
		}
		private function onAddedToStage(e:Event):void {

			// TextField 인스턴스를 생성

			var len:int = 50;
			for (var i:int = 0; i&amp;lt;len; i++) {
				var myTextField = new TextField(160,80,&quot;Hello World 한글&quot; + i);

				// TextField 인스턴스에 속성을 지정
				myTextField.fontSize = 16;
				myTextField.color = Math.random()*0xFF0000+i;
				myTextField.border = true;

				addChild(myTextField);

				myTextField.x = stage.stageWidth &amp;gt;&amp;gt; 1;
				myTextField.y = stage.stageHeight &amp;gt;&amp;gt; 1;

				myTextField.alpha =  0.20;
				myTextField.rotation = i;
			}

			_myTextField = new TextField(160,80,&quot;Hello World&quot;);
			_myTextField.fontSize = 24;
			_myTextField.color = 0xFFFFFF;
			//_myTextField.border = true;
			
			addChild(_myTextField);
			setAlign(_myTextField);

		}

		private function setAlign(inTarget:TextField):void {
			inTarget.x = stage.stageWidth - inTarget.width &amp;gt;&amp;gt; 1;
			inTarget.y = stage.stageHeight - inTarget.height &amp;gt;&amp;gt; 1;
		}

		public override function dispose():void {
			removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
			super.dispose();
		}
	}
}
&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;&amp;nbsp;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-594-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-594-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-594-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align:right; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=jasu.tistory.com/594&amp;amp;layout=button_count&amp;amp;show_faces=true&amp;amp;width=90&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=dark&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:90px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
</description>
			<category>Framework</category>
			<category>ActionScript</category>
			<category>actionscript 3.0</category>
			<category>Adobe</category>
			<category>AS3</category>
			<category>BitmapData</category>
			<category>flash</category>
			<category>Starling</category>
			<category>TextField</category>
			<category>액션스크립트</category>
			<category>플래시</category>
			<author>jasu jasu</author>
			<guid>http://jasu.tistory.com/594</guid>
			<comments>http://jasu.tistory.com/594#entry594comment</comments>
			<pubDate>Mon, 09 Jan 2012 10:27:56 +0900</pubDate>
		</item>
		<item>
			<title>[Starling-07] MovieClip 클래스를 이용한 애니메이션</title>
			<link>http://jasu.tistory.com/593</link>
			<description>Flash에서 애니메이션이라고 하면 역시 MovieClip이지만 Starling에도 MovieClip 클래스가 있다. 물론 애니메이션을 위한 클래스지만 Starling의 MovieClip은 화면에 표시할 수 있는 것이 비트맵 이미지 또는 색상을 지정한 사각형 뿐이다. 따라서 MovieClip라는 이름은 같지만 Starling의 MovieClip은 프레임마다 할당된 비트맵을 표시하는 클래스인 것이다.

&lt;br /&gt;
&lt;br /&gt;
또한 Starling MovieClip의 자식 객체를 관리하거나 프레임에 스크립트가 들어가는 기능은 없다. 이 점도 Flash Player의 MovieClip과는 크게 다르다. (Starling은 표시 목록의 관리는 Sprite의 책임이다. 한편, MovieClip은 Image 클래스에 타임 라인 기능을 더한 Image의 서브 클래스다. MovieClip이 Sprite의 하위 클래스인 Flash Player와는 달리, 양쪽의 역할은 분리되어 있다.)

&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;스프라이트 시트와 TextureAtlas
&lt;/b&gt;&lt;br /&gt;
MovieClip의 각 프레임을 볼 때 GPU는 표시 프레임에 할당된 텍스처, 셰이더에서 사용할 수 있도록 준비가 이루어진다. 이 때 텍스처가 프레임마다 물리적으로 다른 비트맵 파일이면 프레임을 진행할 때마다 텍스처 전환이 발생한다.

&lt;br /&gt;
&lt;br /&gt;
텍스처 전환 처리에는 당연히 시간이 걸린다. 또한 텍스처의 GPU에 업로드가 필요할 때 추가 오버헤드가 증가한다. 일반적으로 이 문제를 해결하기 위해 각 프레임의 텍스처를 하나의 파일에 정의한다. 이 것을 스프 라이트 시트라고 &amp;nbsp;한다.

&lt;br /&gt;
&lt;br /&gt;
아래 그림은 Starling 샘플에 포함된 스프라이트 시트의 일부를 자른 것이다.
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;p style=&quot;margin:0&quot;&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://cfile6.uf.tistory.com/original/16279A474F05C86B09D04A&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile6.uf.tistory.com/image/16279A474F05C86B09D04A&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;spritesheetsample.jpg&quot; height=&quot;157&quot; width=&quot;349&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;br /&gt;
여러 프레임에 해당하는 텍스처가 1개의 파일로 되어 있으면 GPU를 이용해서 사용 위치를 바꾸는 것만으로 텍스처 자체를 전환하지 않고 렌더링 처리가 가능하다. 따라서 고속 프레임을 업데이트할 수 있다.
&lt;br /&gt;
&lt;br /&gt;
또한 Stage3D에서 취급할 수 있는 텍스처의 폭은 2의 계승이라는 규칙 때문에, 그 이외의 너비 텍스처는 Starling 내부에 여분의 사전 처리가 발생한다. 하지만 스프라이트 시트의 경우 표시되는 텍스처가 더 큰 텍스처(스프라이트시트)가 아니기 때문에 개별 텍스처 너비 사이즈를 걱정할 필요가 없다.

&lt;br /&gt;
&lt;br /&gt;
이 것을 최적화한 1단계가 TextureAtlas다. TextureAtlas는 여러 스프라이트시트를 하나의 파일에 정리한 것이다. 동시에 여러 애니메이션을 재생하는 경우 특히 유용하다.

TextureAtlas를 만들기 위해, 차기 버전의 Flash Professional CS6에서 지원되는 것 같다. 벡터 애니메이션 스프라이트시트로 내보내기 기능을 기다리거나 Texture Packer 등의 도구를 이용하면 된다. &lt;br /&gt;


&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;TextureAtlas 로드
&lt;/b&gt;&lt;br /&gt;
TextureAtlas를 사용하여 프레임마다 각각 TextureAtlas의 어떤 영역을 표시할지 정보가 필요하다. 따라서 다음과 같은 형식으로 각 프레임의 텍스처 정보를 지정하게 되어 있다. 도구를 사용하여 TextureAtlas를 생성하는 경우 이러한 XML 파일도 동시에 생성된다.

&lt;pre class=&quot;brush:xml&quot;&gt;&lt;textureatlas imagepath=&quot;atlas.png&quot;&gt;
  &lt;subtexture name=&quot;walk_0&quot; x=&quot;0&quot; y=&quot;0&quot; height=&quot;150.5&quot; width=&quot;87.0&quot;&gt;&lt;/subtexture&gt;
  &lt;subtexture name=&quot;walk_1&quot; x=&quot;88&quot; y=&quot;0&quot; height=&quot;150.5&quot; width=&quot;87.0&quot;&gt;&lt;/subtexture&gt;
  &lt;subtexture name=&quot;walk_2&quot; x=&quot;176&quot; y=&quot;0&quot; height=&quot;150.5&quot; width=&quot;87.0&quot;&gt;&lt;/subtexture&gt;
  &lt;subtexture name=&quot;walk_3&quot; x=&quot;264&quot; y=&quot;0&quot; height=&quot;150.5&quot; width=&quot;87.0&quot;&gt;&lt;/subtexture&gt;
&lt;/textureatlas&gt;
&lt;/pre&gt;

&lt;br /&gt;
TextureAtlas 태그 imagePath 속성은 TextureAtlas의 파일 이름이다. 
SubTexutre 태그의 name 속성은 애니메이션의 고유 이름 뒤에 프레임 번호를 추가한 것이다. 나머지 x, y, height, width에서 텍스처로 사용 영역을 지정한다. (실제로 SubTexture는 텍스처의 일부를 처리하는 클래스가 있다)

TextureAtlas가 준비되면 다음과 같은 프로그램에 포함한다.

&lt;pre class=&quot;brush:as3&quot;&gt;[Embed (source = &quot;atlas.png&quot;)]
private static const MyBitmap:Class;
 
[Embed (source = &quot;atlas.xml&quot;mimeType = &quot;application / octet - stream&quot;)]
private static const MyXml:Class;
&lt;/pre&gt;

&lt;br /&gt;
이러한 정보는 TextureAtlas라는 클래스에서 함께 관리한다. TextureAtlas(PNG 파일)은 일단 Texture 클래스 로딩하면서 XML 파일과 함께 TextureAtras 생성자에 전달한다.

TextureAtlas 객체에서 고유 이름을 지정하여 Texture(실제로는 SubTexture의) 벡터를 얻을 수 있다. 이 때 사용하는 메소드가 getTextures()다.

&lt;pre class=&quot;brush:as3&quot;&gt;import starling.textures.TextureAtlas;

	private function onAddedToStage(e:Event):void {
		// 텍스처 아틀라스로드
		var myTexture:Texture = Texture.fromBitmap(new MyBitmap);
		// 텍스처 아틀라스의 영역 정보 가져오기
		var myXml:XML = XML(new MyXml);

		// TextureAtlas 인스턴스 생성
		var myTextureAtlas:TextureAtlas = new TextureAtlas(myTexture,myXml);
		// &quot;walk_&quot;를 식별 이름으로 가진 Texture 벡터 생성
		var frames:Vector.&lt;texture&gt; = myTextureAtlas.getTextures(&quot;walk_&quot;);

		// ... 앞으로는 아래에 계속
	}
&lt;/texture&gt;&lt;/pre&gt;
&lt;br /&gt;
벡터의 첫 번째 텍스처의 크기가 애니메이션의 영역을 결정한다.


애니메이션
여기까지 왔으면 나머지는 MovieClip의 인스턴스를 생성하면 된다. MovieClip 생성자의 인수에서 얻은 텍스처 벡터를 지정한다. 

&lt;pre class=&quot;brush:as3&quot;&gt;import starling.display.MovieClip;

	private var myMovieClip:MovieClip;

	private function onAddedToStage(e:Event):void {
		//... 위에서 계속

		// MovieClip 객체의 생성
		myMovieClip = new MovieClip(frames);

		// 애니메이션 재생 시작
		Starling.juggler.add(myMovieClip);
		addChild(myMovieClip);
	}
&lt;/pre&gt;

&lt;br /&gt;
알겠지만, Tween뿐만 아니라 MovieClip의 재생도 Juggler을 사용한다. MovieClip도 IAnimatable의 서브클래스다. Juggler에 MovieClip을 추가하면 재생이 시작된다. 재생을 제어하는​​ 세 가지 메소드가 포함되어 있다.

&lt;pre class=&quot;brush:as3&quot;&gt;myMovieClip.play();
myMovieClip.pause();
myMovieClip.stop();
&lt;/pre&gt;

&lt;br /&gt;
pause()를 실행한 다음에 play()를 실행하면 현재 상태부터 재생되지만 stop()을 실행한 다음에  play()를 호출하면 처음 부터 다시 재생된다. 애니메이션은 default로 반복 재생된다. 이 설정은 loop 속성을 설정하여 바꿀 수 있다. 재생 여부 isPlaying 속성을 확인한다.

애니메이션이 끝까지 재생되면 movieComplete 이벤트가 발생한다. 재생이 완​​료되면 다음 작업으로 이동하고자하는 경우에 사용할 수 있을 것이다.

&lt;pre class=&quot;brush:as3&quot;&gt;myMovieClip.addEventListener(Event.MOVIE_COMPLETED, onMovieComplete);
&lt;/pre&gt;

&lt;br /&gt;
애니메이션이 반복되는 경우에는 재생이 완​​료될 때마다 movieComplete 이벤트가 발생한다. MovieClip의 부모 Sprite가 Stage에서 제거되면 MovieClip 재생을 중지해야한다. 그래서 다음과 같은 코드를 추가한다.

&lt;pre class=&quot;brush:as3&quot;&gt;addEventListener(Event.REMOVED_FROM_STAGE,onRemovedFromStage);

	private function onRemovedFromStage(event:Event):void {
		Starling.juggler.remove(myMovieClip);
	}
&lt;/pre&gt;

&lt;br /&gt;
Juggler의 remove() 메소드는 MovieClip뿐만 아니라 Tween도 삭제할 수 있다.



또 다른 MovieClip 사용
MovieClip의 생성자의 두 번째 파라미터에 임의의 프레임 속도를 지정할 수 있다. 

&lt;pre class=&quot;brush:as3&quot;&gt;// 40 fps를 지정
myMovieClip = new MovieClip (frames, 40);
&lt;/pre&gt;

&lt;br /&gt;
MovieClip마다 다른 프레임 속도를 지정할 수 있다. 재생중인 프레임 속도는 fps 속성에서 가져올 수 있다. 또한 fps 속성 값을 설정하여 프레임 속도를 변경할 수도 있다.

그리고 모든 프레임에 대해 별도의 재생 시간을 지정할 수 있다. 아래는 5 번째 프레임을 2 초 동안 재생하도록 설정하는 예다.

&lt;pre class=&quot;brush:as3&quot;&gt;myMovieClip.setFrameDuration(5, 2);
&lt;/pre&gt;

&lt;br /&gt;
나중에 프레임을 추가하거나 삭제할 수도 있다. 이를 위해서 addFrameAt() removeFrameAt() 메서드를 사용한다. 아래는 5 프레임 애니메이션을 10번 째 프레임에 추가하거나 5 프레임을 제거하는 것이다.&amp;nbsp;&lt;pre class=&quot;brush:as3&quot;&gt;myMovieClip.addFrameAt(5, frames [10]);
myMovieClip.removeFrameAt(5);
&lt;/pre&gt;

&lt;br /&gt;
프레임의 텍스처를 바꿀 수도 있다. setFrameTexture() 메소드를 사용하면 된다. 

&lt;pre class=&quot;brush:as3&quot;&gt;myMovieClip.setFrameTexture(5, frames [10]);
&lt;/pre&gt;

&lt;br /&gt;
프레임에 소리를 연결할 수도 있다. setFrameSound() 메서드를 사용한다.

&lt;pre class=&quot;brush:as3&quot;&gt;[Embed (source = &quot;step.mp3&quot;)]

private static const StepSound:Class;
 
myMovieClip.setFrameSound (5, new StepSound() as Sound);
&lt;/pre&gt;

&lt;br /&gt;
이제 5번 째 프레임이 표시되는 타이밍에 지정한 소리가 재생된다. 프레임에 직접 스크립트를 연결할 수는 없다. 그 대신 Juggler.delayCall() 메서드를 사용할 수 있다.

이상에서 Starling 애니메이션의 기본은 끝이다. Starling 표현의 유연성은 CPU 렌더링보다 미약하다. 그러나 빠른 렌더링을 안정적으로 해야할 경우에 선택하면 적당할 것이다.

&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
원본 : &lt;a href=&quot;http://cuaoar.jp/2011/12/movieclip-starling.html&quot; target=&quot;_blank&quot; title=&quot;[http://cuaoar.jp/2011/12/movieclip-starling.html]로 이동합니다.&quot;&gt;http://cuaoar.jp/2011/12/movieclip-starling.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;div&gt;
&lt;object classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,12,36&quot; id=&quot;jasudev&quot; width=&quot;700&quot; height=&quot;360&quot;&gt;&lt;param name=&quot;bgcolor&quot; value=&quot;#000000&quot; /&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.ifacies.com/blog/sample07.swf&quot; /&gt;&lt;param name=&quot;wmode&quot; value=&quot;direct&quot; /&gt;&lt;param name=&quot;allowFullscreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot; /&gt;&lt;embed src=&quot;http://www.ifacies.com/blog/sample07.swf&quot; type=&quot;application/x-shockwave-flash&quot; name=&quot;jasudev&quot; allowScriptAccess=&quot;always&quot; allowFullscreen=&quot;true&quot; wmode=&quot;direct&quot; width=&quot;700&quot; height=&quot;360&quot; bgcolor=&quot;#000000&quot; /&gt;&lt;/object&gt;&lt;br /&gt;
&lt;br /&gt;&lt;div&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;package {
	import starling.events.Event;
	import starling.display.Sprite;
	import starling.display.DisplayObject;
	import starling.display.Image;
	import starling.textures.Texture;
	import starling.textures.RenderTexture;
	import starling.textures.TextureAtlas;
	import starling.display.MovieClip;
	import starling.core.Starling;

	public class Demo extends Sprite {

		[Embed(source = &quot;patch.png&quot;)]
		private var MyBitmap:Class;

		[Embed(source = &quot;patch.xml&quot;,mimeType = &quot;application/octet-stream&quot;)]
		private var MyXml:Class;
		
		private var _arrMovieClips:Array;


		public function Demo() {
			// addedToStage 이벤트에 대한 리스너 추가
			addEventListener(Event.ADDED_TO_STAGE,onAddedToStage);
		}
		private function onAddedToStage(e:Event):void {

			// 텍스처 아틀라스로드
			var myTexture:Texture = Texture.fromBitmap(new MyBitmap());

			// 텍스처 아틀라스의 영역 정보 가져오기
			var myXml:XML = XML(new MyXml());

			// TextureAtlas 인스턴스 생성
			var myTextureAtlas:TextureAtlas = new TextureAtlas(myTexture,myXml);

			// &quot;walk_&quot;를 식별 이름으로 가진 Texture 벡터 생성
			var frames:Vector.&amp;lt;Texture&amp;gt;=myTextureAtlas.getTextures(&quot;patch_&quot;);

			// MovieClip 객체의 생성
			
			_arrMovieClips = [];
			var count:int = 20;
			for(var i:int=0;i&amp;lt;count;i++){
				var myMovieClip = new MovieClip(frames, 60);
				myMovieClip.x = 20+((stage.stageWidth-90)/count)*i;
				myMovieClip.y = stage.stageHeight - myMovieClip.height &amp;gt;&amp;gt; 1;
				Starling.juggler.add(myMovieClip);
				_arrMovieClips.push(myMovieClip);
				addChild(myMovieClip);
				
			}
			
		//	myMovieClip.setFrameDuration(5, 2);

		//	myMovieClip.addFrameAt(5,frames[10]);
		//	myMovieClip.removeFrameAt(5);
		}

		private function setAlign(inTarget:DisplayObject):void{
			inTarget.x = stage.stageWidth &amp;gt;&amp;gt; 1;
			inTarget.y = stage.stageHeight &amp;gt;&amp;gt; 1;
		}

		public override function dispose():void {
			removeEventListener(Event.ADDED_TO_STAGE,onAddedToStage);
			super.dispose();
		}
	}
}
&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-593-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-593-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-593-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align:right; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=jasu.tistory.com/593&amp;amp;layout=button_count&amp;amp;show_faces=true&amp;amp;width=90&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=dark&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:90px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
</description>
			<category>Framework</category>
			<category>ActionScript</category>
			<category>actionscript 3.0</category>
			<category>Adobe</category>
			<category>AS3</category>
			<category>BitmapData</category>
			<category>flash</category>
			<category>framework</category>
			<category>movieclip</category>
			<category>Sprite</category>
			<category>Stage3D</category>
			<category>Starling</category>
			<category>Texture</category>
			<category>TextureAtlas</category>
			<category>비트맵</category>
			<category>아틀라스</category>
			<category>액션스크립트</category>
			<category>타임라인</category>
			<category>텍스처</category>
			<category>프로그래밍</category>
			<category>플래시</category>
			<author>jasu jasu</author>
			<guid>http://jasu.tistory.com/593</guid>
			<comments>http://jasu.tistory.com/593#entry593comment</comments>
			<pubDate>Mon, 09 Jan 2012 00:49:49 +0900</pubDate>
		</item>
		<item>
			<title>[Starling-06] 비트맵을 표시하는 방법</title>
			<link>http://jasu.tistory.com/592</link>
			<description>이번에는 비트맵(텍스처)을 표시하는 방법이다. Starling에서는 비트맵 또는 이전 포스트와 같이 사각형을 사용하여 화면을 구성한다. 기사의 뒷 부분에서 동적으로 텍스처 업데이트하는 방법도 소개한다. (참고 : 앞으로 내용에서 &quot;텍스처 = 비트맵&quot;으로 이해)

&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;
Image와 Texture 클래스&lt;/b&gt;
&lt;br /&gt;
Starling 프레임워크는 비트맵을 표시하기 위하여 Image를 사용한다. Image는 Quad의 서브클래스다. 따라서 Quad에서 비트맵 처리 기능을 추가한 것이 Image 클래스가 되는 것이다. Flash Player 표시 객체는 Bitmap에 BitmapData가 있지만 Starling에서는 Image에 Texture가 있다. Texture에 로드할 수 있는 이미지 포멧은 PNG, JPEG, JPEG-XR, ATF 이렇게 4 종류이다. 각 형식마다 전용 읽기 함수가 포함되어 있다. 

예를 들어, Bitmap 객체에서 Texture 객체를 만드는 경우 다음과 같다.

&lt;pre class=&quot;brush:as3&quot; style=&quot;color: rgb(51, 51, 51); &quot;&gt;var myTexture:Texture = Texture.fromBitmap(myBitmap);
&lt;/pre&gt;

&lt;br /&gt;
다음은 생성된 Texture에서 Image 객체를 생성하고 표시 목록에 추가하는 것만으로 화면에 비트맵이 표시된다. 아래는 myBitmap.png라는 파일을 표시하는 예제다. 포함된 비트맵 처리 부분을 제외하면 사각형을 표시하는 샘플 코드와 거의 동일하다.&lt;br /&gt;

&lt;pre class=&quot;brush:as3&quot;&gt;&lt;br /&gt;
package {
	import starling.events.Event;
	import starling.display.Sprite;
	import starling.display.Image;
	import starling.textures.Texture;
	import flash.display.Bitmap;

	public class Demo extends Sprite {
		// PNG 파일을 포함
		[Embed(source = &quot;icon128.png&quot;)]
		private var MyBitmap:Class;
		
		private var myImage:Image;

		public function Demo() {
			// addedToStage 이벤트에 대한 리스너 추가
			addEventListener( Event.ADDED_TO_STAGE , onAddedToStage);
		}
		private function onAddedToStage(e:Event):void {
			var myBitmap:Bitmap = new MyBitmap() as Bitmap;

			// Bitmap에서 Texture 오브젝트를 생성
			var myTexture:Texture = Texture.fromBitmap(myBitmap);

			// Image 객체를 생성
			myImage = new Image(myTexture);

			// 표시 목록에 추가
			addChild(myImage);
		}

		public override function dispose():void {
			removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
			super.dispose();
		}
	}
}
&lt;/pre&gt;

&lt;br /&gt;
Starling의 Texture는 가로와 세로 픽셀 수가 2층(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048)을 전제로하고 있는 것 같다. 다른 크기의 비트맵에서 Texture를 생성하면 Starling은 자동으로 가장 가까운 크기에 맞게 Texture를 다시 만든다.
&lt;br /&gt;


&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;
벡터 이미지를 텍스처로보기&lt;/b&gt;
&lt;br /&gt;
Flash Player 표시 객체는 벡터 데이터를 비트맵화 하는 기능을 가지고 있다. 이것을 이용하면 AS3 및 Flash Professional 기능을 사용하여 그린 벡터 이미지에서 Image 개체를 생성할 수 있다. 처리 효율을 생각하면 일부러 런타임에 비트맵을 생성하는 것보다는 사전에 비트맵화해 두는 것이 좋을 것이다. 따라서 이 방법은 동적으로 텍스처를 생성해야하는 경우에 필요하다.

구체적인 예를 소개한다. 아래는 Sprite의 graphic 특성에 그린 원을 텍스처로 변환하여 Image 객체로 화면에 표시하는 예제다.&lt;br /&gt;

&lt;pre class=&quot;brush:as3&quot;&gt;&lt;br /&gt;
private function onAddedToStage(e:Event):void{

		var radius:uint = 100;

		// Flash Player의 Sprite를 생성
		var shape : flash.display.Sprite = new flash.display.Sprite();

		// 임의의 색상을 결정 graphics 속성 원을 그린다
		var color:uint = Math.random() * 0xFFFFFF;
		shape.graphics.beginFill(color);
		shape.graphics.drawCircle(radius, radius, radius);
		shape.graphics.endFill();

		// Sprite를 BitmapData로 변환;
		var buffer : BitmapData = new BitmapData (radius * 2, radius * 2, true, color);
		buffer.draw(shape);

		// BitmapData에서 Texture를 생성
		var myTexture:Texture = Texture.fromBitmapData(buffer);
		// Texture에서 Image를 만듭니다
		myImage = new Image(myTexture);

		// 표시 목록에 추가
		addChild(myImage);
	}
&lt;/pre&gt;
&lt;br /&gt;
이 경우 코드에서 Flash Player 표시 객체를 사용하게되므로, Starling 표시 객체와 혼동하지 않도록 주의가 필요하다.
&lt;br /&gt;

&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;
동적 텍스처의 업데이트&lt;/b&gt;
&lt;br /&gt;
위의 방법을 사용하면 동적으로 생성한 비트맵을 볼 수 있다. 그러나 표시 비트맵을 업데이트하려면 벡터 이미지 만들기부터 다시 한다. 즉, CPU 그리기 및 GPU 렌더링이 모두 행해지는 것은 그다지 효율적 수단은 아닌 것 같다.(항상 피해야한다는 의미는 아니다.)

&lt;br /&gt;
&lt;br /&gt;

이럴 때는 RenderTexture 클래스가 유용하다. RenderTexture은 Texture의 서브 클래스에서, &quot;Starling 표시 객체&quot;를 기존의 Image 객체에 그리는 기능을 제공한다. 이는 GPU만을 사용하기 때문에 효율적이다. RenderTexture은 &quot;Flash Player 표시 객체&quot;를 취급하지 않기 때문에 이미 준비되어 있는 Image 객체를 비트맵으로 합성하는 방법이 기본이다. 특히 미리보기 그래픽을 알고 있는 경우에 유효하다.

RenderTexture 생성자는 그리기 영역의 크기만을 지정한다. 이 시점에서 RenderTexture 아직 새하얀(투명)상태다.다음으로 RenderTextire 인스턴스를 사용하여 Image의 인스턴스를 생성하는 단계로 위 코드에서 보았던 방식 그대로다.&lt;br /&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;&lt;br /&gt;
import starling.textures.RenderTexture;

	private var myRenderTexture:RenderTexture;

	private function onAddedToStage(e : Event):void {
		// RenderTexture 객체를 생성
		myRenderTexture = new RenderTexture(320,480);

		// RenderTexture에서 Image를 만든다
		var canvas:Image = new Image(myRenderTexture);

		// 표시 목록에 추가
		addChild(canvas);
	}
&lt;/pre&gt;
&lt;br /&gt;
이제 그리기 영역 지정이 완료되었다.

&lt;br /&gt;
다음은 RenderTexture를 업데이트하면 화면 표시도 자동으로 업데이트된다. RenderTexuture에 Starling의 표시 객체를 그리려면, draw() 메서드를 사용한다. 그릴 표시 객체는 위치, 비율, 각도, 알파를 지정할 수 있다. 아래 예제에서는 RenderTexture의 x 좌표와 y 좌표를 지정하고 있다.&lt;br /&gt;

&lt;pre class=&quot;brush:as3&quot;&gt;&lt;br /&gt;
myImage.x = 10;
myImage.y = 20;
myRenderTexture.draw(myImage);
&lt;/pre&gt;

&lt;br /&gt;
많은 표시 객체를 그리고 싶은 경우를 위해, drawBundled() 메소드도 포함되어 있다. 이것은 여러 표시 객체 그리기를 일괄적으로 실행하는 것으로, 처리 효율의 향상을 노린 것이다. GPU를 효율적으로 사용하기 위해서 GPU에 대한 그리기 요청 횟수를 줄이는 것은 중요하다. drawBundled()의 인수는 함수를 지정한다. 함수에서 draw()은 함께 처리된다.

아래는 이미지를 조금씩 회전시키는 예제다.&lt;br /&gt;

&lt;pre class=&quot;brush:as3&quot; style=&quot;color: rgb(51, 51, 51); &quot;&gt;myRenderTexture.drawBundled(rot);
	private function rot():void {
		var count:int = 30;
		var diff:Number = 2 * Math.PI / count;

		for (var i:int = 0; i &amp;lt; count; ++i) {
			myImage.rotation = diff * i;
			myRenderTexture.draw(myImage);
		}
	}
&lt;/pre&gt;

&lt;br /&gt;
행하면 아래와 같이된다. &lt;br /&gt;
&lt;br /&gt;
&lt;p style=&quot;color: rgb(51, 51, 51); margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://cfile7.uf.tistory.com/original/1341B04B4F05BCA2119BC4&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile7.uf.tistory.com/image/1341B04B4F05BCA2119BC4&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;renderingtexturesample.jpg&quot; height=&quot;288&quot; width=&quot;336&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
이미지는 Starling 샘플에 포함된 것을 사용했다.



RenderTexture에 그려진 내용을 모두 삭제하려면 clear() 메소드를 사용한다.&lt;br /&gt;


&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;
자원의 해제&lt;/b&gt;
&lt;br /&gt;
불필요하게 된 텍스처가 있는 경우에는 dispose()가 리소스를 해제한다. 특히 RenderTexture은 일시적인 이용이 많다고 생각되므로 잊지 말아야한다.

&lt;pre class=&quot;brush:as3&quot; style=&quot;color: rgb(51, 51, 51); &quot;&gt;public override function dispose():void {
		myRenderTexture.dispose();
		super.dispose();
	}
&lt;/pre&gt;



&lt;br /&gt;
원본 : &lt;a href=&quot;http://cuaoar.jp/2011/12/starling-flash-1.html&quot; target=&quot;_blank&quot; title=&quot;[http://cuaoar.jp/2011/12/starling-flash-1.html]로 이동합니다.&quot;&gt;http://cuaoar.jp/2011/12/starling-flash-1.html&lt;/a&gt;&lt;br /&gt;


&lt;div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;object classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,12,36&quot; id=&quot;jasudev&quot; width=&quot;700&quot; height=&quot;360&quot;&gt;&lt;param name=&quot;bgcolor&quot; value=&quot;#000000&quot; /&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.ifacies.com/blog/sample06.swf&quot; /&gt;&lt;param name=&quot;wmode&quot; value=&quot;direct&quot; /&gt;&lt;param name=&quot;allowFullscreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot; /&gt;&lt;embed src=&quot;http://www.ifacies.com/blog/sample06.swf&quot; type=&quot;application/x-shockwave-flash&quot; name=&quot;jasudev&quot; allowScriptAccess=&quot;always&quot; allowFullscreen=&quot;true&quot; wmode=&quot;direct&quot; width=&quot;700&quot; height=&quot;360&quot; bgcolor=&quot;#000000&quot; /&gt;&lt;/object&gt;&lt;/div&gt;
&amp;nbsp;&lt;br /&gt;
&lt;div&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;
package {
	import starling.events.Event;
	import starling.display.Sprite;
	import starling.display.Image;
	import starling.textures.Texture;
	import flash.display.BitmapData;
	import flash.display.Bitmap;
	import starling.textures.RenderTexture;

	public class Demo extends Sprite {

		[Embed(source = &quot;icon128.png&quot;)]
		private var MyBitmap:Class;

		private var myRenderTexture:RenderTexture;
		private var myImage:Image;

		public function Demo() {
			// addedToStage 이벤트에 대한 리스너 추가
			addEventListener( Event.ADDED_TO_STAGE , onAddedToStage);
		}
		private function onAddedToStage(e:Event):void {

			// RenderTexture 객체를 생성
			myRenderTexture = new RenderTexture(330,330);

			// RenderTexture에서 Image를 만든다
			var canvas:Image = new Image(myRenderTexture);

			canvas.x = stage.stageWidth- canvas.width &gt;&gt; 1;
			canvas.y = stage.stageHeight- canvas.height &gt;&gt; 1;
			// 표시 목록에 추가
			addChild(canvas);


			var myBitmap:Bitmap = new MyBitmap() as Bitmap;

			// Bitmap에서 Texture 오브젝트를 생성
			var myTexture:Texture = Texture.fromBitmap(myBitmap);

			// Image 객체를 생성
			myImage = new Image(myTexture);
			myImage.x = 165;
			myImage.y = 165;
			
			addEventListener(Event.ENTER_FRAME, run);

		}
		
		private function run(e:Event):void{
			myRenderTexture.drawBundled(rot);
		}

		private function rot():void {
			var count:int = 8;
			var diff:Number = (Math.random()*2) * Math.PI / count;

			for (var i:int = 0; i &lt; count; ++i) {
				myImage.rotation += diff * i;
				myRenderTexture.draw(myImage);
			}
		}

		public override function dispose():void {
			removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
			removeEventListener(Event.ENTER_FRAME, run);
			myRenderTexture.dispose();
			myImage.dispose();
			super.dispose();
		}
	}
}
&lt;/pre&gt;&lt;/div&gt;
&amp;nbsp;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-592-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-592-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-592-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align:right; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=jasu.tistory.com/592&amp;amp;layout=button_count&amp;amp;show_faces=true&amp;amp;width=90&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=dark&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:90px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
</description>
			<category>Framework</category>
			<category>ActionScript</category>
			<category>actionscript 3.0</category>
			<category>Adobe</category>
			<category>AS3</category>
			<category>BitmapData</category>
			<category>Dispose</category>
			<category>flash</category>
			<category>framework</category>
			<category>image</category>
			<category>RenderTexture</category>
			<category>Starling</category>
			<category>Texture</category>
			<category>액션스크립트</category>
			<category>플래시</category>
			<author>jasu jasu</author>
			<guid>http://jasu.tistory.com/592</guid>
			<comments>http://jasu.tistory.com/592#entry592comment</comments>
			<pubDate>Sun, 08 Jan 2012 04:49:46 +0900</pubDate>
		</item>
		<item>
			<title>[Starling-05] Tween 클래스를 이용한 애니메이션</title>
			<link>http://jasu.tistory.com/591</link>
			<description>이전 포스트에서 EnterFrame 이벤트를 사용하여 애니메이션을 구현하는 방법을 소개했다. 이번에는 Tween 클래스를 사용하는 방법이다. 

Tween을 사용한 경우의 특징 중 하나는 애니메이션의 시간을 초 단위로 지정하는 것이다. Tween은 지정된 시간이 지나는 과정에서 표시 객체의 속성 값, 예를 들어 x좌표를 최종 값에 도달하기까지 순차적으로 변화시킨다.&lt;br /&gt;
 &lt;br /&gt;
코드는 다음과 같다. 먼저 Tween 생성자에서 대상 객체와 시간을 지정하여 다음 animate() 메소드를 사용하여 변화하는 속성의 이름과 마지막 값을 설정한다. 여러 특성을 변화시키는 경우 animate()를 계속해서 부르면 된다.&amp;nbsp;&lt;br /&gt;

&lt;br /&gt;
&lt;div&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;// myObject을 2 초 걸쳐 가로 50px, 세로 80px 이동하는 애니메이션 지정&lt;br /&gt;
var myTween:Tween = New Tween(myObject, 2.0);&amp;nbsp;&lt;br /&gt;
myTween.animate( &quot;x&quot;, myObject.x + 50);&amp;nbsp;&lt;br /&gt;
myTween.animate( &quot;y&quot;, myObject.y + 80);&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;

&lt;br /&gt;
아래 예제는 onAddedToStage() 리스너 함수에 적용한 것이다. 사각형을 4초에 걸쳐 (0,0)에서 (220, 380) 좌표로 이동시키는 것이다.
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;package {
	import starling.animation.Tween;
	import starling.core.Starling;
	import starling.display.Quad;
	import starling.events.Event;

	private function onAddedToStage(e:Event):void {
		myQuad = new Quad(100,100);
		myQuad.color = 0x00FF00;

		// Tween 객체의 생성
		var myTween:Tween = new Tween(myQuad,4.0);

		// 변화시키는 속성 지정
		myTween.moveTo(220, 380);

		// Juggler에 Tween 객체를 추가하려면
		Starling.juggler.add(myTween);
	}
}

&lt;/pre&gt;
&lt;br /&gt;
이 샘플에서는 animate() 메소드 대신 moveTo() 메소드를 사용했다. moveTo()는 x좌표와 y좌표를 동시에 이동 시킬 때 유용한 방법이다. 그 외에도 비슷한 방법으로 비율을 바꾸는 scaleTo()와 alpha를 바꾸는 fadeTo() 등이 제공되고 있다. 각도를 바꾸는 방법은 아직 없기 때문에 회전할 때는 animate()를 사용한다.
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;import starling.utils.deg2rad;
 
var myTween:Tween = new Tween (object, 2.0);
myTween.scaleTo(2);
myTween.fadeTo(0);
myTween.animate( &quot;rotation&quot;, deg2rad (45));
Starling.juggler.add(myTween);
&lt;/pre&gt;

&lt;br /&gt;
위 예제에서 사용한 deg2rad()는 각도를 라디안으로 변환하는 함수다. Starling 프레임워크에서 지원.

Juggler 클래스
위 예제에서 살펴보면 Tween 인스턴스에 필요한 설정을 한 후,  Tween 인스턴스를 Starling의 juggler이라는 속성에 추가했다. 이는 애니메이션의 시작을 알리는 신호라고 보면 된다. Juggler은 객체의 &quot;시간을 진행하는&quot; 클래스다. &lt;br /&gt;
그러나 IAnimatable이라는 인터페이스를 상속하는 객체에만 적용이 된다. Tween은 IAnimatable을 상속하고 있다.

Juggler는 객체를 전달하면 해당 객체의 시간을 진행한다. 그리고 객체에 대해 지정된 시간이 지나면 객체에 대한 참조를 자동으로 해제한다. 그런데 Juggler는 delayCall()이라는 메소드가 있다. 이 것은 임의의 함수를 지정한 시간이 지나면 호출하도록 Juggler에게 지시하는 것이다. 호출 함수에 인수를 전달할 수도 있다.
&lt;br /&gt;
아래는 1초 후에 myFunc()함수를 호출하면서 &quot;Hello&quot;라는 인수를 전달하는 예제다.

&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;Starling.juggler.delayCall (myFunc, 1.0, &quot;Hello&quot;);
 
private function myFunc (message:String):void{
  trace (message);
}
&lt;/pre&gt;
&lt;br /&gt;
애니메이션의 시간과 함수의 실행 시점을 같은 Juggler을 통해서 관리함으로써 양자를 완벽하게 동기화시킬 수 있어 편리하다. Juggler 객체는 Starling 클래스를 제공하기 위해 일반적으로 이 것을 사용하여 애니메이션을 시작하면 충분하다. 단, 애니메이션을 개별적으로 제어하고 싶은 경우에는 Juggler 객체를 생성하는 것이 유용할 수 있겠다. &lt;br /&gt;
Juggler 객체를 직접 관리하는 경우 EnterFrame 이벤트에 대한 advanceTime() 메소드를 호출하도록 한다. 또한 dispose()에서 리소스 해제 처리가 필요할지도 모른다.

easing 함수 지정
Tween에는 여분의 함수를 지정할 수 있다. easing 함수의 종류는 생성자의 3 번째 인수로 전달한다. 기본 값은 linear다. 생성자에서 설정한 easing 함수는 애니메이션이 시작한 이후에는 변경할 수 없다. Tween 객체의 transition 속성에서 값을 참조만 가능하다.
&lt;br /&gt;
&lt;br /&gt;

&lt;pre class=&quot;brush:as3&quot;&gt;import starling.animation.Transitions;
var myTween:Tween = new Tween (myQuad, 4, Transitions.EASE_OUT_BOUNCE );
&lt;/pre&gt;

위 예제에서는 easing 함수 easeOutBounce를 지정하고 있다. 여기에 지정 가능한 값은 Transitions 플래스에 정의되어 있다. &lt;br /&gt;
아래는 Starling 저자의 사이트에 게재되어 있는 easing 함수의 동작 그래프다. 참고.

&lt;br /&gt;
&lt;br /&gt;
&lt;p style=&quot;margin:0&quot;&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://cfile10.uf.tistory.com/original/1972C7424F05BC571823BA&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile10.uf.tistory.com/image/1972C7424F05BC571823BA&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;transitions.png&quot; height=&quot;604&quot; width=&quot;576&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
섬세한 조정은 허용하지 않는다. 이 점은 Edge 및 Flex와 같다.


Tween 진행 상태 알림
Tween은 애니메이션의 시작, 진행, 종료를 알리는 함수를 설정할 수 있다. AS2의 이벤트 핸들러와 비슷하게 사용한다. 구체적인 함수 이름은 각각 onStart(), onUpdate(), onComplete()다. onStart()와 onComplete()는 한 번씩, onUpdate()는 업데이트 프레임 수만큼 실행한다.

아래는 3개의 함수를 설정한 예다.

&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;private function onAddedToStage(e:Event):void {
		myQuad = new Quad(100,100);
		myQuad.color = 0x00FF00;

		var myTween:Tween = new Tween(myQuad,4,Transitions.EASE_OUT_BOUNCE);
		myTween.moveTo(220, 380);
		Starling.juggler.add(myTween);

		myTween.onStart = onStart;
		myTween.onUpdate = onProgress;
		myTween.onComplete = onComplete;

		addChild(myQuad);
	}

	private function onStart():void {
		trace(&quot;트윈이 시작되었습니다&quot;);
	}
	private function onProgress():void {
		trace(&quot;트윈 실행 중&quot;);
	}
	private function onComplete():void {
		trace(&quot;트윈이 완료되었습니다&quot;);
	}
&lt;/pre&gt;

&lt;br /&gt;
애니메이션의 전처리와 후처리를 실시하고 싶은 경우에는 도움이 될 것이다. 다음에는 Starling의 텍스처의 사용법을 소개한다. &lt;br /&gt;

&lt;br /&gt;
원문 :&amp;nbsp;&lt;a href=&quot;http://cuaoar.jp/2011/12/tween-starling.html&quot; target=&quot;_blank&quot; title=&quot;[http://cuaoar.jp/2011/12/tween-starling.html]로 이동합니다.&quot;&gt;http://cuaoar.jp/2011/12/tween-starling.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;div&gt;&lt;object classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,12,36&quot; id=&quot;jasudev&quot; width=&quot;700&quot; height=&quot;360&quot;&gt;&lt;param name=&quot;bgcolor&quot; value=&quot;#000000&quot; /&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.ifacies.com/blog/sample05.swf&quot; /&gt;&lt;param name=&quot;wmode&quot; value=&quot;direct&quot; /&gt;&lt;param name=&quot;allowFullscreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot; /&gt;&lt;embed src=&quot;http://www.ifacies.com/blog/sample05.swf&quot; type=&quot;application/x-shockwave-flash&quot; name=&quot;jasudev&quot; allowScriptAccess=&quot;always&quot; allowFullscreen=&quot;true&quot; wmode=&quot;direct&quot; width=&quot;700&quot; height=&quot;360&quot; bgcolor=&quot;#000000&quot; /&gt;&lt;/object&gt;&lt;/div&gt;
&lt;br /&gt;&lt;div&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;package {
	import starling.events.Event;
	import starling.core.Starling;
	import starling.display.Quad;
	import starling.utils.deg2rad;
	import starling.display.Sprite;
	import starling.animation.Tween;
	import starling.animation.Transitions;

	public class Demo extends Sprite {
		private var myQuad:Quad;

		public function Demo() {
			// addedToStage 이벤트에 대한 리스너 추가
			addEventListener( Event.ADDED_TO_STAGE , onAddedToStage);
		}
		private function onAddedToStage(e:Event):void {

			myQuad = new Quad(100,100);
			myQuad.setVertexColor(0, 0xFFFF00);
			myQuad.setVertexColor(1, 0xFF0000);
			myQuad.setVertexColor(2, 0x00FF00);
			myQuad.setVertexColor(3, 0x0000FF);
			
			myQuad.pivotX = myQuad.width &amp;gt;&amp;gt; 1;
			myQuad.pivotY = myQuad.height &amp;gt;&amp;gt; 1;

			// Tween 객체의 생성
			var myTween:Tween = new Tween(myQuad, 2.0, Transitions.EASE_IN_OUT);

			// 변화시키는 속성 지정
			myTween.moveTo(stage.stageWidth &amp;gt;&amp;gt; 1, stage.stageHeight &amp;gt;&amp;gt; 1);

			// Juggler에 Tween 객체를 추가하려면
			Starling.juggler.add(myTween);
			Starling.juggler.delayCall(myFunc, 2.0);


			addChild(myQuad);

		}	
		
		private function myFunc():void{
			var myTween:Tween = new Tween(myQuad,4.0, Transitions.EASE_OUT_ELASTIC);
			myTween.animate( &quot;rotation&quot;, myQuad.rotation+deg2rad(90));
			myTween.onStart = onStartHandler;
			myTween.onUpdate = onUpdateHandler;
			myTween.onComplete = onCompleteHandler;
			Starling.juggler.add(myTween);
		}

		private function onStartHandler():void{
			var myTween:Tween = new Tween(myQuad,4.0, Transitions.EASE_OUT_ELASTIC);
			if(myQuad.scaleX == 2.0){
				myTween.scaleTo(1);
			}else{
				myTween.scaleTo(2);
			}
			
			Starling.juggler.add(myTween);
		}
		
		private function onUpdateHandler():void{
			trace(&quot;트윈 실행 중&quot;);
		}
		
		private function onCompleteHandler():void{
			myFunc();
		}

		public override function dispose():void {
			removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
			super.dispose();
		}
	}
}
&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-591-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-591-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-591-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align:right; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=jasu.tistory.com/591&amp;amp;layout=button_count&amp;amp;show_faces=true&amp;amp;width=90&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=dark&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:90px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
</description>
			<category>Framework</category>
			<category>ActionScript</category>
			<category>actionscript 3.0</category>
			<category>Adobe</category>
			<category>AS3</category>
			<category>flash</category>
			<category>framework</category>
			<category>Programming</category>
			<category>Starling</category>
			<category>tween</category>
			<category>액션스크립트</category>
			<category>텍스처</category>
			<category>플래시</category>
			<author>jasu jasu</author>
			<guid>http://jasu.tistory.com/591</guid>
			<comments>http://jasu.tistory.com/591#entry591comment</comments>
			<pubDate>Sun, 08 Jan 2012 02:57:54 +0900</pubDate>
		</item>
		<item>
			<title>[Starling-04] EnterFrame 이벤트를 이용한 애니메이션</title>
			<link>http://jasu.tistory.com/590</link>
			<description>이번에는 이전 포스트에서 소개한 코드를 기반으로 사각형을 이동시켜본다. EnterFrame 이벤트를 사용한다. Starling의 표기 객체는 Flash Player 표시 객체와 같게, EnterFrame 이벤트를 지원한다. 따라서 EnterFrame 이벤트 수신기를 추가하면 새로운 프레임을 볼 때마다 리스너 함수가 실행된다. Starling의 이벤트 방식과 리스너 등록 방법도 FlashPlayer 표시 목록과 거의 동일하다. &lt;br /&gt;
&lt;br /&gt;
이번에 소개하는 방법은 기존의 Flash 컨텐츠를 재사용하기 쉬운 방법이다. 이번 예제에서는 그라데이션으로 사각형에 색을 채우고 회전시켜 본다. Quad 클래스는 정점마다 색을 지정하는 메소드가 있어서 편리하다. 메소드는 setVertexColor() 이다. setVertexColor()의 첫 번째 인자는 정점의 번호다. 번호는 0부터 시작하여 왼쪽, 오른쪽 위 및 왼쪽 아래 오른쪽 아래 정점이다. 두 번째 인수는 색상을 지정한다.&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;// myQuad.color = 0xABCDEF; 대신 다음을 작성&amp;nbsp;&lt;br /&gt;
myQuad.setVertexColor (0, 0x000000);&amp;nbsp;&lt;br /&gt;
myQuad.setVertexColor (1, 0xFF0000);&amp;nbsp;&lt;br /&gt;
myQuad.setVertexColor (2, 0x00FF00);&amp;nbsp;&lt;br /&gt;
myQuad.setVertexColor (3, 0x0000FF);&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
이렇게 지정하면 나머지는 자동으로 각 정점 사이의 픽셀의 색이 보완되기 때문에 사각형에 그라데이션이 입혀진다.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
EnterFrame 이벤트 리스너 사용&lt;/b&gt;&lt;br /&gt;
본론으로 돌아가서 EnterFrame 이벤트 리스너를 추가하는 방법이다. 사용하는 Event 클래스가 Starling 프레이워크에 포함된 클래스라는 점에 주의가 필요하다. 그러나 지금까지 AS3의 이벤트 처리 코드를 구현해 봤다면 별 어려움 없이 사용할 수 있을 것이다. (리스너 함수 삭제 타이밍이 약간 다르다 : 아래)&lt;br /&gt;
아래는 EnterFrame 이벤트를 사용하여 프레임마다 사각형을 회전시키는 샘플이다. 이전 예제의 onAddedStage()를 수정한 것이다.&lt;br /&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;private function onAddedToStage(e:Event):void {&lt;br /&gt;
        // Quad의 인스턴스를 생성&lt;br /&gt;
         myQuad = new Quad(200,200);&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
         // 각 정점의 색상을 지정	
         myQuad.setVertexColor(0,0x000000);			&lt;br /&gt;
         myQuad.setVertexColor(1,0xFF0000);			&lt;br /&gt;
         myQuad.setVertexColor(2,0x00FF00);			&lt;br /&gt;
         myQuad.setVertexColor(3,0x0000FF);			&lt;br /&gt;
&lt;br /&gt;
        // Quad의 인스턴스를 중앙에 표시;			&lt;br /&gt;
         myQuad.x = stage.stageWidth - myQuad.width &amp;gt;&amp;gt; 1;			&lt;br /&gt;
         myQuad.y = stage.stageHeight - myQuad.height &amp;gt;&amp;gt; 1;			&lt;br /&gt;
&lt;br /&gt;
        // Sprite에 Quad 인스턴스를 추가			&lt;br /&gt;
         addChild(myQuad);			&lt;br /&gt;
&lt;br /&gt;
        // EnterFrame 이벤트 리스너 추가			&lt;br /&gt;
         myQuad.addEventListener( Event.ENTER_FRAME , onEnterFrame);		&lt;br /&gt;
}		&lt;br /&gt;
&lt;br /&gt;
private function onEnterFrame(e:Event):void {			&lt;br /&gt;
        // Quad의 인스턴스를 회전			&lt;br /&gt;
         if (e.currentTarget as Quad) {				&lt;br /&gt;
         &amp;nbsp;        &amp;nbsp;myQuad.rotation +=  .01;			               }		&lt;br /&gt;
}&lt;/pre&gt;&lt;br /&gt;
프레임마다 rotation 값을 0.01씩 증가시키고 있기 때문에 위 코드를 실행하면 사각형이 시계 방향으로 회전한다. 이 때 회전의 중심점은 사각형의 왼쪽 상단 모서리가 된다. Starling 표시 객체에는 기준점을 지정하기 위한 속성 pivotX과 pivotY가 있다. 이들을 사용하면 사각형 내의 임의의 점을 기준으로 회전시킬 수 있다. pivotX와 pivotY의 초기값은 모두 0이다. 즉, 표시 객체의 기본 등록 포인트는 왼쪽 모서리가 된다. 여기서는 기준점을 사각형의 중심으로 변경해 보자.&lt;br /&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;// 기준점을 Quad 인스턴스의 중심으로 설정&lt;br /&gt;
myQuad.pivotX = myQuad.width &amp;gt;&amp;gt; 1;&lt;br /&gt;
myQuad.pivotY = myQuad.height &amp;gt;&amp;gt; 1;&lt;/pre&gt;&lt;br /&gt;
이렇게 기준점을 변경하면 표시 위치의 기준도 다르기 때문에 표시 위치가 어긋난다. 이번 예에서는 사각형의 폭과 높이의 절반인 100 픽셀씩 왼쪽과 위로 이동한다.&lt;br /&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;// Quad의 인스턴스를 중앙에 표시&lt;br /&gt;
myQuad.x = (stage.stageWidth - myQuad.width &amp;gt;&amp;gt; 1) + myQuad.pivotX;&lt;br /&gt;
myQuad.y = (stage.stageHeight - myQuad.height &amp;gt;&amp;gt; 1) + myQuad.pivotY;&lt;/pre&gt;&lt;br /&gt;
myQuad.pivotX = myQuad.width &amp;gt;&amp;gt; 1 이므로, 아래와 같이 축약할 수가 있을 것이다.&lt;br /&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;// Quad의 인스턴스를 중앙에 표시&lt;br /&gt;
myQuad.x = stage.stageWidth &amp;gt;&amp;gt; 1;&lt;br /&gt;
myQuad.y = stage.stageHeight &amp;gt;&amp;gt; 1;&lt;/pre&gt;&lt;br /&gt;
이상으로 화면의 중앙에 위치하는 사각형을 중심점을 기준으로 회전해봤다.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
자원의 개방(메모리 해제)&lt;/b&gt;&lt;br /&gt;
Starling 표시 객체에는 dispose()라는 메소드가 있다. 이는 표시 객체가 삭제되는 타이밍을 알리는 표시객체에서 사용하는 리소스를 해제하기 위한 메소드이다. Starling에서 표시 객체의 서브 클래스를 정의할 때 dispose() 실행을 잊지 않도록 한다. 그렇지 않으면 메모리 누수의 원인이 될 수도 있다.&lt;br /&gt;
아래 예제 코드는 dispose()를 사용하는 예다.&lt;br /&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;public override function dispose():void {			&lt;br /&gt;
         removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);			&lt;br /&gt;
         myQuad.removeEventListener(Event.ENTER_FRAME, onEnterFrame);			&lt;br /&gt;
        &lt;br /&gt;
         super.dispose();		&lt;br /&gt;
}&lt;/pre&gt;&lt;br /&gt;
샘플은 이벤트 리스너를 제거하는 것이다. Starling 이벤트 리스너에 약한 참조를 사용할수 없기 때문에 삭제 타이밍에 확실히 삭제하도록 한다. 메소드의 마지막 행에서 super.dispose()를 호출한다. 이렇게 하면 객체에 addChild()로 추가된 모든 자식 객체에 대해 dispose()가 호출된다. 따라서 myQuad.dispose()는 명시적으로 기술할 필요가 없다. 기타 표시 목록에 추가되지 않은 객체가 있다면 dispose() 실행은 필수다.&lt;br /&gt;
&lt;br /&gt;
또한 표시 목록에 추가할 수 없는 객체에서 리소스의 개방이 필요한 객체가 있다면 여기에 필요한 처리를 기술한다. 예를 들어, 다른 객체와 공유하는 전용 텍스처(여기서는 myTexture)를 참조하고 있다면 이 객체를 소멸한다면 myTexture.dispose()를 실행하여 myTexture가 확보한 비트맵 메모리 공간을 해제해야 한다.&lt;br /&gt;
&lt;br /&gt;

&lt;br /&gt;
&lt;br /&gt;
원문 :&amp;nbsp;&lt;a href=&quot;http://cuaoar.jp/2011/12/enterframe-starling.html&quot; target=&quot;_blank&quot; title=&quot;[http://cuaoar.jp/2011/12/enterframe-starling.html]로 이동합니다.&quot;&gt;http://cuaoar.jp/2011/12/enterframe-starling.html&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;

&lt;div&gt;
&lt;object classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,12,36&quot; id=&quot;jasudev&quot; width=&quot;700&quot; height=&quot;360&quot;&gt;&lt;param name=&quot;bgcolor&quot; value=&quot;#000000&quot; /&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.ifacies.com/blog/sample04.swf&quot; /&gt;&lt;param name=&quot;wmode&quot; value=&quot;direct&quot; /&gt;&lt;param name=&quot;allowFullscreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot; /&gt;&lt;embed src=&quot;http://www.ifacies.com/blog/sample04.swf&quot; type=&quot;application/x-shockwave-flash&quot; name=&quot;jasudev&quot; allowScriptAccess=&quot;always&quot; allowFullscreen=&quot;true&quot; wmode=&quot;direct&quot; width=&quot;700&quot; height=&quot;360&quot; bgcolor=&quot;#000000&quot; /&gt;&lt;/object&gt;&lt;/div&gt;

&lt;div&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;package {
	import starling.events.Event;
	import starling.display.Quad;
	import starling.display.Sprite;

	public class Demo extends Sprite {
		private var myQuad:Quad;

		public function Demo() {
			// addedToStage 이벤트에 대한 리스너 추가
			addEventListener( Event.ADDED_TO_STAGE , onAddedToStage);
		}
		private function onAddedToStage(e:Event):void {

			// Quad의 인스턴스를 생성           
			myQuad = new Quad(200,200);

			// 각 정점의 색상을 지정         
			myQuad.setVertexColor(0,0xFFFFFF);
			myQuad.setVertexColor(1,0xFF0000);
			myQuad.setVertexColor(2,0x00FF00);
			myQuad.setVertexColor(3,0x0000FF);


			// 기준점을 Quad 인스턴스의 중심으로 설정
			myQuad.pivotX = myQuad.width &amp;gt;&amp;gt; 1;
			myQuad.pivotY = myQuad.height &amp;gt;&amp;gt; 1;

			// Quad의 인스턴스를 중앙에 표시
			myQuad.x = stage.stageWidth &amp;gt;&amp;gt; 1;
			myQuad.y = stage.stageHeight &amp;gt;&amp;gt; 1;

			// Sprite에 Quad 인스턴스를 추가            
			addChild(myQuad);

			// EnterFrame 이벤트 리스너 추가            
			myQuad.addEventListener( Event.ENTER_FRAME , onEnterFrame);
		}

		private function onEnterFrame(e:Event):void {
			// Quad의 인스턴스를 회전           
			if (e.currentTarget as Quad) {
				myQuad.rotation +=  .01;
			}
		}

		public override function dispose():void {
			removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
			myQuad.removeEventListener(Event.ENTER_FRAME, onEnterFrame);

			super.dispose();
		}
	}
}
&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-590-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-590-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-590-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align:right; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=jasu.tistory.com/590&amp;amp;layout=button_count&amp;amp;show_faces=true&amp;amp;width=90&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=dark&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:90px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
</description>
			<category>Framework</category>
			<category>ActionScript</category>
			<category>actionscript 3.0</category>
			<category>Adobe</category>
			<category>AS3</category>
			<category>BitmapData</category>
			<category>flash</category>
			<category>framework</category>
			<category>Starling</category>
			<category>비트맵</category>
			<category>액션스크립트</category>
			<category>텍스처</category>
			<category>플래시</category>
			<author>jasu jasu</author>
			<guid>http://jasu.tistory.com/590</guid>
			<comments>http://jasu.tistory.com/590#entry590comment</comments>
			<pubDate>Sun, 08 Jan 2012 00:12:01 +0900</pubDate>
		</item>
		<item>
			<title>[Starling-03]  Flash 컨텐츠 표시의 기본</title>
			<link>http://jasu.tistory.com/589</link>
			<description>Starling은 Stage3D를 이용한 빠른 2D 드로잉을 실현하기 위해 설계된 framework이다. &lt;a href=&quot;http://jasu.tistory.com/588&quot; target=&quot;_blank&quot; title=&quot;[http://jasu.tistory.com/588]로 이동합니다.&quot;&gt;이전 기사&lt;/a&gt;에서 개요와 간단한 사용법을 소개했다. Starling에서는 3가지 방법으로 애니메이션을 사용할 수 있다. 이 방법을 여러 번에 나눠서 소개한다. 기존의 애니메이션 방법과 비교해 보자.&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
개발 환경 준비&lt;/b&gt;

Starling의 개발 환경은 Flash Player 11과 AIR 3가 필요하다. 툴은 Flash Builer 4.6을 권장한다. Flash Professional CS5 또는 CS5.5를 사용하는 경우 다음 문서에서 소개하는 기능확장이 편리하다.&lt;br /&gt;
&lt;a href=&quot;http://jasu.tistory.com/581&quot; target=&quot;_blank&quot; title=&quot;[http://jasu.tistory.com/581]로 이동합니다.&quot;&gt;Flash Professional CS5 or CS5.5에 Flash Player 11 설정 MXP&lt;br /&gt;
&lt;br /&gt;
&lt;/a&gt;그리고 Starling framework는 github에서 구할 수 있다.
&lt;br /&gt;
&lt;a href=&quot;https://github.com/PrimaryFeather/Starling-Framework/zipball/master&quot; target=&quot;_blank&quot; title=&quot;[https://github.com/PrimaryFeather/Starling-Framework/zipball/master]로 이동합니다.&quot;&gt;PrimaryFeather / Starling - Framework / zipball&lt;br /&gt;
&lt;br /&gt;
&lt;/a&gt;위 링크에서 다운로드한 zip에 포함되어 있는 SWC 파일을 경로에 추가하면 Starling 애플리케이션을 개발 할 수 있다. 또한 혼합 모드에 direct를 지정하지 않으면 제작에 성공해도 화면에 표시할 수 없다. 따라서 SWF 경우 wmode = direct를, AIR일 경우 &amp;lt;renderMode&amp;gt; direct &amp;lt;/renderMode&amp;gt; 로 지정하는 것을 잊지 말아야한다.&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
Starling 인스턴스 생성&lt;/b&gt;

Starling로 렌더링하려면 먼저 Starling의 인스턴스를 생성한 다음 start() 메소드를 호출한다. 이 부분은 어떤 Starling을 개발에도 그대로 사용할 수 있다. 아래가 가장 간단한 예제이므로 사용해보자. fla 파일에서 document class로 사용하는 것이 편하다.&lt;br /&gt;
&lt;br /&gt;

&lt;pre class=&quot;brush:as3&quot;&gt;package{
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import starling.core.Starling;

        public class StartStarling extends Sprite{
		private var myStarling:Starling;

		public function StartStarling(){
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;

			// Starling의 인스턴스를 생성
			myStarling = new Starling(MyStarlingSprite,stage);
			// 그리기 작업을 시작
			myStarling.start();
		}
	}
}
&lt;/pre&gt;

&lt;br /&gt;
Starling의 생성자 첫 번째 인수는 Starling의 Sprite다. 이 Sprite의 내용이 실제 화면 그리기에 사용된다. 그리기 정보는 Flash Player의 Sprite와 마찬가지로 자식 객체의 목록 구조와 같이 유지된다. 두 번째 인수는 표기 객체의 그리기 stage다. Starling 생성자는 5개의 인수를 가지지만 3 번째 이후 인수는 기본값을 가지고 있기 때문에 일반적으로 지정할 필요가 없다.&amp;nbsp;명시적으로 소프트웨어에서 3D 렌더링을 사용하려는 경우에는 5개의 인수를 작성할 수 있다. 마지막 인수가 혼합 모드를 지정한다.&lt;br /&gt;

&lt;pre class=&quot;brush:as3&quot;&gt;&lt;br /&gt;
// 5 번째 째의 인수로 그리기 모드를 지정
myStarling = new Starling (Game, stage, null, null, Context3DRenderMode.SOFTWARE );
&lt;/pre&gt;

&lt;br /&gt;
이렇게 할 경우, 어떤 환경에서도 GPU로 렌더링 되지 않고 CPU로 처리하게 된다. 만약 실행 중에 소프트웨어 렌더링으로 대체되어 있는지 확인하고 싶다면 Starling 인스턴스 context.driverInfo 속성을 통해서 확인할 수 있다.

다음은 context3DCreate 이벤트를 사용하여 Stage3D를 초기화 한 후, 소프트웨어 렌더링의 프레임 속도를 절반으로 설정하는 예를 보여준다.&lt;br /&gt;

&lt;pre class=&quot;brush:as3&quot;&gt;&lt;br /&gt;
stage.stage3Ds[0].addEventListener (Event.CONTEXT3D_CREATE,onContext3DCreate);
private function onContext3DCreate (event : Event) : void
{

      if (Starling.context.driverInfo.toLowerCase() indexOf ( &quot;software &quot;)!=- 1){
            Starling.current.nativeStage.frameRate = 30;
      }
}
&lt;/pre&gt;

&lt;br /&gt;
Starling 런타임 오류 검사를 수행하려는 경우에는 start()를 호출하기 전에 다음 설정을 추가한다.
&lt;pre class=&quot;brush:as3&quot;&gt;myStarling.enableErrorChecking = true;
&lt;/pre&gt;

&lt;br /&gt;
그러나 오류 검사 및 성능에 미치는 영향이 크기 때문에 디버깅 이외에는 설정하지 않는 것이 좋다. 기타 Starling 클래스의 기능은 다음 기회에 소개할 예정이다. 우선 온라인 문서는 이 곳에서 확인할 수 있다. &lt;a href=&quot;http://doc.starling-framework.org/core/starling/core/Starling.html&quot; target=&quot;_blank&quot; title=&quot;[http://doc.starling-framework.org/core/starling/core/Starling.html]로 이동합니다.&quot;&gt;Starling @ Starling Framework Reference&lt;/a&gt;
&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
사용자 정의 Sprite 만들기&lt;/b&gt;
&lt;br /&gt;
(참고 : 앞으로 Sprite와 같은 클래스 이름은 설명이 없는 한 모두 Starling 프레임워크에 종속된 클래스다. 익숙해질 때까지 실수에 주의가 필요하다.)

&lt;br /&gt;
&lt;br /&gt;
다음은 Starling의 생성자의 첫 번째 인자로 지정하는 Sprite 사용자 정의 클래스를 만든다. 만드는 단계는, 표시 오브젝트를 작성하고 Sprite에 addChild() 메소드를 추가하는 기존의 방식과 비슷하다. Stage3D의 그리기 단위는 삼각형이지만 Starling은 삼각형 2개를 기본으로 한다. 따라서 사각형에 해당하는 Quad 클래스의 인스턴스를 표시하는 방법에서 시작한다. 아래의 샘플은 화면에 사각형을 표시하는 것을 수행한다.&lt;br /&gt;

&lt;pre class=&quot;brush:as3&quot;&gt;&lt;br /&gt;
package {
	import Starling.display.Quad;
	import Starling.display.Sprite;

	public class MyStarlingSprite extends Sprite
	{
		private var myQuad:Quad;

		public function MyStarlingSprite()
		{
			// Quad의 인스턴스를 생성
			myQuad = new Quad(200,200);
			// 우선 채우기 색상을 지정
			myQuad.color = 0xABCDEF;

			// Sprite에 Quad 인스턴스를 추가
			addChild(myQuad);
		}
	}
}
&lt;/pre&gt;

&lt;br /&gt;
위 코드를 실행하면 사각형이 화면 왼쪽에 그려진다. 사각형을 화면 중앙에 표시하려면 다음과 같이 Quad의 좌표를 설정한다.&lt;br /&gt;

&lt;pre class=&quot;brush:as3&quot;&gt;&lt;br /&gt;
myQuad.x = stage.stageWidth - myQuad.width&amp;gt;&amp;gt; 1;
myQuad.y = stage.stageHeight - myQuad.height&amp;gt;&amp;gt; 1;
&lt;/pre&gt;단, 위의 코드는 stage 속성에 대한 액세스를 포함한다. 따라서 Sprite가 초기화가 끝나기 전에 실행되면 오류가 발생한다. 그래서 addedToStage 이벤트를 이용한다. 이 addedToStage 이벤트는 Starling 이벤트지만, Flash Player의 addedToStage 이벤트 처럼 Stage가 이용 가능하게 된 것을 알려준다.&lt;br /&gt;

&lt;pre class=&quot;brush:as3&quot;&gt;&lt;br /&gt;
package {
	import Starling.events.Event;
	import Starling.display.Quad;
	import Starling.display.Sprite;

	public class MyStarlingSprite extends Sprite {
		private var myQuad:Quad;

		public function MyStarlingSprite() {
			// addedToStage 이벤트에 대한 수신기를 추가
			addEventListener( Event.ADDED_TO_STAGE , onAddedToStage);
		}
		private function onAddedToStage(e : Event ):void {
			// Quad의 인스턴스를 생성
			myQuad = new Quad(200,200);
			myQuad.color = 0xABCDEF;
			myQuad.x = stage.stageWidth - myQuad.width &amp;gt;&amp;gt; 1;
			myQuad.y = stage.stageHeight - myQuad.height &amp;gt;&amp;gt; 1;

			// Sprite에 Quad 인스턴스를 추가
			addChild(myQuad);
		}
	}
}
&lt;/pre&gt;&lt;div&gt;
&lt;object classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,12,36&quot; id=&quot;jasudev&quot; width=&quot;700&quot; height=&quot;360&quot;&gt;&lt;param name=&quot;bgcolor&quot; value=&quot;#000000&quot; /&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.ifacies.com/blog/Startup3.swf&quot; /&gt;&lt;param name=&quot;wmode&quot; value=&quot;direct&quot; /&gt;&lt;param name=&quot;allowFullscreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot; /&gt;&lt;embed src=&quot;http://www.ifacies.com/blog/Startup3.swf&quot; type=&quot;application/x-shockwave-flash&quot; name=&quot;jasudev&quot; allowScriptAccess=&quot;always&quot; allowFullscreen=&quot;true&quot; wmode=&quot;direct&quot; width=&quot;700&quot; height=&quot;360&quot; bgcolor=&quot;#000000&quot; /&gt;&lt;/object&gt;&lt;/div&gt;
&lt;br /&gt;
원문 :&amp;nbsp;&lt;a href=&quot;http://cuaoar.jp/2011/12/starling-flash.html&quot; target=&quot;_blank&quot; title=&quot;[http://cuaoar.jp/2011/12/starling-flash.html]로 이동합니다.&quot;&gt;http://cuaoar.jp/2011/12/starling-flash.html&lt;/a&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-589-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-589-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-589-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align:right; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=jasu.tistory.com/589&amp;amp;layout=button_count&amp;amp;show_faces=true&amp;amp;width=90&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=dark&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:90px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
</description>
			<category>Framework</category>
			<category>ActionScript</category>
			<category>actionscript 3.0</category>
			<category>Adobe</category>
			<category>AS3</category>
			<category>BitmapData</category>
			<category>flash</category>
			<category>framework</category>
			<category>Programming</category>
			<category>Quad</category>
			<category>Stage3D</category>
			<category>Starling</category>
			<category>액션스크립트</category>
			<category>프로그래밍</category>
			<category>플래시</category>
			<author>jasu jasu</author>
			<guid>http://jasu.tistory.com/589</guid>
			<comments>http://jasu.tistory.com/589#entry589comment</comments>
			<pubDate>Thu, 05 Jan 2012 01:50:08 +0900</pubDate>
		</item>
		<item>
			<title>[Starling-02] Starling 2D framework 소개</title>
			<link>http://jasu.tistory.com/588</link>
			<description>&lt;a title=&quot;[http://jasu.tistory.com/585]로 이동합니다.&quot; href=&quot;http://jasu.tistory.com/585&quot; target=&quot;_blank&quot;&gt;이전 포스트&lt;/a&gt;에서 이야기한 내용과 같이 Stage3D의 지원을 통해서 FlashPlayer 렌더링 기술은 확실히 진화했다. 오랜만에 느껴보는 진화다. &lt;a title=&quot;[http://www.starling-framework.org/]로 이동합니다.&quot; href=&quot;http://www.starling-framework.org/&quot; target=&quot;_blank&quot;&gt;Starling&lt;/a&gt; 외에도 &lt;a title=&quot;[http://www.nulldesign.de/category/experiments/nd2d/]로 이동합니다.&quot; href=&quot;http://www.nulldesign.de/category/experiments/nd2d/&quot; target=&quot;_blank&quot;&gt;ND2D&lt;/a&gt;와 같은 framework가 등장하고 있으니 앞으로 여러가지 다양하고 새로운 것들이 나타날 것 같은 예감이다.(&lt;a title=&quot;[http://cuaoar.jp/2011/09/flash-player-11-adobe-ai-1.html]로 이동합니다.&quot; href=&quot;http://cuaoar.jp/2011/09/flash-player-11-adobe-ai-1.html&quot; target=&quot;_blank&quot;&gt;Alchemy&lt;/a&gt;의 이야기와 FlashPlayer에서 다중스레드 지원 이야기 등등)&lt;br /&gt;
&lt;br /&gt;
이번에는 조금 더 자세하게 Starling을 소개한다.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Starling 아키텍처&lt;br /&gt;
&lt;/strong&gt;Starling은 Stage3D로 구축되어 있다. Stage3D는 데스크탑 환경에서 DirectX 및 OpenGL, 모바일 환경에서는 OpenGL ES2에 구축되어 있다. 따라서 OpenGL 등이 GPU의 API를 직접 호출하기 때문에 Starling이 두 계층 사이에서 GPU를 사용할 수 있는 것이다.&lt;br /&gt;
&lt;br /&gt;
1. Starling&lt;br /&gt;
2. Stage3D&lt;br /&gt;
3. OpenGL, DirectX, OpenGL ES2&lt;br /&gt;
3. GPU&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;

&lt;div&gt;
Starling은 약 80kb 용량으로 가볍지만 이 때문에 Starling에서는 기존의 플래시 표시객체의 모든 기능이 제공되지는 않고 한정적이다. 아무래도 주로 게임 용도를 염두에 두고 설계되었기 때문이라고 생각된다.(물론 게임 이외에도 사용할 수 있다.) Starling의 이벤트 모델, 클래스 계층 구조도 기존 플래시 구조와 비슷하다. 계층의 순서는 아래와 같다.&lt;br /&gt;
&lt;br /&gt;
1. starling.events.EventDispatcher&lt;br /&gt;
2. starling.display.DisplayObject&lt;br /&gt;
3. starling.display.DisplayObjectContainer&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
이어서 DisplayObjectContainer 아래에 Button, Sprite, TextField등이 정렬된다.&lt;br /&gt;
MovieClip은 조금 다르다. Image class의 서브 클래스이다. 아래와 같은 계층관계를 가지고 있다.&lt;br /&gt;
&lt;br /&gt;
1. starling.display.DisplayObject&lt;br /&gt;
2. starling.display.Quad&lt;br /&gt;
3. starling.display.Image&lt;br /&gt;
4. starling.display.MovieClip&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Image의 서브 클래스인 MovieClip은 GPU를 활용하기 위해 최적화되어 있기 때문에 기존에 타임라인 애니메이션을 좋아하는 사람은 활용도가 높다. 그리고 Quad라는 새로운 클래스가 등장했는데 Quad는 사각형 영역을 그리기 위한 클래스다.&lt;br /&gt;
&lt;br /&gt;
비트맵 이미지를 표시하려면 다음과 같다.&lt;br /&gt;

&lt;div&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;// 비트맵을 포함
[Embed (source = &quot;myBitmap.png&quot;)]
private static const myBitmap:Class;

// 비트맵 텍스처를 생성
var texture:Texture = Texture.fromBitmap(new myBitmap());

// 텍스터를 사용하여 이미지 객체를 생성
var image:Image = new Image(texture);

// 이미지의 표시 위치를 지정
image.x = 300;
image.y = 150;

// 이미지를 표시
addChild(image);
&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;strong&gt;기존의 DisplayObject와 Starling을 동시에 사용하는 경우&lt;br /&gt;
&lt;/strong&gt;Stage3D는 기존의 표시객체와 다른 레이어에 그려진다. 참고로 GPU에서는 비디오 재생을 StageVideo(FlashPlayer 10.2에서 도입) 레이어에 별도로 그려진다. 각 레이어의 관계는 아래와 같다.&lt;br /&gt;
&lt;br /&gt;
1. 표시목록&lt;br /&gt;
2. Stage3D&lt;br /&gt;
3. StageVideo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
각각이 독립된 레이어로 다른 레이어의 display 데이터에 직접 액세스할 수 없다. 예를 들어, StageVideo에서 재생중인 영상을 표시객체에 붙이는 것은 현재는 할 수 없다. 표시 목록과 Starling(즉 Stage3D)를 동시에 사용할 경우, 표시 목록이 레이어이므로 모든 표시 객체는 Starling의 객체 위에 표시된다. Stage3D는 프레임마다 모든 영역을 다시 그린다. 그리고 현재 버전에서는 Stage3D 객체를 투과할 수 없다. 따라서 StageVideo 위에 객체를 올리기 위해서는 Starling객체가 아닌 표시객체를 사용해야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Stage3D를 사용할 수 없는 경우&lt;br /&gt;
&lt;/strong&gt;Starling의 Stage3D를 사용하려면 wmode를 direct로 지정해야 한다. wmode가 지정되지 않았거나 wmode가 다른 값으로 설정되어 있으면 런타임 오류가 발생한다. Starling은 오류가 발견되면 wmode가 올바르게 지정되지 않았다는 메시지를 출력한다. 따라서 HTML에서 플래시가 제대로 임베드 되지 않았을 경우, 쉽게 발견할 수 있다. wmode가 올바르게 지정되어 있어도 드라이버의 버전, 또는 GPU를 사용할 수 없는 경우에는 Stage3D가 SwiftShader로 대체되어 실행되기 때문에 원하는 속도를 내기 어렵다. FlashPlayer 11버전이 설치되어 있더라도 느리다면 드라이버 설치 버전이 최신인지 확인이 필요하다.&lt;br /&gt;
&lt;br /&gt;
원문 :&lt;a href=&quot;http://cuaoar.jp/2011/09/starling-actionscript-3-1.html&quot; target=&quot;_blank&quot; title=&quot;[http://cuaoar.jp/2011/09/starling-actionscript-3-1.html]로 이동합니다.&quot;&gt; http://cuaoar.jp/2011/09/starling-actionscript-3-1.html&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-588-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-588-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-588-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align:right; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=jasu.tistory.com/588&amp;amp;layout=button_count&amp;amp;show_faces=true&amp;amp;width=90&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=dark&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:90px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
</description>
			<category>Framework</category>
			<category>ActionScript</category>
			<category>actionscript 3.0</category>
			<category>Adobe</category>
			<category>AS3</category>
			<category>BitmapData</category>
			<category>flash</category>
			<category>FlashPlayer11</category>
			<category>framework</category>
			<category>Stage3D</category>
			<category>Starling</category>
			<category>비트맵</category>
			<category>액션스크립트</category>
			<category>타임라인</category>
			<category>텍스처</category>
			<category>플래시</category>
			<author>jasu jasu</author>
			<guid>http://jasu.tistory.com/588</guid>
			<comments>http://jasu.tistory.com/588#entry588comment</comments>
			<pubDate>Wed, 04 Jan 2012 18:25:59 +0900</pubDate>
		</item>
		<item>
			<title>Starling에서 resize 적용</title>
			<link>http://jasu.tistory.com/586</link>
			<description>Starling를 이용하여 렌더링을 할 경우 stage의 width, height를 변경하더라도 렌더링 되고 있는 픽셀의 크기는 변경되지 않는다. 따라서 렌더링 되고 있는 Starling의 stage 사이즈를 변경하기 위해서는 아래와 같이 Starling.current.viewPort의 Rectangle 값을 변경해 줘야 한다.&lt;br /&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;package 
{
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
	import flash.geom.Rectangle;
    
    import starling.core.Starling;
    import flash.events.Event;

    public class Startup extends Sprite
    {
        private var mStarling:Starling;
        
        public function Startup()
        {
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
            
            mStarling = new Starling(Demo, stage);
            mStarling.enableErrorChecking = false;
            mStarling.start();

			stage.addEventListener(Event.RESIZE, onResizeHandler);
			addChild(new Gaze(true, &quot;http://jasu.tistory.com&quot;));
        }
		
		private function onResizeHandler(e:Event):void{
			var viewPortRectangle:Rectangle = new Rectangle();
			viewPortRectangle.width = stage.stageWidth;
			viewPortRectangle.height = stage.stageHeight;

			Starling.current.viewPort = viewPortRectangle;
		}
    }
}
&lt;/pre&gt;

이렇게 viewPort의 사이즈를 변경하면 resize 이벤트를 통해서 stage의 width, height 사이즈가 변경된 사이즈로 렌더링 된다. 그러나 렌더링되는 실제 해상도에는 변함이 없기 때문에 강제로 resize한 것처럼 스케일 비율이 무시된다.  (stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; 로 설정을 했더라도 Starling(Stage3D)을 통해서 렌더링되는 영역은 별도) 따라서 아래와 같이 mStarling.stage의 stageWidth, stageHeight 값도 변경해야 실제 렌더링하려는 픽셀 사이즈를 확보할 수가 있다.

&lt;pre class=&quot;brush:as3&quot;&gt;private function onResizeHandler(e:Event):void{
			var viewPortRectangle:Rectangle = new Rectangle();
			viewPortRectangle.width = stage.stageWidth;
			viewPortRectangle.height = stage.stageHeight;
			Starling.current.viewPort = viewPortRectangle;
 
			mStarling.stage.stageWidth = stage.stageWidth;
			mStarling.stage.stageHeight = stage.stageHeight;
		}
&lt;/pre&gt;

&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-586-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-586-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-586-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align:right; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=jasu.tistory.com/586&amp;amp;layout=button_count&amp;amp;show_faces=true&amp;amp;width=90&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=dark&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:90px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
</description>
			<category>Framework</category>
			<category>ActionScript</category>
			<category>actionscript 3.0</category>
			<category>Adobe</category>
			<category>AS3</category>
			<category>flash</category>
			<category>framework</category>
			<category>resize</category>
			<category>Starling</category>
			<category>viewport</category>
			<category>액션스크립트</category>
			<category>플래시</category>
			<author>jasu jasu</author>
			<guid>http://jasu.tistory.com/586</guid>
			<comments>http://jasu.tistory.com/586#entry586comment</comments>
			<pubDate>Wed, 04 Jan 2012 16:16:54 +0900</pubDate>
		</item>
		<item>
			<title>[Starling-01] Starling 2D framework 소개</title>
			<link>http://jasu.tistory.com/585</link>
			<description>&lt;p&gt;Starling은 FlashPlayer 11 버전에서 새롭게 추가된 3D 렌더링 기능 “Stage3D”를 이용하여 만들어진 오픈 소스 2D ActionScript framework이다. FreeBSD 라이선스로 배포되고 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;object classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,12,36&quot; id=&quot;jasudev&quot; width=&quot;700&quot; height=&quot;360&quot;&gt;&lt;param name=&quot;bgcolor&quot; value=&quot;#000000&quot; /&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.ifacies.com/blog/StarlingStartup.swf&quot; /&gt;&lt;param name=&quot;wmode&quot; value=&quot;direct&quot; /&gt;&lt;param name=&quot;allowFullscreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot; /&gt;&lt;embed src=&quot;http://www.ifacies.com/blog/StarlingStartup.swf&quot; type=&quot;application/x-shockwave-flash&quot; name=&quot;jasudev&quot; allowScriptAccess=&quot;always&quot; allowFullscreen=&quot;true&quot; wmode=&quot;direct&quot; width=&quot;700&quot; height=&quot;360&quot; bgcolor=&quot;#000000&quot; /&gt;&lt;/object&gt; 
&lt;p&gt;현재 버전은 0.9이며 다운로드는 &lt;a title=&quot;[https://github.com/PrimaryFeather/Starling-Framework]로 이동합니다.&quot; href=&quot;https://github.com/PrimaryFeather/Starling-Framework&quot; target=&quot;_blank&quot;&gt;Starling Framework v0.9.1&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Stage3D는 direct로 GPU 기능을 활용할 수 있기 때문에 기존보다 훨씬 빠른 렌더링이 가능하다. 이미 다양한 3D framework가 Stage3D를 활용하고 있다. (&lt;a title=&quot;[http://alternativaplatform.com/en/]로 이동합니다.&quot; href=&quot;http://alternativaplatform.com/en/&quot; target=&quot;_blank&quot;&gt;Alternativa3D&lt;/a&gt;, &lt;a title=&quot;[http://away3d.com/]로 이동합니다.&quot; href=&quot;http://away3d.com/&quot; target=&quot;_blank&quot;&gt;Away3D&lt;/a&gt;, &lt;a title=&quot;[http://aerys.in/minko/]로 이동합니다.&quot; href=&quot;http://aerys.in/minko/&quot; target=&quot;_blank&quot;&gt;Minko&lt;/a&gt;, &lt;a title=&quot;[http://www.flare3d.com/]로 이동합니다.&quot; href=&quot;http://www.flare3d.com/&quot; target=&quot;_blank&quot;&gt;Flare3D&lt;/a&gt;, &lt;a title=&quot;[http://www.mixamo.com/]로 이동합니다.&quot; href=&quot;http://www.mixamo.com/&quot; target=&quot;_blank&quot;&gt;Mixamo &lt;/a&gt;등)&lt;/p&gt;
&lt;p&gt;Stage3D는 강력하지만 충분히 활용하기 위해서는 개발의 복잡성 때문에 개발자들이 넘어야 할 벽이 많다. 하지만 Starling은 이러한 복잡성을 숨기면서 빠른 2D 드로잉을 수행할 수 있도록 개발되었다. Starling에서는 ActionScript에서 익숙한 DisplayObject와 같은 형식의 API를 제공한다. 또한 Starling에서는 비트맵 글꼴 및 스프라이트시트 같은 FlashPlayer에서 지원하지 않는 기능도 제공한다. (파티클 효과도 &lt;a title=&quot;[https://github.com/PrimaryFeather/Starling-Extension-Particle-System]로 이동합니다.&quot; href=&quot;https://github.com/PrimaryFeather/Starling-Extension-Particle-System&quot; target=&quot;_blank&quot;&gt;github&lt;/a&gt;에서 확장 기능을 다운로드하면 사용할 수 있다.)&lt;/p&gt;
&lt;p&gt;Starling은 iOS를 기반으로 하는 &lt;a title=&quot;[http://www.sparrow-framework.org/]로 이동합니다.&quot; href=&quot;http://www.sparrow-framework.org/&quot; target=&quot;_blank&quot;&gt;Sparrow&lt;/a&gt;를 Stage3D에 포팅한 것이다. 즉,&lt;br /&gt;
&amp;nbsp;* Starling은 이미 모바일 장치에서 검증되었다.&lt;br /&gt;
&amp;nbsp;* Starling에서 개발한 애플리케이션은 쉽게 iOS 네이티브 애플리케이션에 포팅 할 수 있다.&lt;br /&gt;
&lt;br /&gt;
앞으로 작성되는 Starling Framework 소개글은 &lt;a title=&quot;[http://cuaoar.jp]로 이동합니다.&quot; href=&quot;http://cuaoar.jp/&quot; target=&quot;_blank&quot;&gt;akihiro kamijo&lt;/a&gt;의 글을 기반으로 작성되며 실험을 통해서 계속적으로 추가 적인 내용을 업데이트할 예정이다. 번역 과정에서 원글과 다소 차이가 있을 수 있으나 이해되는 범위 안에서 포스팅한다.&lt;br /&gt;
&lt;br /&gt;
원문 :&amp;nbsp;&lt;a href=&quot;http://cuaoar.jp/2011/09/starling-actionscript-3.html&quot; target=&quot;_blank&quot; title=&quot;[http://cuaoar.jp/2011/09/starling-actionscript-3.html]로 이동합니다.&quot;&gt;http://cuaoar.jp/2011/09/starling-actionscript-3.html&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-585-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-585-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-585-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align:right; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=jasu.tistory.com/585&amp;amp;layout=button_count&amp;amp;show_faces=true&amp;amp;width=90&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=dark&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:90px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
</description>
			<category>Framework</category>
			<category>2D ActionScript Framework</category>
			<category>actionscript 3.0</category>
			<category>Alternativa3d</category>
			<category>Away3D</category>
			<category>Flare3D</category>
			<category>framework</category>
			<category>freebsd</category>
			<category>Github</category>
			<category>Minko</category>
			<category>Mixamo</category>
			<category>sparrow</category>
			<category>Stage3D</category>
			<category>Starling</category>
			<author>jasu jasu</author>
			<guid>http://jasu.tistory.com/585</guid>
			<comments>http://jasu.tistory.com/585#entry585comment</comments>
			<pubDate>Wed, 04 Jan 2012 12:31:33 +0900</pubDate>
		</item>
		<item>
			<title>new Gaze();</title>
			<link>http://jasu.tistory.com/582</link>
			<description>&lt;p style=&quot;margin:0&quot;&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;p style=&quot;margin:0&quot;&gt;
&lt;/p&gt;
&lt;p style=&quot;margin:0&quot;&gt;&lt;div class=&quot;imageblock left&quot; style=&quot;float: left; margin-right: 10px;&quot;&gt;&lt;a href=&quot;http://cfile24.uf.tistory.com/original/1302634C4F0326DF1D55C7&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile24.uf.tistory.com/image/1302634C4F0326DF1D55C7&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;Gaze.png&quot; height=&quot;149&quot; width=&quot;247&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
U : 플래시 원본 웹 페이지 링크 버튼&lt;br /&gt;
F : FullScreenMode 설정 버튼&amp;nbsp;&lt;br /&gt;
+ : FPS 증가 버튼&lt;br /&gt;
- : FPS 감소 버튼&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
코드 사용 방법&lt;br /&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:as3&quot;&gt;package
{	
	import flash.display.Sprite;
	public class UseGazeSample extends Sprite {   
		public function UseGazeSample():void {

			 addChild( new Gaze(true, &quot;http://&quot;) );	

		}
    }
}

// constructor  
public function Gaze(inFullscreenMode:Boolean=false, inOriginalUrl:String=&quot;empty&quot;):void;
&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;version 0.6.1&lt;br /&gt;
&amp;nbsp;&lt;/div&gt;
&lt;p style=&quot;margin:0&quot;&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://jasu.tistory.com/attachment/cfile28.uf@196EB1424F0489A0041A0F.as&quot;&gt;&lt;img src=&quot;http://i1.daumcdn.net/cfs.tistory/v/110706133414/blog/image/extension/unknown.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; Gaze.as&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;



&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-582-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-582-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-582-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align:right; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=jasu.tistory.com/582&amp;amp;layout=button_count&amp;amp;show_faces=true&amp;amp;width=90&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=dark&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:90px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
</description>
			<category>ActionScript 3.0[CS5]</category>
			<category>flash</category>
			<category>FPS</category>
			<category>frame rate</category>
			<category>fullscreen</category>
			<category>FULL_SCREEN</category>
			<category>gaze</category>
			<category>Gaze.as</category>
			<category>stage.displayState</category>
			<category>stage.frameRate</category>
			<category>stats</category>
			<category>System</category>
			<category>System.totalMemory</category>
			<author>jasu jasu</author>
			<guid>http://jasu.tistory.com/582</guid>
			<comments>http://jasu.tistory.com/582#entry582comment</comments>
			<pubDate>Wed, 04 Jan 2012 01:06:23 +0900</pubDate>
		</item>
	</channel>
</rss>
