更改MovieClip Actionscript 3的填充颜色

时间:2009-04-28 07:41:58

标签: actionscript-3 colors instance fill

我想问一下,如何只更改舞台上实例的填充颜色 - 我可以通过使用ColorTransform对象来实现它,但它会改变整个实例的颜色,而不仅仅是填充颜色。我想只改变填充颜色,而不是笔触颜色。有人可以帮助我吗?

这是我的代码:

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

    myColorTransform.color = someColorNumber;

    coloredObject.transform.colorTransform = myColorTransform;

}

3 个答案:

答案 0 :(得分:5)

一旦你绘制了一个形状就行了,因为动作脚本无法确定什么是笔划和什么是填充。

你有几个选择。

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

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

可能的引擎盖是我的首选方法,因为形状可能很复杂并且留在fla中可以让设计师能够更好地控制它而不是开发人员。虽然稍微复杂一点,但是工作稍微复杂一点。

答案 1 :(得分: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);
}

*只有你想要一种带黑色边框的单色才能使用。

答案 2 :(得分:2)

如果你的目标是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/中窃取,因此您需要更改几行代码):

  

代码的第一部分是定义一些稍后要使用的变量。只有两个   可能看起来很新的是Shader和   ShaderFilter。这些是Flash新手   玩家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(); }
     

下一个函数initFilter()是   一旦pbj文件被调用   成功加载,所以过滤器可以   被创造。此过滤器设置r,g,   b图像的颜色值,即   基本上吹了细节   图片。 “shader.data.red.value”表示   示例是引用像素   弯曲的代码写在   一开始,如果你注意到代码有   一个“参数浮动红”是一个   float变量来设置级别   红色。在这种情况下,价值正在变化   设置为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();

抱歉让你的眼睛流血!我认为这是我最长的答案!