Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Определение крайних точек клипа (http://www.flasher.ru/forum/showthread.php?t=108580)

FlashRus 24.02.2008 21:11

Определение крайних точек клипа
 
У меня имеются два мувика, которые реагируют друг на друга с помощью hitTest. Одному из этих мувиков должны присваиваться координаты вершины другого при их столкновении. Моя проблема заключается в том что я не могу определить вершину моего мувика. Помогите плиз.

Kuruki 24.02.2008 22:02

А они у тебя какой формы?

FlashRus 25.02.2008 07:35

Один прямоугольный, а второй... э.. как бы сказать... в виде испорченного овала.

Kuruki 25.02.2008 20:32

Насколько я знаю, вершины есть только у треугольников. Я не знаю, что такое вершина у прямоугольнника или овала, объясни, что ты имеешь ввиду.

Fernando Costa 25.02.2008 20:40

если имеется ввиду нахождение крайних точек(верхней, левой, правой, нижней) то самый действенный способ - bitmapData, если вы такое реализуете то вы охрененный пацан :)

iNils 25.02.2008 20:50

Код:

import flash.display.BitmapData;
import flash.geom.*;

/**
* Класс BoundPoints позволяет находить координаты крайних точек объекта касающихся прямоугольной рамки описанной вокруг объекта.
*
* Точки находятся с помощью определения уровня прозрачности точек по периметру рамки описанной вокруг объекта. Все точки имеющие уровень прозрачности 1-255 считаются крайними. Однако с помощью параметра limit метода getPoints, можно задать диапазон прозрачности, в пределах которого метод будет возвращать массив точек.
*
* Поиск координат крайних точек проводится относительно самого объекта. Для преобразования координат точек в другое пространство координат, воспользуйтесь методам <code>MovieCLip.localToGlobal</code> и <code>MovieCLip.globalToLocal</code>. Также такие виды трансформации как поворот или скос не учитываются. Однако можно найти крайние точки у растрового изображение с поддержкой альфа-канала (экземпляр BitmapData), полученного из мувиклипа с учетом матрицы трансформации.
*
* @author iNils
* @version 1.0
*/
class ru.inils.object.BoundPoints extends Object {
        private var __bmp:BitmapData = null;
        private var __t:Array = null;
        private var __b:Array = null;
        private var __l:Array = null;
        private var __r:Array = null;
        private var __a:Array = null;
       
        /**
        * Конструктор класса.
        * Создает новый экземпляр BoundPoints.
        * @param        mc - Мувиклип, координаты крайних точек которого надо найти.
        *
        * @return        Ничего.
        */
        function BoundPoints (mc:Object) {
                __t = new Array ();
                __b = new Array ();
                __l = new Array ();
                __r = new Array ();
                __a = new Array ();
               
                var o:Object = mc.getBounds ();
                var w:Number = o.xMax - o.xMin;
                var h:Number = o.yMax - o.yMin;
                var tx:Number = -o.xMin;
                var ty:Number = -o.yMin;

               
                __bmp = new BitmapData (w--, h--, true, 0xFF);
                __bmp.draw (mc, new Matrix (1, 0, 0, 1, tx, ty));
               
                var mca = mc._parent.createEmptyMovieClip ("mca" + mc._parent.getNextHighestDepth (), mc._parent.getNextHighestDepth ())
                mca.attachBitmap (__bmp, 0);
                mca._x = mc._x;
                mca._y = 300;
               
                var alpha:Number = null;
               
                for (var i:Number = 0; i < h + 1; i++) {
                        alpha = __bmp.getPixel32 (0, i) >> 24 & 0xFF;
                        if (alpha > 0) {
                                __l.push ({x:-tx, y:i - ty, level:alpha});
                        }
                       
                        alpha = __bmp.getPixel32 (w, i) >> 24 & 0xFF;
                        if (alpha > 0) {
                                __r.push ({x:w - tx, y:i - ty, level:alpha});
                        }
                }
               
                for (var i:Number = 0; i < w + 1; i++) {
                        alpha = __bmp.getPixel32 (i, 0) >> 24 & 0xFF;
                        if (alpha > 0) {
                                __t.push ({x:i - tx, y:-ty, level:alpha});
                        }

                        alpha = __bmp.getPixel32 (i, h) >> 24 & 0xFF;
                        if (alpha > 0) {
                                __b.push ({x:i - tx, y:h - ty, level:alpha});
                        }
                }
                __t.sortOn ("level", Array.NUMERIC);
                __t.reverse ();
                __b.sortOn ("level", Array.NUMERIC);
                __b.reverse ();
                __l.sortOn ("level", Array.NUMERIC);
                __l.reverse ();
                __r.sortOn ("level", Array.NUMERIC);
                __r.reverse ();
                __a = __t.concat (__b, __l, __r);
                __a.sortOn ("level", Array.NUMERIC);
                __a.reverse ();
        }
       
        /**
        * Метод.
        * Находит координаты крайних точек для заданной стороны и уровня прозрачности, и возвращает их в виде массива объектов.
        *
        * @param        side [дополнительный параметр] - Сторона, для которой нужно найти точки. Может принимать следующие значения: "top" (крайние верхние), "bottom" (крайние нижние), "left" (крайние левые), "right" (крайние правые) и "all" (все стороны). По умолчания используется "all".
        * @param        limit [дополнительный параметр] - Граница уровня прозрачности точки, в пределах которой точка считается крайней. По умолчанию выводятся все точки.
        * @param        useAbsolute [дополнительный параметр] - Булево значение, при <code>true<code> - показывающие надо ли использовать абсолютное значение параметра <code>limit<code>, все точки с уровнем прозрачности ниже <code>limit<code>, будут отбрасываться. При <code>false<code> - границей считается разница между уровнем прозрачностью точки с макслимальным значением и <code>limit<code>, все точки с уровнем прозрачности ниже этой разницы, будут отбрасываться. По умолчанию имеет значение <code>false<code>.
        *
        * @return        Массив объектов со свойствами <code>x</code> (координата точки по оси X), <code>y</code> (координата точки по оси Y) и <code>level</code> (уровень прозрачности точки [1-255]).
        */
        public function getPoints (side:String, limit:Number, useAbsolute:Boolean):Array {
                var array:Array = null;
                side = side.toLowerCase ();
                switch (side) {
                        case "top":
                                array = __t;
                                break;
                        case "bottom":
                                array = __b;
                                break;
                        case "left":
                                array = __t;
                                break;
                        case "right":
                                array = __r;
                                break;
                        case "all":
                                array = __a;
                                break;
                        default:
                                array = __a;
                }
                       
                if (limit == undefined) {
                        return array;
                } else {
                        if (!useAbsolute) {
                                limit = array[0].level - limit;
                        }
                        var len:Number = array.length;
                        var id:Number = 0;
                        for (var i:Number = 0; i < len; i++) {
                                if (array[i].level < limit) {
                                        break;
                                } else {
                                        id++;
                                }
                        }
                        return array.slice(0, id);
                }
        }
}


Fernando Costa 25.02.2008 20:58

ну вот :)

FlashRus 25.02.2008 21:11

Я тут полистал Гурского и наткнулся на метод getBounds, который как я понял находит максимальные и минимальные точки указанного клипа по координатам другого. Но я не понял как им пользоваться...

Цитата:

вершины есть только у треугольников
Извеняюсь за безграмотность. Неправильно выразился.


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

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