Advertisement
Guest User

PixelHitTest

a guest
Nov 1st, 2011
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package  {
  2.     import flash.display.Bitmap;
  3.     import flash.display.BitmapData;
  4.     import flash.display.BlendMode;
  5.     import flash.display.DisplayObject;
  6.     import flash.display.Sprite;
  7.     import flash.events.Event;
  8.     import flash.events.MouseEvent;
  9.     import flash.geom.ColorTransform;
  10.     import flash.geom.Matrix;
  11.     import flash.geom.Point;
  12.     import flash.geom.Rectangle;
  13.    
  14.     /**
  15.      * ...
  16.      * @author DoctorSTaL
  17.      */
  18.     public class PixelHitTest extends Sprite {
  19.         private var triangle:Sprite;
  20.         private var circle:Sprite;
  21.         private var bitmap:Bitmap;
  22.        
  23.         public function PixelHitTest() {
  24.             super();
  25.             addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
  26.         }
  27.         private function addedToStageHandler(event:Event):void {
  28.             removeEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
  29.             init();
  30.         }
  31.        
  32.         // Создаем наши объекты
  33.         private function init():void {
  34.             circle = new Sprite();
  35.             with (circle.graphics) {
  36.                 beginFill(0x700000);
  37.                 drawCircle(0,0,50);
  38.                 endFill();
  39.             }
  40.             circle.startDrag(true);
  41.            
  42.             triangle = new Sprite();
  43.             with (triangle.graphics) {
  44.                 beginFill(0x336699);
  45.                 lineTo(100, 10);
  46.                 lineTo(50, 100);
  47.                 endFill();
  48.             }
  49.             triangle.x = 30;
  50.             triangle.y = 40;
  51.            
  52.             addChild(triangle);
  53.             addChild(circle);
  54.            
  55.             bitmap = new Bitmap(); // Просто, чтобы было видно, что и куда у нас рисуется
  56.             bitmap.y = 250;
  57.             addChild(bitmap);
  58.            
  59.             addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
  60.         }
  61.         private function mouseMoveHandler(event:MouseEvent):void {
  62.             if (realHitTest(circle, triangle)) {
  63.                 trace("They do intersect!");
  64.             }else {
  65.                 trace("They do not intersect!");
  66.             }
  67.         }
  68.        
  69.         private function realHitTest(first:DisplayObject, second:DisplayObject):Boolean {
  70.            
  71.             var fBBox:Rectangle = first.getBounds(this);
  72.             var sBBox:Rectangle = second.getBounds(this);
  73.             if (fBBox.intersects(sBBox)) { // чтобы не делать лишних попиксельных проверок и больших битмап
  74.                 var bounds:Rectangle = fBBox.intersection(sBBox); // общие границы двух объектов
  75.                 var bdata:BitmapData = new BitmapData(bounds.width, bounds.height,false,0); // Битмапа с новыми размерами
  76.                 bitmap.bitmapData = bdata; // Просто, чтобы было видно, что и куда у нас рисуется
  77.                
  78.                 // Отрисовываем первый объект. Обратите внимание на ColorTransform.
  79.                 // За счет оффсетов в нем мы отрисовываем весь объект одним цветом - красным.
  80.                 var fp:Point = globalToLocal(first.localToGlobal(new Point()));
  81.                 var fMtrx:Matrix = new Matrix();
  82.                 fMtrx.translate(fp.x-bounds.x, fp.y-bounds.y);
  83.                 bdata.draw(first, fMtrx, new ColorTransform(1, 1, 1, 1, 255, -255, -255, 0));
  84.                
  85.                 // Накладываем на него другой. Обратите внимание
  86.                 // на BlendMode.ADD - мы добавляем на битмапу второй
  87.                 // объект, но уже зеленым цветом. Зеленым по красному
  88.                 // получается желтый ( 0xff0000 + 0x00ff00 = 0xffff00).
  89.                 var sp:Point = globalToLocal(second.localToGlobal(new Point()));
  90.                 var sMtrx:Matrix = new Matrix();
  91.                 sMtrx.translate(sp.x-bounds.x,sp.y-bounds.y);
  92.                 bdata.draw(second, sMtrx, new ColorTransform(1, 1, 1, 1, -255, 255, -255, 0), BlendMode.ADD);
  93.                
  94.                 // Если в битмапе нет желтого - объекты не накладываются.
  95.                 // Впринципе, можно пользовать threshold, но не знаю - будет ли лучше.
  96.                
  97.                 return !bdata.getColorBoundsRect(0xffffff, 0xffff00).isEmpty();
  98.             }
  99.             bitmap.bitmapData = null;
  100.             return false;
  101.         }
  102.        
  103.    
  104.        
  105.     }
  106.  
  107. }
  108.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement