AS3 자체 충돌 탐지 방법 3가지
DisplayObject의 hitTestObject()//두 디스플레이 객체가 충돌했는지 체크(투박하게)
DisplayObject의 hitTestPoint()//점 하나가 디스플레이 객체와 충돌하는지 확인
BitmapData의 hitTest()//픽셀급 충돌 탐지
1. DisplayObject의 hitTestObject():
두 디스플레이 객체가 충돌했는지 체크합니다.
이것은 가장 거친 충돌이다. 두 개의 가시 대상 (DisplayObject) 의 테두리가 겹치면 두 개의 충돌로 간주된다
package
{
import flash.display.MovieClip;
import flash.display.Shape;
import flash.events.Event;
import flash.text.TextField;
/**
* : (DisplayObject) ,
*
*/
public class HitTestObject_test extends MovieClip
{
private var circle1:Shape;
private var circle2:Shape;
private var msg:TextField;
public function HitTestObject_test()
{
circle1 = new Shape();
circle1.graphics.beginFill(0xFF0000);
circle1.graphics.drawCircle(0, 0, 40);
circle1.x = 100;
circle1.y = 100;
addChild(circle1);
circle2 = new Shape();
circle2.graphics.beginFill(0x00FF00);
circle2.graphics.drawCircle(0, 0, 40);
circle2.x = 50;
addChild(circle2);
msg = new TextField();
msg.selectable = false;
addChild(msg);
this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}
private function enterFrameHandler(e:Event):void
{
circle2.x = mouseX;
circle2.y = mouseY;
if(circle1.hitTestObject(circle2))
msg.text = "hit";
else
msg.text = "no hit";
msg.x = mouseX + 20;
msg.y = mouseY;
}
}
}
2. DisplayObject의 hitTestPoint()
점이 표시된 객체와 충돌하는지 체크합니다.
package
{
import flash.display.MovieClip;
import flash.display.Shape;
import flash.events.Event;
import flash.text.TextField;
/**
* x y
*
*/
public class HitTestPoint_Test extends MovieClip
{
private var circle:Shape;
private var msg:TextField;
public function HitTestPoint_Test()
{
circle = new Shape();
circle.graphics.beginFill(0x0000FF, 0.5);
circle.graphics.drawCircle(0, 0, 40);
circle.x = 100;
circle.y = 100;
this.addChild(circle);
msg = new TextField();
msg.multiline = true;
msg.height = 50;
msg.selectable = false;
addChild(msg);
this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}
private function enterFrameHandler(e:Event):void
{
if(circle.hitTestPoint(mouseX, mouseY, true)) // ( true)
msg.text = "hit";
else
msg.text = "no hit";
if(circle.hitTestPoint(mouseX, mouseY, false)) // ( true)
msg.text += "
hit";
else
msg.text += "
no hit";
msg.x = mouseX + 20;
msg.y = mouseY;
}
}
}
flash.display.DisplayObject.hitTestPoint(x:Number, y:Number, shapeFlag:Boolean=false):Boolean 참고 사항:
1. 검측점의 좌표(첫 번째, 두 개 파라미터)는 전체 무대를 좌표계로 해야 하며 이 가시적인 대상의 부모 용기를 좌표계로 할 수 없다.
2. 세 번째 파라미터가true일 때는 실제 이미지를 기준으로 하고(실제 이미지를 만났을 때 충돌이 발생했다고 생각하며)false일 때는 테두리를 기준으로 한다(테두리를 만났을 때 충돌이 발생했다고 생각한다).
3. BitmapData의 hitTest()
픽셀급의 충돌 검측
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Point;
import flash.text.TextField;
public class HitTest_Test extends MovieClip
{
private var bm1:Bitmap;
private var bm2:Bitmap;
private var msg:TextField;
public function HitTest_Test()
{
var sp1:Sprite = new Sprite();
sp1.graphics.beginFill(0xff0000, 0.5);
sp1.graphics.drawCircle(50, 50, 50);
sp1.graphics.endFill();
var bmd1:BitmapData = new BitmapData(sp1.width, sp1.height, true, 0);
bmd1.draw(sp1);
bm1 = new Bitmap(bmd1);
bm1.x = 150;
bm1.y = 150;
this.addChild(bm1);
var sp2:Sprite = new Sprite();
sp2.graphics.beginFill(0, 0.8);
sp2.graphics.drawCircle(10, 10, 10);
var bmd2:BitmapData = new BitmapData(sp2.width, sp2.height, true, 0);
bmd2.draw(sp2);
bm2 = new Bitmap(bmd2);
this.addChild(bm2);
msg = new TextField();
msg.selectable = false;
addChild(msg);
this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}
private function enterFrameHandler(e:Event):void
{
bm2.x = mouseX-0.5*bm2.width;
bm2.y = mouseY-0.5*bm2.height;
msg.x = mouseX+20;
msg.y = mouseY;
if (bm1.bitmapData.hitTest(new Point(bm1.x, bm1.y), 127, bm2.bitmapData, new Point(bm2.x, bm2.y), 128))
{
msg.text ="hit";
}
else
{
msg.text ="no hit";
}
}
}
}
flash.display.BitmapData.hitTest(firstPoint:Point, firstAlphaThreshold:uint, secondObject:Object, secondBitmapDataPoint:Point=null, secondAlphaThreshold:uint=1):Boolean 참고 사항:
1.firstPoint는 일반적으로 첫 번째bitmap의 왼쪽 상단점,secondBitmapDataPoint는 일반적으로 두 번째bitmap의 왼쪽 상단점으로 두 번째는 반드시 같은 좌표계를 참조해야 한다.
2. firstAlphaThreshold는 첫 번째bitmap에서 충돌 검측에 참여하는 픽셀의 최소 알파값을 나타낸다. 즉, 첫 번째bitmap의 픽셀점은 그 알파값이 firstAlphaThreshold보다 크면 충돌 검측에 참여할 수 있다.
3. secondAlphaThreshold는 두 번째bitmap에서 충돌 검측에 참여하는 픽셀의 최소 알파값을 나타낸다. 즉, 두 번째bitmap의 픽셀점은 알파값이 firstAlphaThreshold보다 클 때만 충돌 검측에 참여할 수 있다.
4. secondObject는 BitmapData 외에도 Rectangle, Point 또는 Bitmap일 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.