Изменение цвета заливки MovieClip Actionscript 3 - PullRequest
7 голосов
/ 28 апреля 2009

Я хочу спросить, как изменить только цвет заливки экземпляра на сцене - я могу сделать это с помощью объекта ColorTransform, но он меняет цвет всего экземпляра, а не только заливки. Я хочу изменить только цвет заливки, а не цвет обводки. кто-нибудь может мне помочь?

это мой код:

function paint(){
    var myColorTransform:ColorTransform = new ColorTransform();

    myColorTransform.color = someColorNumber;

    coloredObject.transform.colorTransform = myColorTransform;

}

Ответы [ 3 ]

5 голосов
/ 01 октября 2009

Я знаю, что это немного поздно для игры, но у меня была та же проблема, и я исправил ее немного по-другому. Возможно, это не поможет, так как будет работать только в ограниченных обстоятельствах *, но я начал с того, что моя форма была заполнена белым и поглажена черным. Таким образом, вы можете применить цветовое преобразование с RGB-множителями, чтобы уменьшить белый цвет до желаемого, оставляя черную рамку без изменений. Поэтому, чтобы сделать ваш объект красным (с черной рамкой), используйте:

function paint() {
    shape.transform.colorTransform = new ColorTransform(1, 0, 0);
}

Или для оранжевого переполнения стека (все еще с черной рамкой):

function paint() {
    shape.transform.colorTransform = new ColorTransform(0.996, 0.478, 0.082);
}

* Это будет работать только в том случае, если вам нужен только один цвет с черной рамкой.

5 голосов
/ 28 апреля 2009

Это невозможно сделать после того, как вы нарисовали фигуру, поскольку сценарий действия не может определить, что такое штрих и заливка.

У вас есть несколько вариантов.

Разделите заливку и обводку на отдельные фрагменты ролика и установите преобразование цвета, применимое только к заливке.

или

Если это простая фигура, нарисуйте ее, используя объект Graphics, где вы можете указать цвета заливки и цвета обводки.

Вероятно, капот, и мой предпочтительный метод, был бы первым вариантом, так как форма, вероятно, будет сложной, и оставление ее во флаге дает больший контроль над возможностью ее изменения разработчиком, а не разработчиком. Это немного сложнее и немного сложнее.

2 голосов
/ 02 июля 2009

Если вы нацелены на 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 IDE

РЕДАКТИРОВАТЬ: Помните, что это не будет хорошо работать с сглаживанием, но если вы используете stage.quality = "low", это не будет иметь значения.

Чтобы добавить, используйте его в as3, попробуйте это (украдено из http://scriptplayground.com/tutorials/as/Flash-CS4-and-Pixel-Bender-Overview/,, поэтому вам потребуется изменить несколько строк кода):

Первая часть кода определяет некоторые переменные, которые будут использоваться позже. Только два что может выглядеть новым Шейдером и 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, б значения цвета изображения, которые по существу дует деталь из образ. "shader.data.red.value" для пример ссылается на пиксель Бендер код, который был написан на начало, если вы заметили, что код имеет «параметр с плавающей точкой красного», который является переменная с плавающей точкой, чтобы установить уровень красный. В этом случае значение установить на 20. Этот процесс повторяется для других 2 цветов, а затем передается образу экземпляра.

Последняя часть этой функции настраивается таймер, который будет работать, чтобы применить это фильтруйте, пока изображение не вернется к нормальный вид

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();

Извините за кровоточивость глаз! Я думаю, что это мой самый длинный ответ!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...