CODEONWORT

무비클립 타임라인을 통째로 비트맵 캐싱하기 본문

Season 1/플래시

무비클립 타임라인을 통째로 비트맵 캐싱하기

codeonwort 2011.07.14 00:40
렌더링 속도를 위해 메모리를 낭비하고 턴을 마치겠다 (..)

무비클립의 모든 프레임을 순회하며 프레임마다 비트맵데이터를 준비하여 그린다. 무비클립의 프레임이 12개면 비트맵데이터도 12개다. 이 비트맵데이터들을 BitmapData 벡터에 담는다. 이제 Bitmap 객체를 생성하고 표시하고 싶은 프레임에 대응하는 비트맵데이터를 bitmapData 속성에 지정해주면 끝난다.

간단하게 구현해봤지만 문제점이 많으니 참고용으로만 쓸 것.

WTFPL 하에 배포합니다

// x, y 좌표를 원래 무비클립의 위치와 맞추면 정확히 겹친다
// 이름으로 보면 Bitmap을 상속할 것 같지만 사실은 Sprite를 상속한다
// 뒤의 두 인수는 Bitmap 생성자의 pixelSnapping, smoothing와 일치하며 굳이 입력하지 않아도 "auto"와 true가 기본값으로 들어간다
var bdmc:BitmapedMovieClip = new BitmapedMovieClip(mc, "auto", true)
bdmc.x = mc.x-100, bdmc.y = mc.y
addChild(bdmc)

addEventListener("enterFrame", ef)
function ef(Null){
bdmc.gotoAndStop(mc.currentFrame)
}

mc.play()

지원하는 메서드는 gotoAndStop, nextFrame, prevFrame, dispose, (get)currentFrame, (get)totalFrames다. play랑 stop은 enterFrame 쓰기가 귀찮아서 안 만들었는데 어차피 이 클래스 그대로 쓸 것도 아니니..

문제점
1. 무비클립 내의 무비클립을 인식하지 않는다. 제어할 방법도 없다.
2. 무비클립 자체에 적용된 기울임과 회전(matrix), 색상 변환(colorTransform)을 무시한다. 귀찮아
3. mc는 맨 마지막 프레임에서 정지하니까 mc도 사용하고 있었다면 다시 재생해야 한다. 원래 프레임으로 가서 멈추게 할 수는 있는데 어차피 isPlaying 같은 속성이 지금으로선 API에 없기 때문에 원래 프레임으로 가도 재생할지 멈출지 결정할 수가 없다.
4. 내부적으로 비트맵데이터를 쓰니 BitmapedMovieClip 객체가 필요 없으면 dispose()를 꼭 호출할 것. 이건 문제점이라기보단 유의사항
5. 아차 프레임 레이블
6. 대략 200x100 크기의 10프레임짜리 애니메이션을 담은 무비클립에 대해 200*100*10*4 = 800000 바이트 = 약 800 킬로바이트 orz 어쩔 수 없지
0 Comments
댓글쓰기 폼