AS3 Возможно ли дублировать объект Shape?
Я пытаюсь сделать форму доступной для дублирования. Вот объяснение того, что я сделал, что я пытаюсь сделать, и где я застрял:
- Нарисуйте фигуру вручную в Flash IDE (кисть).
- Создан новый мувиклип, содержащий форму; экспорт как класс.
- Создайте экземпляр класса (var mc:MovieClip = new shapeMovieClip()).
- Добавьте ссылку на нужную форму в mc (var myShape:Shape = mc.getChildAt(0) as Shape;
- Это прекрасно работает, и теперь у меня есть форма, но как я могу скопировать ее, не создавая экземпляр родительского класса MovieClip - возможно ли это?
Я попытался создать новую форму и использовать графический метод copyFrom() безрезультатно, я считаю, что этот метод просто копирует вызовы отрисовки, когда они сделаны на ссылочной графике, и вместо этого у меня просто есть ссылка на форму, которая уже была нарисован.
Прямо сейчас я расширяю мувиклип как спрайт, создаю его экземпляр, извлекаю фигуру из родительского объекта и сохраняю его ссылку, а затем обнуляю спрайт. Кто-нибудь знает лучшую, более легкую стратегию для дублирования фигур таким образом?
2 ответа
В основном зависит от того, нужно ли вам масштабировать ваши фигуры. Если вы этого не сделаете, и вы можете решить эту проблему с помощью растрового представления фигуры фиксированного размера, то вы получите гораздо лучшую производительность, отрисовывая вашу фигуру в BitmapData (она называется растеризацией) и создавая экземпляры растровых объектов (как указали другие комментаторы). из). Код будет выглядеть примерно так:
var base:Sprite = new shapeMovieClip();
var bmd:BitmapData = new BitmapData(base.width, base.height, true, 0);
bmd.draw(base);
var clip1:Bitmap = new Bitmap(bmd);
var clip2:Bitmap = new Bitmap(bmd);
Если вам нужно масштабировать клипы, вы получите пикселизацию с использованием растровых изображений. При уменьшении Bitmap.smoothing может в некоторой степени помочь (также при вращении), но если вам нужно увеличить масштаб, вам, вероятно, придется использовать какое-то mip-отображение. Это в основном создает несколько растровых изображений фигуры на разных уровнях масштаба, а затем меняет их местами в зависимости от текущего масштаба. Кодирование имеет некоторую сложность (использование вспомогательного родителя для настройки масштаба может помочь), но оно определенно будет работать лучше, чем использование множества символов формы (с родителем спрайта или без него).
Это очень старая версия, но она по-прежнему высоко ценится в Google, поэтому я просто хотел поделиться методом точного дублирования фигур:
var shapeonstage:Shape = shapeMadeInIDE;
var g:Vector.<IGraphicsData> = shapeonstage.graphics.readGraphicsData();
var shapecopy:Shape = new Shape();
shapecopy.graphics.drawGraphicsData(g)
И бум. Оно работает. Должен был поделиться этим, потому что это помогло бы мне очень давно и во многих отношениях.
ОБНОВИТЬ:
Я хотел бы добавить некоторые пояснения, почему вы хотели бы использовать этот метод для дублирования И для хранения ссылок на Shapes, которые находятся внутри SWF.
Если вы нацеливаетесь на объект Shape на сцене или в мувиклипе, движок Flash Rendering делает что-то странное. Он будет перезаписывать объекты Shape для рендеринга новой графики, таким образом делая вашу опорную точку Shape для ПОЛНОСТЬЮ другого рендеринга.
Например:
- Создайте флаг с помощью видеоклипа.
- Внутри ролика делают 10 кадров.
- На каждом кадре нарисуйте различную форму
- В вашем коде получите ссылку на фигуру (The Shape on Frame 1)
- Нарисуйте и проверьте свою форму (нарисуйте растровое изображение, затем поставьте BMP на сцену)
- Теперь пусть флеш движок за 5 кадров играет
- Нарисуйте и проверьте свою форму снова
Во второй раз, когда вы рисуете свою фигуру, НИКОГДА не переназначая ссылку на форму, ИНОГДА получат совершенно другую форму.
Просто знайте, эта небольшая причудливость может оставить вас за волосы, если вы не знаете, что ищете:)