Просмотр полной версии : Копирование объекта класса Sprite
Собственно сабж. Есть объект класса Sprite. Нужно сделать его копию. Перепробовал кучу разных вариантов - ни чего не помогло.
carrotoff
23.03.2012, 17:34
Посмотрите поиском по форуму. Этот вопрос обсуждали много раз.
Вот пример темы (http://www.flasher.ru/forum/showthread.php?t=171813). Вот конкретный рецепт (http://www.flasher.ru/forum/showpost.php?p=1048081&postcount=4). Еще можно скопировать как массив байт
Не могли бы дать линк? А то я страниц 15 на выдаче поиска пролистал - нашел пару вариантов (не конкретно для Sprit'ов), но они не сработали у меня.
Вот тут (http://etcs.ru/as3_tips_and_tricks/deep_object_copies_with_bytearray/) пример (для DO РАБОТАТЬ НЕ БУДЕТ!). Поэтому лучше написать свой метод clone вручную. Если Ваш спрайт статичен, то можно его в BitmapData отрисовать. А вообще не помешало бы чуть больше конкретики.
Вот тут (http://etcs.ru/as3_tips_and_tricks/deep_object_copies_with_bytearray/) пример (если будет вообще для DO работать).
Сделал как там написано:
function clone(source:Object):*
{
var copier:ByteArray = new ByteArray();
copier.writeObject(source);
copier.position = 0;
return(copier.readObject());
}
//spriteA - существует, не нулевой и нормально отрисовывается
var spriteB:Sprite = new Sprite();
spriteB = clone(spriteA) as Sprite;
После всех манипуляций в spriteB попадает null
Если Ваш спрайт статичен, то можно его в BitmapData отрисовать.
Можно поподробнее?
public static function getBitmapDataOf(value: DisplayObject):BitmapData
{
if (value && value.width > 0 && value.height > 0)
{
var bitmapData: BitmapData = new BitmapData(value.width, value.height, true, 0x00000000);
var
m:Matrix = new Matrix();
m.translate(-value.x, -value.y);
m.scale(value.scaleX, value.scaleY);
bitmapData.draw(value, m);
return bitmapData;
}
else
{
return null;
}
}
И как то так:
var spriteB:Sprite = new Sprite();
var bd:BitmapData = getBitmaDataOf(spriteA);
spriteB.addChild(new Bitmap(bd));
Вот пример темы (http://www.flasher.ru/forum/showthread.php?t=171813). Вот конкретный рецепт (http://www.flasher.ru/forum/showpost.php?p=1048081&postcount=4). Еще можно скопировать как массив байт
Пробовал то что там советуют, но заставить это работать не удалось =(.
public static function getBitmapDataOf(value: DisplayObject):BitmapData
{
if (value && value.width > 0 && value.height > 0)
{
var bitmapData: BitmapData = new BitmapData(value.width, value.height, true, 0x00000000);
var
m:Matrix = new Matrix();
m.translate(-value.x, -value.y);
m.scale(value.scaleX, value.scaleY);
bitmapData.draw(value, m);
return bitmapData;
}
else
{
return null;
}
}
И как то так:
var spriteB:Sprite = new Sprite();
var bd:BitmapData = getBitmaDataOf(spriteA);
spriteB.addChild(new Bitmap(bd));
Выдает правильные пропорции, но битмапдата содержит пустое поле (черное, если создавать не прозрачное). Вы говорили, что этот метод для статичных спрайтов - т.е. если исходный спрайт продолжает жить своей жизнью (перемещаться, поворачиваться), то он (метод) непригоден?
Добавлено через 36 минут
Победа! Немного модифицировал ваш код:
public static function getBitmapDataOf(value: DisplayObject):BitmapData
{
if (value && value.width > 0 && value.height > 0)
{
var bitmap: BitmapData = new BitmapData(1600, 1200, true, 0x00CCCCCC);
var m:Matrix = new Matrix();
m.translate(800, 600);
m.scale(value.scaleX, value.scaleY);
bitmap.draw(value, m);
var rect:Rectangle = bitmap.getColorBoundsRect(0xFFFFFFFF, 0x00CCCCCC, false);
var bitmapCut:BitmapData = new BitmapData(rect.width, rect.height, true, 0x00CCCCCC);
bitmapCut.copyPixels(bitmap, rect, new Point(0,0));
bitmap.dispose();
return bitmapCut;
}
else
{
return null;
}
}
MikroAcse
15.04.2012, 23:20
kimagg Неправильно!
var bitmap: BitmapData = new BitmapData(1600, 1200, true, 0x00CCCCCC);
Ужас. Воспользуйтесь классом DisplayTool в моей библиотеке (http://cloud.github.com/downloads/MikroAcse/MikroAcseLibrary/MikroAcse%20AS3%20Library.rar).
Вот:
import com.mikroacse.display.utils.*;
public static function getBitmapDataOf(target:DisplayObject):BitmapData
{
return DisplayTool.toBitmapData(target);
}
Ужас. Воспользуйтесь классом DisplayTool в моей библиотеке. В чем ужос , и поечму брать вашу билиотеку?
MikroAcse
16.04.2012, 01:17
В чем ужос , и поечму брать вашу билиотеку?
BitmapData(1600, 1200,
Ну, можно не мою :)
и что тут не верного в 1600 и 1200 ? Нормальные размеры
То, что размеры можно сразу посчитать с учетом трансформации, не мучаясь с обрезанием.
Ну только в этом случае, я думал разговор идет о том, что так писать нельзя или работать не будет и т.п.
Правильней будет создать ещё один екземпляр класса. Изобретать колесо не нужно!
private var sp:Sprite;
for (var i:uint = 0 ; i < 5 ; i++)
{
sp = new Sprite() ;
sp.graphics.beginFill
sp.graphics.beginFill(0xCC9900, 1) ;
sp.graphics.drawRect(0,0,40,40);
sp.graphics.endFill() ;
sp.x = 50 * i ; // 0, 50 , 100, 150, 200, 250
sp.y = 50 ;
addChild(sp) ;
}
Прикольно. А старый пусть так и болтается, пока контейнер не очистим?
Для копирования графики есть специальный метод Graphics#copyFrom()
Спрайт же, не забываем, это контейнер. То есть мало ли что в нем сидеть может, хоть видео галерея.
Как-то бы обозначить, чего собственно копировать надо.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.