Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package {
- import flash.display.Bitmap;
- import flash.display.BitmapData;
- import flash.display.BlendMode;
- import flash.display.DisplayObject;
- import flash.display.Sprite;
- import flash.events.Event;
- import flash.events.MouseEvent;
- import flash.geom.ColorTransform;
- import flash.geom.Matrix;
- import flash.geom.Point;
- import flash.geom.Rectangle;
- /**
- * ...
- * @author DoctorSTaL
- */
- public class PixelHitTest extends Sprite {
- private var triangle:Sprite;
- private var circle:Sprite;
- private var bitmap:Bitmap;
- public function PixelHitTest() {
- super();
- addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
- }
- private function addedToStageHandler(event:Event):void {
- removeEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
- init();
- }
- // Создаем наши объекты
- private function init():void {
- circle = new Sprite();
- with (circle.graphics) {
- beginFill(0x700000);
- drawCircle(0,0,50);
- endFill();
- }
- circle.startDrag(true);
- triangle = new Sprite();
- with (triangle.graphics) {
- beginFill(0x336699);
- lineTo(100, 10);
- lineTo(50, 100);
- endFill();
- }
- triangle.x = 30;
- triangle.y = 40;
- addChild(triangle);
- addChild(circle);
- bitmap = new Bitmap(); // Просто, чтобы было видно, что и куда у нас рисуется
- bitmap.y = 250;
- addChild(bitmap);
- addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
- }
- private function mouseMoveHandler(event:MouseEvent):void {
- if (realHitTest(circle, triangle)) {
- trace("They do intersect!");
- }else {
- trace("They do not intersect!");
- }
- }
- private function realHitTest(first:DisplayObject, second:DisplayObject):Boolean {
- var fBBox:Rectangle = first.getBounds(this);
- var sBBox:Rectangle = second.getBounds(this);
- if (fBBox.intersects(sBBox)) { // чтобы не делать лишних попиксельных проверок и больших битмап
- var bounds:Rectangle = fBBox.intersection(sBBox); // общие границы двух объектов
- var bdata:BitmapData = new BitmapData(bounds.width, bounds.height,false,0); // Битмапа с новыми размерами
- bitmap.bitmapData = bdata; // Просто, чтобы было видно, что и куда у нас рисуется
- // Отрисовываем первый объект. Обратите внимание на ColorTransform.
- // За счет оффсетов в нем мы отрисовываем весь объект одним цветом - красным.
- var fp:Point = globalToLocal(first.localToGlobal(new Point()));
- var fMtrx:Matrix = new Matrix();
- fMtrx.translate(fp.x-bounds.x, fp.y-bounds.y);
- bdata.draw(first, fMtrx, new ColorTransform(1, 1, 1, 1, 255, -255, -255, 0));
- // Накладываем на него другой. Обратите внимание
- // на BlendMode.ADD - мы добавляем на битмапу второй
- // объект, но уже зеленым цветом. Зеленым по красному
- // получается желтый ( 0xff0000 + 0x00ff00 = 0xffff00).
- var sp:Point = globalToLocal(second.localToGlobal(new Point()));
- var sMtrx:Matrix = new Matrix();
- sMtrx.translate(sp.x-bounds.x,sp.y-bounds.y);
- bdata.draw(second, sMtrx, new ColorTransform(1, 1, 1, 1, -255, 255, -255, 0), BlendMode.ADD);
- // Если в битмапе нет желтого - объекты не накладываются.
- // Впринципе, можно пользовать threshold, но не знаю - будет ли лучше.
- return !bdata.getColorBoundsRect(0xffffff, 0xffff00).isEmpty();
- }
- bitmap.bitmapData = null;
- return false;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement