Изменение цвета заливки MovieClip Actionscript 3
-
18-09-2019 - |
Вопрос
я хочу спросить, как изменить только цвет заливки экземпляра на сцене - я могу сделать это с помощью ColorTransform object , но это изменяет цвет всего экземпляра, а не только заливки.Я хочу изменить только цвет заливки, а не цвет обводки.кто-нибудь может мне помочь?
это мой код:
function paint(){
var myColorTransform:ColorTransform = new ColorTransform();
myColorTransform.color = someColorNumber;
coloredObject.transform.colorTransform = myColorTransform;
}
Решение
Это невозможно сделать после того, как вы нарисовали фигуру, поскольку action script не имеет способа определить, что такое обводка, а что такое заливка.
У вас есть пара вариантов.
Разделите заливку и обводку на отдельные видеоролики и настройте преобразование цвета так, чтобы оно применялось только к заливке.
или
Если это простая фигура, нарисуйте ее с помощью графического объекта, где вы можете указать цвета заливки и обводки.
Скорее всего, вытяжка, и мой предпочтительный метод, был бы первым вариантом, поскольку форма, вероятно, будет сложной, и оставление ее в fla дает больший контроль дизайнеру, который может ее изменять, а не разработчику.Однако это немного больше работы и немного сложнее.
Другие советы
Я знаю, что это немного запоздало для игры, но у меня была такая же проблема, и я исправил ее немного по-другому.Возможно, это ничем не поможет, так как будет работать только в ограниченных обстоятельствах *, но я начал с того, что моя фигура была заполнена белым цветом и обведена черным.Таким образом, вы можете применить преобразование цвета с помощью множителей RGB, чтобы уменьшить яркость белого до желаемого цвета, оставив черную рамку нетронутой.Итак, чтобы сделать ваш объект красным (с черной каймой), используйте:
function paint() {
shape.transform.colorTransform = new ColorTransform(1, 0, 0);
}
Или для оранжевого цвета с переполнением стека (все еще с черной каймой):
function paint() {
shape.transform.colorTransform = new ColorTransform(0.996, 0.478, 0.082);
}
* Это сработает только в том случае, если вам нужен только один цвет с черной каймой.
Если вы ориентируетесь на FP10 и вам нужен простой фильтр, подобный тому, что вы пробовали с помощью ColorTransform, вы могли бы написать ядро PixelBlender, которое принимало бы 2 аргумента цветов (один для источника, один для назначения), сопоставляло пиксель с исходным цветом и меняло их местами для назначения;что- то вроде этого:
//I release this under the MIT License. Use it to your heart's content.
<languageVersion : 1.0;>
kernel ReplaceColor
< namespace : "PIPEEP";
vendor : "PiPeep";
version : 1;
description : "Replace color";
>
{
input image4 src;
output pixel4 dst;
parameter pixel4 sColor
<
minValue:pixel4(0.);
maxValue:pixel4(255.);
>;
parameter pixel4 dColor;
parameter float tolerance;
void
evaluatePixel()
{
dst = sampleNearest(src,outCoord());
pixel4 sColorAdjusted = abs((sColor/pixel4(255.)) - dst);
if(sColorAdjusted.r < tolerance && sColorAdjusted.g < tolerance && sColorAdjusted.b < tolerance && sColorAdjusted.a < tolerance) {
dst = dColor;
}
}
}
Помнит, почему он ненавидит среду разработки PixelBlender
Редактировать:Помните, что это не будет хорошо сочетаться со сглаживанием, но если вы используете stage.качество = "низкое", это не будет иметь значения.
Чтобы добавить use it в as3, попробуйте это (украдено из http://scriptplayground.com/tutorials/as/Flash-CS4-and-Pixel-Bender-Overview/, поэтому вам нужно будет изменить несколько строк кода):
Первая часть кода определяет некоторые переменные, которые будут использоваться позже.Единственные два , которые могут выглядеть новыми, - это Shader и ShaderFilter.Это новинка для Flash Игрок 10 и являются ли классы ответственными за обработку пикселя Бендер фильтрует данные.
var loader:URLLoader; var shader:Shader; var shaderFilter:ShaderFilter; var image:MovieClip; var timer:Timer; var timerInt:uint = 40;
Следующим шагом в коде является загрузка изображения на сцену, которое вы добавили на предыдущих шагах.
image = new SampleImage(); image.y = 20; image.x = 25; addChild(image);
Первые два способа должны быть созданы для загрузки файла PBJ и инициализация создание фильтра процесс
function startEffect() { loader = new URLLoader(); loader.dataFormat = URLLoaderDataFormat.BINARY; loader.addEventListener(Event.COMPLETE, loadComplete); loader.load(new URLRequest("sample.pbj")); } function loadComplete(e:Event):void { shader = new Shader(loader.data); initFilter(); }
Следующая функция
initFilter()
является вызываемым после того, как файл pbj успешно загружен, так что фильтр может быть создан.Этот фильтр задает значения цветов r, g, b изображения, что по существу стирает детали с изображения.Тот самый "shader.data.red.value
" для примером является ссылка на пиксель код сгибания, который был написан в начале, если вы заметили, что в коде есть "параметр float red", который является переменной с плавающей точкой для установки уровня red.В этом случае значение устанавливается равным 20.Этот процесс повторяется для двух других цветов, а затем передается экземпляру изображения.Последняя часть этой функции настраивает таймер, который будет запускаться для применения этого фильтра до тех пор, пока изображение не вернется к своему обычному виду
function initFilter() { shader.data.red.value = [20]; shader.data.green.value = [20]; shader.data.blue.value = [20]; shaderFilter = new ShaderFilter(shader); image.filters = [shaderFilter]; timer = new Timer(timerInt, 0); timer.addEventListener(TimerEvent.TIMER, timerHit); timer.start(); }
Заключительная функция повторяет процесс применения фильтра, но сначала получает текущие значения фильтра и вычитает 0,1 из значения для каждого пас.Этот процесс медленно удаляет интенсивность фильтра с изображения до тех пор, пока она полностью не исчезнет.Это
timerHit()
функция вызывается из таймера, который был создан вinitFilter()
функция.function timerHit(e:TimerEvent):void { if(shader.data.red.value == 1) { timer.stop(); return; } var r:uint = shader.data.red.value - 0.1; var g:uint = shader.data.green.value - 0.1; var b:uint = shader.data.blue.value - 0.1; shader.data.red.value = [r]; shader.data.green.value = [g]; shader.data.blue.value = [b]; shaderFilter = new ShaderFilter(shader); image.filters = [shaderFilter]; }
Последним шагом в коде является запуск процесса, который в этом приложении выполняется путем вызова
startEffect()
функция, так что это то, что мы будем делать
startEffect();
Извини, что у тебя из глаз потекла кровь!Я думаю, что это мой самый длинный ответ на данный момент!