Вопрос

я хочу спросить, как изменить только цвет заливки экземпляра на сцене - я могу сделать это с помощью 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();

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top