180bpm

AS3 미니맵 3종 메서드 본문

Flash/Scaleform

AS3 미니맵 3종 메서드

powdersnow 2012. 8. 10. 11:45

08/06~08/09 작업 상황.

지적이 많이 나왔다.

순차적으로 작성

1. AS2에서 클래스의 기본(원류?)은 Object 클래스다.

그래서 모든 형은 결국엔 Object 클래스로 바뀔텐데 var o; 같이 형을 적지 않고 선언하면

런타임에서 형검사를 하지 않아 실행속도가 빨라진다.

그리고 런타임에서 모든 코드를 파싱할텐데 글자수도 적어져서 초기실행속도도 빨라진다.

다만 AS3에선 써야한다 - 근데 왜 내코드는 작동을 하지?


2. $e.target as loaderInfo;

$e.target.content as Bitmap;


3. 계속 나왔던 이야기. 메서드 이름을 생각하고 지어라.

어떤 알고리즘으로 돌아가는지에 대해 짓지 말고 실제적으로 하는 행동을 적어라.


4. alpha =0.1;을 10장 겹쳐도 사실은 100%로 나오지 못한다.

이유는 alpha의 범위는 0~1, 근데 코드적으로는 00~FF.

그래서 0.03;


5. scrollRect에 담을 rectangle은 한개만 만들어서 써도 된다.

해당 디스플레이 오브젝트에 넣어도 참조가 아닌 복사가 되기 때문이다.


6. 비슷한 내용인데, Bitmap Class를 처음엔 겹칠만큼은 만들어야겠지만

그 이후에는 removeChild 하지 않고 계속 써도 무방하다.


7. embed 태그를 이용해 lib 폴더에 있는 그림을 바로 불러오는 방법이 있다.


8. new는 왠만해선 쓰지 말자


9. 상속받은 클래스의 생성자에 파라메터 넣지 말아라. 확장하기 어려워진다.

의미없는 파라메터 받지 마라. 못알아본다.

최소단계, 최대단계, 알파값 같은건 코드 까보지 않으면 뭘 하는지 모른다.

퀄리티.HI같이 의미를 명확하게 알아볼 수 있게 해라. 의미 없는 배려다. 똥이다.


10. 도큐먼트 클래스를 사용했다면 fla와 dc파일명을 대소문자까지 같이 해야한다


11. 캐시 잡아써라.



//code start package { import flash.display.Sprite; import flash.events.KeyboardEvent; import flash.events.Event; import flash.ui.Keyboard; /** * 과제 하면서 생겼던 문제. * 내부함수에서 선언한 변수가 전체에 영향을 줌 - 전에 배웠던건데 까먹음! */ public class Minimap extends Sprite { private var movingPoint:int = 15, pX:int = 0, pY:int = 0; /** * 생성 */ //private var a:DrawByCopyPixels = new DrawByCopyPixels(640, 12, 8, 0.3); private var b:DrawByMask = new DrawByMask(360, 12, 8, 0.3); //private var c:DrawByScrollRect = new DrawByScrollRect(360, 8, 24, 0.3); /** * 빠른 테스트를 위해 인스턴스를 참조할 인스턴스 생성 */ private var result; public function Minimap() { // constructor code if (stage) init(null); else addEventListener(Event.ADDED_TO_STAGE, init); } /** * * @param e */ private function init(e:Event):void { removeEventListener(Event.ADDED_TO_STAGE, init); result = b; //loader.load 다음에 addeventlietener 붙인거와 같은 형태. 절차상의 문제 됨. stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyPressed); //result = b; //꾸겨넣고 addChild(result); //붙인다 } /** * 키보드 이벤트 * @param $e */ private function onKeyPressed($e):void { //var key:uint = ; switch ($e.keyCode) { case Keyboard.UP: pY -= movingPoint; break; case Keyboard.DOWN: pY += movingPoint; break; case Keyboard.LEFT: pX -= movingPoint; break; case Keyboard.RIGHT:pX += movingPoint; break; } //image 사이즈를 넘어갔을때의 처리가 없다. if (pX < 0) { pX = 0 } if (pY < 0) { pY = 0 } //메서드 명은 알고리즘을 말하는것이 아니다. //코드가 하는 일을 써야한다. result.drawImage(pX, pY); } } } import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Graphics; import flash.display.Loader; import flash.display.Sprite; import flash.events.Event; import flash.geom.Point; import flash.geom.Rectangle; import flash.net.URLRequest; /** * CopyPixel로 그리기 */ class DrawByCopyPixels extends Sprite { private var _maskSize:uint, _gradientStartLevel:uint, _gradientLevel:uint, _alpha:Number, _mcResult:Sprite = new Sprite, _bmpMap:Bitmap, _bmpMask:Bitmap, _bmpResult:Bitmap; //접근해서 지우고 싶은데 private var mapLoader:Loader = new Loader; private var maskLoader:Loader = new Loader; private var _mapUrl:String; private var _maskUrl:String; /** * * @param $maskSize * @param $gradientStartLevel * @param $gradientLevel * @param $alpha * @param $url */ public function DrawByCopyPixels($maskSize:uint = 360, $gradientStartLevel:uint = 12, $gradientLevel:uint = 8, $alpha:Number = 0.2, $mapUrl:String = "map.png", $maskUrl:String = "mask.png") { _maskSize = $maskSize; _gradientStartLevel = $gradientStartLevel; _gradientLevel = $gradientLevel; _alpha = $alpha; _mapUrl = $mapUrl; _maskUrl = $maskUrl; mapLoader.load(new URLRequest(_mapUrl)); mapLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onMapLoadComplete); } /** * 맵 로드 * @param $e */ private function onMapLoadComplete($e:Event):void { $e.target.removeEventListener(Event.COMPLETE, onMapLoadComplete); _bmpMap = $e.target.content; //마스크 로드 maskLoader.load(new URLRequest(_maskUrl)); maskLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onMaskLoadComplete); } /** * 마스크 로드 * @param $e */ private function onMaskLoadComplete($e:Event):void { $e.target.removeEventListener(Event.COMPLETE, onMaskLoadComplete); _bmpMask = $e.target.content; drawImage(0,0); } /** * 이미지 그리기. */ public function drawImage($pX:int, $pY:int):void { removeImage(); //의미 없음. var mapBitmap:BitmapData = new BitmapData(_bmpMap.width, _bmpMap.height, true, 0); mapBitmap.draw(_bmpMap); var bData:BitmapData = new BitmapData( _maskSize, _maskSize, true, 0 ); //_bmpMap.bitmapData 로 직접접근하면 이미지가 찌그러진다. bData.copyPixels( mapBitmap, new Rectangle($pX, $pY, _maskSize, _maskSize), new Point(), _bmpMask.bitmapData, new Point(), true ); addChild( new Bitmap(bData) ); } private function removeImage():void { var len:int = numChildren; if (len == 0) return; for (var i = 0; i < len; i++) { removeChildAt(0); } } } /** * 마스크로 그리기 */ class DrawByMask extends Sprite { private var _maskSize:uint, _gradientStartLevel:uint, _gradientLevel:uint, _alpha:Number, _bmpMap:Bitmap, _bmpMask:Bitmap, _bmpResult:Bitmap; //접근해서 지우고 싶은데 private var _mapUrl:String; private var _maskUrl:String; private var mapLoader:Loader = new Loader; private var maskLoader:Loader = new Loader; /** * * @param $maskSize * @param $gradientStartLevel * @param $gradientLevel * @param $alpha * @param $url */ public function DrawByMask($maskSize:uint = 360, $gradientStartLevel:uint = 12, $gradientLevel:uint = 8, $alpha:Number = 0.3, $mapUrl:String = "map.png", $maskUrl:String = "mask.png") { _maskSize = $maskSize; _gradientStartLevel = $gradientStartLevel; _gradientLevel = $gradientLevel; _alpha = $alpha; _mapUrl = $mapUrl; _maskUrl = $maskUrl; mapLoader.load(new URLRequest(_mapUrl)); mapLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onMapLoadComplete); } /** * 맵 로드 * @param $e */ private function onMapLoadComplete($e:Event):void { $e.target.removeEventListener(Event.COMPLETE, onMapLoadComplete); _bmpMap = $e.target.content; //마스크 로드 maskLoader.load(new URLRequest(_maskUrl)); maskLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onMaskLoadComplete); } /** * 마스크 로드 * @param $e */ private function onMaskLoadComplete($e:Event):void { $e.target.removeEventListener(Event.COMPLETE, onMaskLoadComplete); _bmpMask = $e.target.content; drawImage(0,0); } /** * 이미지 그리기. */ public function drawImage($pX:int, $pY:int):void { removeImage(); var endLevel:uint = _gradientStartLevel + _gradientLevel; for (var i = _gradientStartLevel; i < endLevel; i++) { /** * 가공할 데이터 */ var maskPoint:int = 10 * i; var resultMap:Bitmap = new Bitmap(_bmpMap.bitmapData); var resultMask:Bitmap = new Bitmap(_bmpMask.bitmapData); resultMask.width = maskPoint; resultMask.height = maskPoint; resultMask.x = (_maskSize-maskPoint >> 1); resultMask.y = (_maskSize-maskPoint >> 1); resultMap.alpha = _alpha; resultMap.mask = resultMask; resultMap.x = -$pX; resultMap.y = -$pY; addChild(resultMap); } } private function removeImage():void { var len:int = numChildren; if (len == 0) return; for (var i = 0; i < len; i++) { removeChildAt(0); } } } /** * 스크롤 렉트로 그리기 */ class DrawByScrollRect extends Sprite { private var _maskSize:uint, _gradientStartLevel:uint, _gradientLevel:uint, _alpha:Number, _bmpMap:Bitmap, _bmpMask:Bitmap, _bmpResult:Bitmap; private var _mapUrl:String; private var _maskUrl:String; private var mapLoader:Loader = new Loader; private var maskLoader:Loader = new Loader; /** * * @param $maskSize * @param $gradientStartLevel * @param $gradientLevel * @param $alpha * @param $url */ public function DrawByScrollRect($maskSize:uint = 360, $gradientStartLevel:uint = 12, $gradientLevel:uint = 8, $alpha:Number = 0.3, $mapUrl:String = "map.png", $maskUrl:String = "mask.png") { _maskSize = $maskSize; _gradientStartLevel = $gradientStartLevel; _gradientLevel = $gradientLevel; _alpha = $alpha; _mapUrl = $mapUrl; _maskUrl = $maskUrl; mapLoader.load(new URLRequest(_mapUrl)); mapLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onMapLoadComplete); } /** * 맵 로드 * @param $e */ private function onMapLoadComplete($e:Event):void { $e.target.removeEventListener(Event.COMPLETE, onMapLoadComplete); _bmpMap = $e.target.content; //마스크 로드 maskLoader.load(new URLRequest(_maskUrl)); maskLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onMaskLoadComplete); } /** * 마스크 로드 * @param $e */ private function onMaskLoadComplete($e:Event):void { $e.target.removeEventListener(Event.COMPLETE, onMaskLoadComplete); _bmpMask = $e.target.content; drawImage(0,0); } /** * 이미지 그리기. */ public function drawImage($pX:int, $pY:int):void { removeImage(); var endLevel:uint = _gradientStartLevel + _gradientLevel; for (var i = _gradientStartLevel; i < endLevel; i++) { /** * 가공할 데이터 */ var maskPoint:int = 10 * i; var resultMap:Bitmap = new Bitmap(_bmpMap.bitmapData.clone()); resultMap.alpha = _alpha; var rec:Rectangle = new Rectangle(0, 0, _maskSize, _maskSize); rec.x = maskPoint / 4 + $pX; rec.y = maskPoint / 4 + $pY; rec.width = _maskSize - maskPoint / 2; rec.height = _maskSize - maskPoint / 2; resultMap.x = maskPoint / 4; resultMap.y = maskPoint / 4; resultMap.scrollRect = rec; addChild(resultMap); } } private function removeImage():void { var len:int = numChildren; if (len == 0) return; for (var i = 0; i < len; i++) { removeChildAt(0); } } } //code end


Comments