[AS3] AS3 內建的 BitmapData.hitTest()方法 - 像素級碰撞偵測
A. BitmapData.hitTest() 似乎是個常被忽略的方法
B. 這與 DisplayObject 的 hitTestObject() 或 hitTestPoint() 方法的能耐截然不同
1010102_BitmapData.hitTest.swf
→ 操作:拖曳藍或黃球彼此碰撞,偵測結果顯示為true或false。
BitmapData.hitTest()方法:
BitmapData.hitTest(firstPoint:Point, firstAlphaThreshold:uint, secondObject:Object, secondBitmapDataPoint:Point = null, secondAlphaThreshold:uint = 1):Boolean
A. BitmapData.hitTest() 似乎是個常被忽略的方法
B. 這與 DisplayObject 的 hitTestObject() 或 hitTestPoint() 方法的能耐截然不同
1010102_BitmapData.hitTest.swf
→ 操作:拖曳藍或黃球彼此碰撞,偵測結果顯示為true或false。
package { import flash.display.MovieClip; import fl.motion.easing.Back; import flash.display.Bitmap; import flash.display.Sprite; import flash.events.MouseEvent; import flash.events.Event; import flash.geom.Point; import flash.text.TextField; public class Main extends MovieClip { private var bmdBallBlue:BmdBallBlue; private var bmdBallYellow:BmdBallYellow; private var bmBlue:Bitmap; private var bmYellow:Bitmap; private var blueSprite:Sprite; private var yellowSprite:Sprite; public var info:TextField; public function Main() { this.initObject(); this.addMouseListener(); return; } private function initObject():void{ this.bmdBallBlue = new BmdBallBlue(145,145,true,0xFFFFFFFF); this.bmdBallYellow = new BmdBallYellow(145,145,true,0xFFFFFFFF); this.bmBlue = new Bitmap(this.bmdBallBlue); this.bmYellow = new Bitmap(this.bmdBallYellow); /*this.bmBlue.x = -this.bmBlue.width/2; this.bmBlue.y = -this.bmBlue.height/2; this.bmYellow.x = -this.bmYellow.width/2; this.bmYellow.y = -this.bmYellow.height/2;*/ this.blueSprite = new Sprite(); this.yellowSprite = new Sprite(); this.blueSprite.x = 30; this.blueSprite.y = 30; this.yellowSprite.x = 350; this.yellowSprite.y = 220; this.addChild(this.blueSprite); this.addChild(this.yellowSprite); this.blueSprite.addChild(this.bmBlue); this.yellowSprite.addChild(this.bmYellow); this.info.border = true; this.info.borderColor = 0xFF0000; this.info.background = true; this.info.backgroundColor = 0xFF0000; return; } private function addMouseListener():void{ this.stage.addEventListener(MouseEvent.MOUSE_DOWN,mouseHandler); this.stage.addEventListener(MouseEvent.MOUSE_UP,mouseHandler); return; } private function mouseHandler(event:MouseEvent):void{ var tmpSprite:Sprite = event.target as Sprite; /*trace("tmpSprite : " + tmpSprite);*/ switch(event.type){ case "mouseDown": if(tmpSprite != null){ this.drapMethod(tmpSprite); this.stage.addEventListener(MouseEvent.MOUSE_MOVE,mouseHandler); } break; case "mouseUp": if(tmpSprite != null){ this.stopDrapMethod(tmpSprite); } break; case "mouseMove": if(tmpSprite != null){ bmdHitTest(); } break; default: break; } return; } private function drapMethod(_targetObject:Sprite):void{ _targetObject.startDrag(false); return; } private function stopDrapMethod(_targetObject:Sprite):void{ _targetObject.stopDrag(); return; } /* AS3 的 BitmapData 像素級碰撞偵測 */ private function bmdHitTest():void{ var bmdBallBluePoint:Point = new Point(this.blueSprite.x, this.blueSprite.y); var bmdBallYellowPoint:Point = new Point(this.yellowSprite.x, this.yellowSprite.y); var isHit:Boolean = this.bmdBallBlue.hitTest(bmdBallBluePoint,0x55,bmdBallYellow,bmdBallYellowPoint,0x55); this.info.text = isHit.toString(); return; } } }
● startDrag()和stopDrag()方法由Sprite類別所定義
沒有留言:
張貼留言