我想问一下,如何只更改舞台上实例的填充颜色 - 我可以通过使用ColorTransform对象来实现它,但它会改变整个实例的颜色,而不仅仅是填充颜色。我想只改变填充颜色,而不是笔触颜色。有人可以帮助我吗?
这是我的代码:
function paint(){
var myColorTransform:ColorTransform = new ColorTransform();
myColorTransform.color = someColorNumber;
coloredObject.transform.colorTransform = myColorTransform;
}
答案 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();
抱歉让你的眼睛流血!我认为这是我最长的答案!