2007/12/04 10:33
[Dev/Flex]
- Sprite는 무엇인가요?
먼저 Sprite는 무엇인지 잘 모르는 분들을 위해 설명을 곁들여보죠.
ActionScript
3 에서는 Sprite Class라 불리우는 새로운 Class를 사용하게 되는데... Sprite Object는 Movie
Clip과 유사합니다만, Timeline이 없다는 것이 큰 차이점입니다. Sprite는 timeline을 요구하진 않는 곳에서
쓰일 수 있는 적합한 Base Class 입니다.
인용 : 지돌스타님 블로그
물론, Sprite를 FLEX에서 사용하고 싶다면 UIComponent에 addChild 하여서 사용하면 됩니다. (참고 : 지돌스타님 블로그)
하지만, UIComponent를 상속하고 있는 Canvas에는 왜 addChild가 되지 않는가 하는 것이 이 글의 주요 주제죠.
- Sprite을 Canvas에 addChild 하면 ?
여기서 분명한 것은 Sprite를 Canvas에 addChild하면
"TypeError: Error #1034: 유형 강제 변환에 실패했습니다. flash.display::Sprite@45cd351을(를) mx.core.IUIComponent(으)로 변환할 수 없습니다."
라고 컴파일시에 Error가 난다는 겁니다.
오류가 난 곳을 따라가보면 Canvas가 상속하고 있는 Container 클래스의 addingChild 메소드에서 나는 것을 알 수 있습니다.
override mx_internal function addingChild(child:DisplayObject):void
{
// Throw an RTE if child is not an IUIComponent.
var uiChild:IUIComponent = IUIComponent(child); // 이 줄에서 오류가 납니다.
...
}
{
// Throw an RTE if child is not an IUIComponent.
var uiChild:IUIComponent = IUIComponent(child); // 이 줄에서 오류가 납니다.
...
}
IUIComponent 타입인지 확인하고 있는데, Sprite는 IUIComponent type이 아니기때문에 오류가 나고 있는 것입니다.
- IUIComponent는 무엇인가요?
그럼 IUIComponent는 무엇일까요?
클래스 안에 있는 주석으로 다음과 같이 설명되고 있습니다.
The IUIComponent interface defines the basic set of APIs that you must implement to create a child of a Flex container or list.
FLEX의 Visual Component의 기본은 UIComponent 입니다.
IUIComponent 인터페이스는 이 UIComponent 가 구현하고 있는 인터페이스로서 위의 설명에 따르면,
Flex의 Container 나 List의 child들은 IUIComponent 인터페이스를 구현하고 있어야 된다고 합니다.
(아니면 위 에러메세지 처럼 IUIComponent 타입이 아니라서 오류나죠 ㅡㅂㅡ)
- 그렇다면 Canvas는?
Canvas
Container
UIComponent
FlexSprite
Sprite
DisplayObjectContainer
InteractiveObject
DisplayObject
EventDispatcher
Object
Container
UIComponent
FlexSprite
Sprite
DisplayObjectContainer
InteractiveObject
DisplayObject
EventDispatcher
Object
인용 : Flexdocs.kr
위의 관계대로 만들어진 Canvas에는 IUIComponent가 구현된(다시 말해 UIComponent를 상속받는) 클래스들은
모두 addChild 될 수 있으나 그렇지 않은 클래스는 addChild 되지 못하게 됩니다.
Sprite는 IUIComponent 인터페이스를 구현하고 있지 않으므로
Container에는 addChild 할 수 없는 것입니다.
- Tip
Sprite를 Canvas 같은 Container 에 추가하여야 하는 일이 생긴다면 아래와 같이 클래스 만드셔서 addChild 하셔도 괜찮을 것 같네요. :)
package
{
import flash.display.Sprite;
import mx.core.UIComponent;
public class mySprite extends UIComponent
{
private var sprite:Sprite;
public function mySprite()
{
super();
sprite = new Sprite();
}
override protected function createChildren():void
{
super.createChildren();
this.addChild(sprite);
}
.....
}
}
{
import flash.display.Sprite;
import mx.core.UIComponent;
public class mySprite extends UIComponent
{
private var sprite:Sprite;
public function mySprite()
{
super();
sprite = new Sprite();
}
override protected function createChildren():void
{
super.createChildren();
this.addChild(sprite);
}
.....
}
}
참고자료 :
[팁] Sprite 사용법
Flex 2 Beta 3 : Sprites
'Dev > Flex' 카테고리의 다른 글
| [Flex] 수동으로 이벤트 발생시키기 - dispatchEvent() (6) | 2008/03/17 |
|---|---|
| [Flex] 일정시간 후에 자동으로 종료되는 Alert (5) | 2008/01/24 |
| [FLEX] 왜 Sprite는 Canvas에 addChild 안되는 걸까? (7) | 2007/12/04 |
| [FLEX] Coloring the Background of Cells (18) | 2007/11/20 |
| [FLEX] XML의 값을 Boolean 값으로 캐스팅하는 방법? (1) | 2007/11/16 |
| [FLEX] 간단한 아이템 렌더러(Item Renderer)를 만들어보자 (4) | 2007/11/12 |
Trackback :: 이상한 나라의 flex
Tracked from 길가다 만나는 모든 반가운것들 | 2008/04/17 08:29 | DEL
이상하다 sprite객체에는 uicomponents객체가 addchild되지 않는다. sprite객체에 graphic객체는 addchild된다. 이럴땐 명백하게 exception이 throw되는게 낫다. 그렇치 않으면 개발자는 헤메게 된다. flex도 또하나의 어려운툴이 될수 있는 구멍인것이다. 어째거나 이문제를 해결하기 위해서는, sprite에 addchild하지 않고 application레벨에 addchild하는 수밖에 없다. 방법은 (1)상위객.. |
Trackback :: 왜 Sprite는 Canvas에 addChild 안되는 걸까요?
왜 Sprite는 Canvas에 addChild 안되는 걸까요?
- Sprite는 무엇인가요?
먼저 Sprite는 무엇인지 잘 모르는 분들을 위해 설명을 곁들여보죠.
ActionScript 3 에서는 Sprite Class라 불리우는 새로운 Class를 사용하게 되는데... Sprite Object는 Movie Clip과 유사합니다만, Timeline이 없다는 것이 큰 차이점입니다. Sprite는 timeline을 요구하진 않는 곳... |


