ActionScript로 점선 그리기2: Marching Ants

작성자

카테고리:

어제 올렸던 대시라인 그리기에서 조금 더 기능을 추가해 봤습니다. 포토샵에서 선택영역을 지정하면 점선이 이동하는 효과가 나오는데, 그걸 적용했습니다. 행진하는 개미 ^^

beginBitmapFill(bitmap:BitmapData, matrix:Matrix=null, repeat:Boolean=true, smooth:Boolean=false):void
위와 같이 Graphics.beginBitmapFill() 메소드에 2번째 파라메터로 매트릭스를 지정하여 사용할 수 있습니다. 그래서 하나의 비트맵데이터를 가지고 매트릭스에 회전을 주어서 사용을 했더니, 비트맵데이터가 외곡되는 문제가 생기네요. 일단 귀찮아서 비트맵데이터 4개를 가지고 그렸는데, 최적화하는 방법은 좀 더 찾아 봐야할 듯 하네요.

import flash.display.*;
import flash.geom.Rectangle;
import flash.events.MouseEvent;
import flash.text.*;
import flash.geom.Matrix;
import flash.utils.Timer;
import flash.events.TimerEvent;

var fmt:TextFormat = new TextFormat("Arial", 14, 0x666666);
var tf:TextField = new TextField();
tf.defaultTextFormat = fmt;
tf.autoSize = TextFieldAutoSize.LEFT;
tf.text = "Drag on the stage";
tf.selectable = false;
tf.x = (stage.stageWidth - tf.width) / 2;
tf.y = (stage.stageHeight - tf.height) / 2;
addChild(tf);

var rightBD:BitmapData = new BitmapData(10, 1, true, 0x0);
rightBD.fillRect(new Rectangle(0, 0, 5, 1), 0xFF000000);
var leftBD:BitmapData = new BitmapData(10, 1, true, 0x0);
leftBD.fillRect(new Rectangle(5, 0, 5, 1), 0xFF000000);
var downBD:BitmapData = new BitmapData(1, 10, true, 0x0);
downBD.fillRect(new Rectangle(0, 0, 1, 5), 0xFF000000);
var upBD:BitmapData = new BitmapData(1, 10, true, 0x0);
upBD.fillRect(new Rectangle(0, 5, 1, 5), 0xFF000000);

var sp:Sprite = new Sprite();
sp.x = sp.y = 20;
addChild(sp);

function drawLine(w:Number, h:Number):void
{
	var grp:Graphics = sp.graphics;
	grp.clear();

	// right
	grp.lineStyle(1);
	grp.lineBitmapStyle(rightBD);
	grp.lineTo(w, 0);
	grp.endFill();

	// down
	grp.lineStyle(1);
	grp.lineBitmapStyle(downBD);
	grp.lineTo(w, h);
	grp.endFill();

	// left
	grp.lineStyle(1);
	grp.lineBitmapStyle(leftBD);
	grp.lineTo(0, h);
	grp.endFill();

	// up
	grp.lineStyle(1);
	grp.lineBitmapStyle(upBD);
	grp.lineTo(0, 0);
	grp.endFill();
}
drawLine(560, 360);


stage.addEventListener(MouseEvent.MOUSE_DOWN, downListener);
function downListener(e:MouseEvent):void
{
	stage.addEventListener(MouseEvent.MOUSE_MOVE, moveListener);
	stage.addEventListener(MouseEvent.MOUSE_UP, upListener);
	moveListener();
}
function moveListener(e:MouseEvent=null):void
{
	drawLine(sp.mouseX, sp.mouseY);
}
function upListener(e:MouseEvent):void
{
	stage.removeEventListener(MouseEvent.MOUSE_MOVE, moveListener);
	stage.removeEventListener(MouseEvent.MOUSE_UP, upListener);
	moveListener();
}

var timer:Timer = new Timer(150, 0);
timer.addEventListener(TimerEvent.TIMER, timerListener);
function timerListener(e:TimerEvent):void
{
	var c:int;
 
	c = rightBD.getPixel32(9, 0);
	rightBD.scroll(1, 0);
	rightBD.setPixel32(0, 0, c);
 
	c = downBD.getPixel32(0, 9);
	downBD.scroll(0, 1);
	downBD.setPixel32(0, 0, c);
 
	c = leftBD.getPixel32(0, 0);
	leftBD.scroll(-1, 0);
	leftBD.setPixel32(9, 0, c);
 
	c = upBD.getPixel32(0, 0);
	upBD.scroll(0, -1);
	upBD.setPixel32(0, 9, c);
}
timer.start();

코멘트

5의 “ActionScript로 점선 그리기2: Marching Ants”에 대한 답변

  1. 계 아바타

    와옹.. 예전에 어떤분이 빗금이미지에 마스크를 씌워서 한방에 구현한걸 보고 멋있다 한적이 있는데 이건 또 정석인 방법이네요. 감사하게 배워갑니다. ㅎㅎ

    1. Hangun's World 아바타

      인터넷에 검색해 보니, 여러가지 방법중에 비트맵데이터와 lineBitmapStyle() 메소드를 사용한게 가장 깔끔하더라고요. 저도 예전에는 마스크를 씌우는 방법으로 했었는데, 마스크가 워낙 성능저하에 기여를 해서리…

  2. 지돌스타 아바타

    lineBitmapStyle 저런게 있군요. 몰랐다는 ^^;;

    1. Hangun's World 아바타

      저도 이거 만들려고 검색해 보다가 처음 알게 되었다는… ^^a
      앞으로 유용하게 써먹을 데가 있을 것 같아요.

  3. […] 그릴 때, 점선이나 쇄선 등을 지원하지 않아서 만들어 봤습니다. 전에 올린 ActionScript로 점선 그리기2: Marching Ants 글에서 사용한 것과 비슷한 방식으로 BitmapData와 Graphics.beginBitmapFill() 을 […]

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다