|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Feb 2012
Сообщений: 1,540
|
Классы. BitmapData и getBounds работают неправильно.
Как вы уже знаете, я создал свой мини класс, который позволят узнать, пересекаются ли сложные объекты.
В классах совсем недавно и поэтому хочу спросить, в чем здесь ошибка?: package MikroacseAS3Lib.HitTest{ import flash.display.Bitmap; import flash.display.BitmapData; import flash.geom.Point; import flash.geom.Matrix; import flash.display.DisplayObject; import flash.display.Sprite; import flash.events.Event public class HitTest extends Sprite{ public var isHit:Boolean; public function HitTest(object1:DisplayObject,object2:DisplayObject) { var bmpd1:BitmapData; var bmpd2:BitmapData; bmpd1 = new BitmapData(object1.getBounds(this).width, object1.getBounds(this).height, true, 0); bmpd2 = new BitmapData(object2.getBounds(this).width, object2.getBounds(this).height, true, 0); bmpd1.draw(object1, new Matrix(1, 0, 0, 1, object1.x, object1.y)); bmpd2.draw(object2, new Matrix(1, 0, 0, 1, object2.x, object2.y)); isHit=bmpd1.hitTest(new Point(), 255, bmpd2, new Point(), 255); if(bmpd1.hitTest(new Point(), 255, bmpd2, new Point(), 255)){ trace('hit!') } bmpd1.dispose(); bmpd2.dispose(); } } } import MikroacseAS3Lib.HitTest.* import flash.events.MouseEvent; import flash.filters.GlowFilter; stage.addEventListener(MouseEvent.MOUSE_DOWN,down) stage.addEventListener(MouseEvent.MOUSE_UP,up) stage.addEventListener(MouseEvent.MOUSE_MOVE,function(){ if(new HitTest(mc1,mc2).isHit){ falsetrue.text='true' mc1.filters=[new GlowFilter(0x0000ff,5,20,20)] trace('hit!') } else { falsetrue.text='false' mc1.filters=[] } }) function down(e:MouseEvent){ try { e.target.startDrag() } catch(e:Error){ } } function up(e:MouseEvent){ try { e.target.stopDrag() } catch(e:Error){ } } Исходник вместе со всеми "прибамбасами": |
|
|||||
А зачем так радикально и некрасиво переделали? Пусть метод HitTest остается статическим. По поводу getBounds:
__________________
Я мало чего умею, но зато хорошо умею учиться... Последний раз редактировалось HardCoder; 13.02.2012 в 22:02. |
|
|||||
Регистрация: Feb 2012
Сообщений: 1,540
|
Цитата:
Битмап создается намного меньшим, чем мувиклип. Т.е. метод draw() действует только а часть мувиклипа. Скачайте исходник и посмотрите сами. Добавлено через 1 минуту Цитата:
Цитата:
|
|
|||||
Ну, здесь хватает увидеть вот это:
Поэтому лучше вернуть все как было изначально и посмотреть пост №3. Не гарантирую что будет работать как надо, но попробуйте.
Добавлено через 44 минуты PS: вот здесь посмотрите как правильно создавать битмапдаты, когда точка регистрации не слева в верхнем углу: http://www.flasher.ru/forum/showthread.php?t=174398
__________________
Я мало чего умею, но зато хорошо умею учиться... Последний раз редактировалось HardCoder; 13.02.2012 в 22:52. |
|
|||||
Регистрация: Feb 2012
Сообщений: 1,540
|
Работает, но странно...
Потому что битмап находится дальше чем мувиклип. Класс: package MikroacseAS3Lib.HitTest{ import flash.display.Bitmap; import flash.display.BitmapData; import flash.geom.Point; import flash.geom.Matrix; import flash.display.DisplayObject; import flash.geom.Rectangle; public class hit{ public function hit() { //constructor } public static function Test(object1:DisplayObject,object2:DisplayObject):Boolean{ var bmpd1:BitmapData; var bmpd2:BitmapData; var bounds1:Rectangle = object1.getBounds(object1); //create Rect's var bounds2:Rectangle = object2.getBounds(object1); var mtrx1:Matrix = new Matrix(); //create Matrix's var mtrx2:Matrix = new Matrix(); var isHit:Boolean; mtrx1.translate(-bounds1.left, -bounds1.top); //translate mtrx2.translate(-bounds2.left, -bounds2.top); bmpd1 = new BitmapData(bounds1.width, bounds1.height, true, 0); //create BitmapData's bmpd2 = new BitmapData(bounds2.width, bounds2.height, true, 0); bmpd1.draw(object1, mtrx1); //draw MovieClips to Bitmap's bmpd2.draw(object2, mtrx2); isHit=bmpd1.hitTest(new Point(), 255, bmpd2, new Point(), 255); // hit test bmpd1.dispose(); //clear Bitmaps bmpd2.dispose(); return isHit; //return false or true } } } import MikroacseAS3Lib.HitTest.* import flash.events.MouseEvent; import flash.filters.GlowFilter; import flash.display.DisplayObject; import flash.events.Event; stage.addEventListener(MouseEvent.MOUSE_DOWN,down) stage.addEventListener(MouseEvent.MOUSE_UP,up) stage.addEventListener(Event.ENTER_FRAME,ef) function ef(e:Event){ falsetrue.text=String( hit.Test(mc1,mc2) ) } function down(e:MouseEvent){ try { e.target.startDrag() setChildIndex(e.target as DisplayObject,numChildren-1) } catch(e:Error){ } } function up(e:MouseEvent){ try { e.target.stopDrag() } catch(e:Error){ } } [IMG]http://i.************/13/4f3960d8bd991.png[/IMG] ---------- [IMG]http://i.************/13/4f39607e8be91.png[/IMG] Добавлено через 57 минут Не могу найти выхода... Такое ощущение, что битмап съезжает на точку регистрации черного круга. |
|
|||||
Только-что еще раз пересмотрел. Здесь есть ошибка:
Надо:
__________________
Я мало чего умею, но зато хорошо умею учиться... |
|
|||||
Регистрация: Feb 2012
Сообщений: 1,540
|
Цитата:
Я хотел сделать что-то типа hitTest только через точку, вот и получилось. Цитата:
Так оно выдает всегда true. Получается мы относим мувиклипы самим к себе. Надо же относить к одному объекту. Или я что-то не понял? Последний раз редактировалось MikroAcse; 14.02.2012 в 18:39. |
Часовой пояс GMT +4, время: 07:07. |
|
« Предыдущая тема | Следующая тема » |
Теги |
AS3 , bitmap , hittest , lib , пересечение |
|
|