Форум 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=213805)

faraday 21.01.2017 03:43

Разделение атласа
 
Приветствую, пытаюсь разделить уже существующий атлас старлинга на исходные пнгшки, затык случился на случаях когда регион повернут на 90 градусов, все что смог сделать - это сначала вырезать из атласа регион, и уже потом его вписывать с поворотом во фрейм. Возможны ли тут более элегантные решения с использованием одной битмапДаты?
Код AS3:

                var sub:SubTexture = atlas.getTexture(name);
                                var regionWidth:Number = sub.rotated ? sub.region.height : sub.region.width;
                                var regionHeight:Number = sub.rotated ? sub.region.width : sub.region.height;
                                var regionData:BitmapData = new BitmapData(regionWidth, regionHeight);
                                regionData.copyPixels(bitmapData, new Rectangle(sub.region.x, sub.region.y, regionWidth, regionHeight), new Point());
                                var frameData:BitmapData = new BitmapData(sub.frame?sub.frame.width:sub.region.width, sub.frame?sub.frame.height:sub.region.height,false);
                                var rot:Matrix = new Matrix();
                                if (sub.rotated){
                                        rot.rotate(Math.PI / 2);
                                        rot.translate(regionHeight,0);
                                }
                                rot.translate(-(sub.frame?sub.frame.x:0), -(sub.frame?sub.frame.y:0))
                                frameData.draw(regionData, rot);


Nooob 24.01.2017 23:48

Зачем в рантайме делить атлас, если его можно нарисовать итак? например в graphics.beginBitmapFill или в общий BitmapData холст каждый кадр
А так решается для повернутых изображений одним draw с нехитрой комбинацией матрицы, а для не повернутых и вовсе одного copyPixels достаточно
cos(90°) = 0
sin(90°) = 1

Код AS3:

var sub:SubTexture       = atlas.getTexture(name);
var frame:Rectangle      = sub.frame || new Rectangle(0, 0, sub.rotated ? sub.region.height : sub.region.width, sub.rotated ? sub.region.width : sub.region.height);
var frameData:BitmapData = new BitmapData(frame.width, frame.height, true, 0x0);
if (sub.rotated)
{
        var matrix:Matrix  = new Matrix(0, -1, 1, 0, -frame.x - sub.region.y, -frame.y + sub.region.x + sub.region.width);
        var rect:Rectangle = new Rectangle(-frame.x, -frame.y, sub.region.height, sub.region.width);
        frameData.draw(bitmapData, matrix, null, null, rect);
}
else
{
        frameData.copyPixels(bitmapData, sub.region, new Point(-frame.x, -frame.y), null, null, false);
}


faraday 25.01.2017 17:22

Спасибо за ответ, попробую.
в рантайме, потому что это именно приложение анпакера. на входе атлас - на выходе zip архив с разделенными файлам


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

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