Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как получить ширину мувика с маской? (http://www.flasher.ru/forum/showthread.php?t=210129)

djken 30.01.2015 20:40

Как получить ширину мувика с маской?
 
Всем привет.
Всегда мучил такой вопрос:

В мувике два слоя - маска и под ним маскируемый объект.
Почему, когда хочу получить размер мувика
Код AS3:

mc.width

, выдает полный размер, будто в нем нет маски?

Приходится получать размер мувика через
Код AS3:

mc.mask.width

Может есть решение о которм я не знаю?

Заранее спасибо за помощь в данном вопросе :)

caseyryan 30.01.2015 20:56

Цитата:

Почему, когда хочу получить размер мувика
А что он должен выдавать? Маска не меняет никаких размеров. Она только ограничивает область отображения.
Цитата:

Может есть решение о которм я не знаю?
Нет. А чем, собственно, уже найденное решение не устраивает?

djken 30.01.2015 21:09

Устраивает. Думал, может есть решение, которого я не знаю )

nubideus 30.01.2015 22:36

в этом решении есть таракан.
например в mc всего одна точка в 1 пиксель. а маска - квадрат 100 пикселей.
хотя тут нет правильных решений, можно считать прозрачные пиксели, но тоже таракан. можно написать единственное правильное вычисление ширины с учетом векторной маски с нуля, но слишком хардкорно и будет медленно.

in4core 31.01.2015 15:18

nubideus - не выдумывай про затраты.

Код AS3:

if(content.width < mask.width) return content.width
return mask.width

Про прозрачные пиксели это отдельная тема.

nubideus 31.01.2015 16:02

Вложений: 1
in4core, это не правильное решение. как минимум если маска и контент не пересекаются то ширина должна быть 0. getBounds не предлагать, это все равно будет не правильно.

Цитата:

не выдумывай про затраты
вот ты знаешь как graphics data перегнать в полигоны?

самое простое решение - отрисовать весь вектор и весь растр белым цветом в битмапу. что бы прозрачные линии были белыми, и прозрачные области растра тоже белыми.
потом сделать то же для маски, только в другую битмапу. потом сделать AND-наложение двух этих битмап. и только потом считать прозрачные пиксели.
но вообще флеш не так получает ширину клипа, т.е. он не считает пиксели.

Wolsh 31.01.2015 19:59

Цитата:

...белым цветом...
Не проще сложить прямоугольники, создать такую битмапдату и отрисовать в нее объект с маской, а потом уже спокойно найти прямоугольник непрозрачных пикселей?
Хотя, чего складывать-то, маска не над объектом нас и не интересует. Просто отрисовываем замаскированный объект в битмапдату и находим прямоугольник непрозрачности.

nubideus 01.02.2015 12:11

Wolsh, во флеше прозрачные линии и прозрачные картинки считаются.

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

Цитата:

проще сложить прямоугольники
я это опустил что бы описание короче было

Wolsh 01.02.2015 13:32

Цитата:

Wolsh, во флеше прозрачные линии и прозрачные картинки считаются.
Чего делают? Кем считаются, не понял.. getColorBoundsRect() считает то, что скажете. Хоть в альфа-канале, хоть в RGB. Нет никакой проблемы получить прямоугольник, описывающий все пиксели с ненулевой альфой. Лично я именно так понимаю задачу "узнать ширину объекта с наложенной маской" — найти прямоугольник всех видимых пикселей. Что и зачем надо закрашивать, мне непонятно.

nubideus 01.02.2015 13:49

Wolsh, нарисуй прозрачный круг в шейпе и получи ширину шейпа.

Код AS3:

var shape:Shape = new Shape();
shape.graphics.beginFill(0xFFFFFF, 0);
shape.graphics.drawCircle(100, 100, 100);
trace(shape.width); // 200


in4core 01.02.2015 16:01

Цитата:

in4core, это не правильное решение. как минимум если маска и контент не пересекаются то ширина должна быть 0. getBounds не предлагать, это все равно будет не правильно.
Ну, послушай. Прежде чем ставить задачу, надо иметь исходные данные ВСЕ.
По моим исходным данным маска и контент всегда находятся в координатах 0-0 - и это правильное решение. Автор не спрашивает нас про решения в случае если контент за маской. Но даже если так, то достаточно добавить 1 условие

Код AS3:

if(content.x + content.width > mask.x + mask.width) return 0;
if(content.width < mask.width) return content.width
return mask.width

И не надо усложнять - пишите проще

nubideus 01.02.2015 16:47

Цитата:

это правильное решение
in4core, почему твое решение не правильное показано на картинке в 6 посте

Цитата:

И не надо усложнять - пишите проще
что? а давайте вообще не писать ничего, ведь так проще.
тем более тс устраивает отсутствие решения.

Цитата:

Прежде чем ставить задачу, надо иметь исходные данные ВСЕ
а если тз измениться ты будешь делать двойную работу?

ChuwY 05.02.2015 18:50

Код AS3:

package by.ppchu.tests
{
        import flash.display.BitmapData;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.geom.Matrix;
        import flash.geom.Rectangle;
 
        [SWF(width="200", height="200")]
        public class Test4 extends Sprite
        {
 
                public static const CIRCLE_RADIUS:Number = 50;
                public static const SQUARE_SIZE:Number = 200;
 
                private var movie:Sprite = new Sprite();
                private var circle:Sprite = new Sprite();
                private var square:Sprite = new Sprite();
 
                public function Test4()
                {
                        addChild(movie);
 
                        square.graphics.beginFill(0xFF0000, 1);
                        square.graphics.drawRect(0, 0, SQUARE_SIZE, SQUARE_SIZE);
                        movie.addChild(square);
 
                        circle.graphics.beginFill(0, 1);
                        circle.graphics.drawCircle(SQUARE_SIZE / 2, SQUARE_SIZE / 2, CIRCLE_RADIUS);
                        movie.addChild(circle);
 
                        square.mask = circle;
 
                        trace("pixel bounds native : " + movie.transform.pixelBounds);
                        trace("pixel bounds :" + getPixelBounds(movie));
                }
 
                public static function getPixelBounds(sprite:Sprite):Rectangle
                {
                        var matrix:Matrix = new Matrix();
                        var rect:Rectangle = sprite.getBounds(sprite);
                        var bmd:BitmapData = new BitmapData(rect.width, rect.height, true, 0x0);
                        var result:Rectangle;
 
                        rect.x = Math.floor(rect.x);
                        rect.y = Math.floor(rect.y);
                        rect.width = Math.ceil(rect.width);
                        rect.height = Math.ceil(rect.height);
 
                        matrix.tx = -rect.x;
                        matrix.ty = -rect.y;
 
                        bmd.draw(sprite, matrix);
 
                        var w:int = rect.width;
                        var h:int = rect.height;
 
                        result = bmd.getColorBoundsRect(0xFF000000, 0x00000000, false);
 
                        return result;
                }
        }
}

Код:

pixel bounds native : (x=0, y=0, w=200, h=200)
pixel bounds :(x=50, y=50, w=100, h=100)

В первый день появления темы набросал, да отправить забыл.
Решил исправиться. Правда, товарищ Wolsh уже указал на этот путь решения.


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

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