8

我想问一下,如何仅更改舞台上实例的填充颜色 - 我可以通过使用 ColorTransform 对象来完成,但它会更改整个实例的颜色,而不仅仅是填充。我只想更改填充颜色,而不是描边颜色。有谁能够帮助我?

这是我的代码:

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

    myColorTransform.color = someColorNumber;

    coloredObject.transform.colorTransform = myColorTransform;

}
4

3 回答 3

6

一旦您绘制了形状,就无法完成此操作,因为动作脚本无法确定什么是描边,什么是填充。

你有几个选择。

将您的填充和描边分成单独的影片剪辑,并将颜色变换设置为仅应用于填充。

或者

如果它是一个简单的形状,请使用 Graphics 对象绘制它,您可以在其中指定填充颜色和描边颜色。

可能 hood 是,我更喜欢的方法,将是第一个选项,因为形状可能很复杂,并且将其留在 fla 中为能够更改它的设计师而不是开发人员提供了更大的控制权。不过,这需要更多的工作并且稍微复杂一些。

于 2009-04-28T07:59:37.177 回答
5

我知道这对游戏来说有点晚了,但我遇到了同样的问题并以不同的方式解决了它。它可能没有任何帮助,因为它只能在有限的情况下工作*,但我从我的形状开始填充白色并抚摸黑色。这样,您可以使用 RGB 乘法器应用颜色变换,将白色淡化为您想要的颜色,保持黑色边框完好无损。因此,要使您的对象变为红色(带有黑色边框),请使用:

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

或者对于 Stack Overflow 橙色(仍然带有黑色边框):

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

*仅当您只想要带有黑色边框的单一颜色时才有效。

于 2009-10-01T11:56:15.157 回答
2

如果您的目标是 FP10,并且您想要一个简单的过滤器,就像您尝试使用 ColorTransform 一样,您可以编写一个 PixelBlender Kernel 来获取 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/偷来的,所以你需要更改几行代码):

代码的第一部分是定义一些稍后使用的变量。唯一可能看起来很新的两个是 Shader 和 ShaderFilter。这些是 Flash Player 10 的新功能,是负责处理 Pixel Bender 过滤器数据的类。

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

成功加载 pbj 文件后调用next 函数initFilter(),因此可以创建过滤器。此滤镜设置图像的 r、g、b 颜色值,这实际上破坏了图像的细节。例如,“ shader.data.red.value”引用了开始编写的像素弯曲代码,如果您注意到代码有一个“参数 float red”,它是一个用于设置红色级别的浮点变量。在这种情况下,该值设置为 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();

对不起让你的眼睛流血了!我想这是我最长的答案了!

于 2009-07-02T18:50:19.233 回答