Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Функция по пересечению MovieClip-ов (http://www.flasher.ru/forum/showthread.php?t=170699)

hunterr 30.10.2011 21:15

Функция по пересечению MovieClip-ов
 
Возникла еще одна проблема. Есть два MovieClip-ы (mc1 и mc2), когда они пересекаются выполнятся функция, а когда нет то функция, естественно, выполнятся не должна.
Но она выполняется)
Помогите.

Код AS3:

stop();
 
addEventListener(Event.ENTER_FRAME, frameList);
function frameList(e:Event):void{
 
    mc1.hitTestObject(mc2);
    trace(mc1.hitTestObject(mc2));
    if(mc1.hitTestObject(mc2) == true){
                play();
        }
}


-De- 30.10.2011 22:27

hitTestObject проверяет на столкновение не обьекты, а их bounding box'ы.
Универсальной функции, проверяющей на столкновение именно обьекты - нет.

hunterr 30.10.2011 22:40

Тогда как лучше сделать, чтобы все работало?

-De- 30.10.2011 23:38

Ещё раз - универсальной функции нет. Универсальная, наверное, это попиксельное сравнение (а перед тем растеризация) - это долго.
Можно выделить несколько точек для одного обьекта, таких, что если обьекты пересекаются, то наверняка эти точки на другом обьекте, проверять при помощи hitTestPoint. Можно представить обьекты в виде треугольников или других примитивов и проверять в box2d (или ещё как) их на столкновение.
Короче надо смотреть, что за обьекты, какая нужна точность и др.

PainKiller 30.10.2011 23:40

Сделать массив hitTestPoint'ов, расставить их по периметру картинки которая проверяется на столкновения, и проверять этот массив на столкновение с вашим мувиклипом. Примеры по моему в инете были.

hunterr 31.10.2011 00:57

Ничего толкового в инете найти не могу. Может плохо ищу... Но все же может кто знает какой не будь пример, помогите, дайте ссилку. А я пока еще пороюсь.

dimarik 31.10.2011 10:08

http://noregret.org/tutor/n/

crazyone 31.10.2011 13:51

Если памяти не жалко и объекты не большие, можно отрисовать один объект в битмапу одним цветом - второй другим и с блендом и найти в битмапе зону со смешанным цветом. Если эта зона есть - объекты пересеклись, если нету - не пересеклись.

hunterr 31.10.2011 23:13

Наиболее заинтересовал способ который предложил crazyone.
Вот только можно чуть подробнее о том, как его реализовать? А то я слабо понял.
Заранее благодарен.

Немного уточню. У меня сразу же возникло два глупые вопросы:
1. Что такое битмапа?
2. Что такое блендер?

Vektor 01.11.2011 08:54

Может, так.
Цитата:

if(mc1.hitTestObject(mc2)){
play();
}else{
removeEventListener(Event.ENTER_FRAME., frameList)
stop();
}
Цитата:

выполнятся функция, а когда нет то функция, естественно, выполнятся не должна.
Event.ENTER_FRAME
Функция выполнятся потому что ENTER_FRAME надо удалять.
removeEventListener(Event.ENTER_FRAME., frameList)

incvizitor 01.11.2011 12:23

hunterr, конкретно в вашем случае чем являются объекты? Окружности, многоугульники или же это произвольные формы. Если второе, то возможно ли расмотреть объекты как окружности?

crazyone 01.11.2011 15:02

Цитата:

Сообщение от hunterr (Сообщение 1042839)
Наиболее заинтересовал способ который предложил crazyone.
Вот только можно чуть подробнее о том, как его реализовать? А то я слабо понял.
Заранее благодарен.

Немного уточню. У меня сразу же возникло два глупые вопросы:
1. Что такое битмапа?
2. Что такое блендер?

1. BitmapData;
2. Не блендер, а BlendMode - один из параметров метода BitmapData.draw();

Мне тут самому интересно стало, я наваял такой вот код. Работает:

Код AS3:

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;
                }
 
 
 
        }
 
}


hunterr 01.11.2011 21:07

Все! Наконец-то работает! Огромное спасибо всем!


Часовой пояс GMT +4, время: 11:43.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.