![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Sep 2011
Адрес: Планета Земля
Сообщений: 42
|
Возникла еще одна проблема. Есть два MovieClip-ы (mc1 и mc2), когда они пересекаются выполнятся функция, а когда нет то функция, естественно, выполнятся не должна.
Но она выполняется) Помогите.
__________________
мечта сбываться если она становиться целью... Последний раз редактировалось hunterr; 30.10.2011 в 21:25. |
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
hitTestObject проверяет на столкновение не обьекты, а их bounding box'ы.
Универсальной функции, проверяющей на столкновение именно обьекты - нет.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
|
Регистрация: Sep 2011
Адрес: Планета Земля
Сообщений: 42
|
Тогда как лучше сделать, чтобы все работало?
__________________
мечта сбываться если она становиться целью... |
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Ещё раз - универсальной функции нет. Универсальная, наверное, это попиксельное сравнение (а перед тем растеризация) - это долго.
Можно выделить несколько точек для одного обьекта, таких, что если обьекты пересекаются, то наверняка эти точки на другом обьекте, проверять при помощи hitTestPoint. Можно представить обьекты в виде треугольников или других примитивов и проверять в box2d (или ещё как) их на столкновение. Короче надо смотреть, что за обьекты, какая нужна точность и др.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
|
Регистрация: Sep 2011
Адрес: Планета Земля
Сообщений: 42
|
Ничего толкового в инете найти не могу. Может плохо ищу... Но все же может кто знает какой не будь пример, помогите, дайте ссилку. А я пока еще пороюсь.
__________________
мечта сбываться если она становиться целью... |
|
|||||
|
.
|
|
|
|||||
|
Если памяти не жалко и объекты не большие, можно отрисовать один объект в битмапу одним цветом - второй другим и с блендом и найти в битмапе зону со смешанным цветом. Если эта зона есть - объекты пересеклись, если нету - не пересеклись.
|
|
|||||
|
Регистрация: Sep 2011
Адрес: Планета Земля
Сообщений: 42
|
Наиболее заинтересовал способ который предложил crazyone.
Вот только можно чуть подробнее о том, как его реализовать? А то я слабо понял. Заранее благодарен. Немного уточню. У меня сразу же возникло два глупые вопросы: 1. Что такое битмапа? 2. Что такое блендер?
__________________
мечта сбываться если она становиться целью... Последний раз редактировалось hunterr; 01.11.2011 в 01:40. |
|
|||||
|
Цитата:
2. Не блендер, а BlendMode - один из параметров метода BitmapData.draw(); Мне тут самому интересно стало, я наваял такой вот код. Работает: 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(0x336699); drawCircle(0,0,50); endFill(); } circle.startDrag(true); triangle = new Sprite(); with (triangle.graphics) { beginFill(0x0000FF); 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!"); }else { trace("They do not!"); } } 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.union(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; } } } |
![]() |
![]() |
Часовой пояс GMT +4, время: 08:03. |
|
|
« Предыдущая тема | Следующая тема » |
|
|