- 충돌을 감지하면서 복제하기.
[code as3]
package
{
import flash.display.Sprite;
import flash.events.Event;
public class Duplicate_collision extends Sprite
{
public function Duplicate_collision()
{
super();
config();
}
private var holder:Array = new Array();
private function config() : void
{
stage.frameRate = 40;
stage.addEventListener( Event.ENTER_FRAME, enterFrameHandler );
}
private function enterFrameHandler( e:Event ) : void
{
var box:Sprite = new Seed();
box.x = Math.random() * stage.stageWidth;
box.y = Math.random() * stage.stageHeight;
box.scaleX = Math.random() * 2;
holder.push( box );
if( isOK( box ) )
{
addChild( box );
var glow:GlowFilter = new GlowFilter();
glow.color = Math.random() * 0xFFFFFF;
box.filters = [ glow ];
}
else
{
holder.pop();
}
}
private function isOK( mc:Sprite ) : Boolean
{
var i:int = 0;
var count:Number = holder.length - 1;
for( i = 0; i < count; i++ )
{
var flag:Boolean = holder[i].hitTestObject( mc );
if( flag )
{
return false;
break;
}
}
return true;
}
}
}
[/code]
-> 이 예제는 객체를 만들때 이전에 만들었던 표시 객체와 같은 위치에 나타내지 않도록 하는 것이다.
앞에서 했던 충돌감지 메소드 hitTestObject()를 사용하여 먼저 만들어진 객체와 새로 만들어진 객체가
충돌되지 않는 위치에 배치하는 것이다.
15번째 줄에서 holder는 밑에서 만들 별모양의 표시객체를 참조할 Array이다. 앞전에 만들어진 객체와
현재 만들어진 객체의 충돌을 감지하기 위해서 Array의 인덱스를 사용해 비교하면 편하고 참조를 통해
빠르게 비교할 수 있기 때문이다. 객체를 단지 한 두개를 비교할 때가 아닌 지금처럼 많은 객체들이 있어
비교할 때는 Array를 사용하면 보다 편하다.
33번째 줄에서 Array로 만든 holder에 push()메서드를 이용하여 배열에 끝에 넣는다.

19번째 줄에서 frameRate는 흔히 fla파일에서 보는 fps(Frame Per Second)를 액션스크립트에서 설
정해주는 것이다. 초당 프레임으로 1초당 40프레임으로 속도를 변경해주었다.
그 다음 stage에 이벤트를 추가해주었다. EnterFrame 이벤트를 추가해주어 enterFrameHandler를 보면,
box를 앞에서와 마찬가지로 Sprite를 확장한 클래스인 Seed클래스로 생성하여 주었고, 랜덤하게 위치를
stage안에서만 생성되도록 해주었다. 가끔 밖으로 별이 튀어 나가는 것은 별 객체의 중심점이 가운데로
설정되어 있어서 이다.
35번째줄에서 if문 조건에서 isOK() 함수값이 true이면 즉, isOK()함수의 반환값이 Boolean값인데 그
box가 (매개변수로는 mc가 되겠다) 이전에 만들어진 array에 들어있는 객체들과 모두 hitTestObject로 겹
침여부를 비교 하였을 때 겹쳐졌으면 즉 flag = true면 isOK()함수 반환값이 false이므로 pop()해주고,
만약 반대로 겹치지 않았다면 리턴값이 true이므로 box를 addChild()를 해준다.
addChild를 해준 후 화면에서 보이는 바와 같이 앞전 예제에서 했던 GlowFilter클래스와 random함수를
이용하여 테두리색이 랜덤으로 나오게 해준다. 랜덤으로 나오게 하기 위해서 GlowFilter에서 glow라는
객체를 생성하고 그 객체에 color 속성으로 랜덤한 색상을 넣어준다음 box에 filters 속성으로 이용해
glow객체에서 나온 랜덤한 색상을 적용시켜 주는것이 43번째까지의 내용이다.
만약 if문에서의 조건이 false라면은 pop()을 해주는데, pop() 메소드는 push()메소드와 반대로 꺼내는
메소드이다. 여기서 꺼내주는 이유는 위 예제에서 box를 Sprite로 생성시키자마자 holder array에 곧바로
push를 시켜주는데 if문 조건이 false라는 의미가 겹쳐졌다라는 말이므로 addChild를 시켜줄 필요도 없고
glow를 적용시킬 필요도 없으므로 곧바로 넣어주었던 box를 다시 꺼내는 것이다(pop).
pop() 메소드는 이렇게 이해하면 되겟다.

댓글 없음:
댓글 쓰기