PDA

Просмотр полной версии : узнать квадрат непрозрачной части кадра


climfree
02.09.2014, 15:09
Здравствуйте!

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

мувик пока не добавляю. если нужно - скину и его.

старалась объяснить более понятно, не знаю как получилось))

Zebestov
02.09.2014, 15:22
Повесить слушатель на ENTER_FRAME этого 15-кадрового мувика, в каждом кадре брать его getBounds() и производить проверку по критериям "самый большой квадрат" и запоминать нового победителя (номер кадра, сами габариты, что там еще).

ChuwY
02.09.2014, 15:51
getBounds дает не слишком точные результаты, тк прозрачные элементы тоже учитывает.
Я для выбора оптимальных областей для растеризации клипов использую
bmd.getColorBoundsRect (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html#getColorBoundsRect())(0xFF000000, 0xFF000000).
Сначала, естественно, нужно растеризовать кадр.

Навскидку примерно так:

function getFrameBoundsList(mc:MovieClip):Vector.<Rectangle>
{
var numFrames:int = mc.totalFrames;
var list:Vector.<Rectangle> = new Vector.<Rectangle>();

for(var i:int = 1; i <= numFrames; i++)
{
var frameRect:Rectangle;

mc.gotoAndStop(i);

frameRect = getPixelBounds(mc);

list.push(frameRect);
}

return list;
}

function getPixelBounds(sprite:Sprite):Rectangle
{
var rect:Rectangle;
var resRect:Rectangle;
var bmd:BitmapData;
var matrix:Matrix;

rect = sprite.getBounds(sprite);

if(!rect.width || !rect.height)
{
return rect;
}

matrix = new Matrix();
matrix.tx = -Math.floor(rect.x);
matrix.ty = -Math.floor(rect.y);

var resW:int = Math.ceil(rect.width);
var rewH:int = Math.ceil(rect.height);

bmd = new BitmapData(resW, rewH, true, 0x0);
bmd.draw(sprite, matrix);

resRect = bmd.getColorBoundsRect(0xFF000000, 0xFF000000);

return rect;
}