让我们说我在舞台上有一个电影剪辑。每次点击这个动画片段我想要它改变颜色,但如果再次点击我想让它重新着色(再次变成白色)。更清楚它是白色的,第一次点击我希望它变成黄色,第二次点击再次变成白色,第三次点击再次变黄,依此类推。
我刚写了第一次点击的代码,但我想不出怎么做其余的。
var myColorTransform:ColorTransform=transform.colorTransform;
half1a.addEventListener(MouseEvent.CLICK, changeColour);
function changeColour(event:MouseEvent):void
{
myColorTransform.color = 0xD5E40D;
half1a.transform.colorTransform=myColorTransform;
addChild(half_number1a);
}
答案 0 :(得分:3)
或者如果你不喜欢打字:
var myColorTransform:ColorTransform=transform.colorTransform;
half1a.addEventListener(MouseEvent.CLICK, changeColour);
var cc:uint = 0; //current color.
var cl:Array = [0xFFFFFF, 0xD5E40D]; //list of all colors.
function changeColour(event:MouseEvent):void
{
myColorTransform.color = cl[cc = (++cc < cl.length)? cc : 0];
half1a.transform.colorTransform=myColorTransform;
addChild(half_number1a);
}
在我看到评论之后的一点点解释我意识到这可能会让经验不足的程序员感到困惑,我们想在这里互相教导,不要为别人做工作。
那么这里发生了什么?
基本设置
我们声明一些颜色的数组,我们想要使用(通过?)循环我们的movieclip。
var cl:Array = [0xFFFFFF, 0xD5E40D]; //list of all colors.
不,我们想知道我们现在显示哪种颜色,所以我们声明了另一个存储当前颜色索引的变量。
var cc:uint = 0; //current color.
如果您已经感到困惑,请参阅Working with arrays
基本上(当前值为0
)我们将访问数组0xFFFFFF
的第一项:
cl[cc];
目标
现在我们每次点击movieclip都需要做的就是移动索引,使其指向数组中的下一个项目(颜色)。 我们可以简单地增加当前颜色的值
myColorTransform.color = cl[++cc];
请注意x++
和++x
之间的区别。 Adobe有很好的example如何区别。
它会起作用但只有在我们到达数组末尾之前(显然我们不想再增加索引,我们希望它回到0
)
剩下的就是做那个 - 0
的休息指数;
如果你不知道这个奇怪的()?:;
语法是什么意思。您可能希望检查此this - 只是它只是if...else
缩写,但您最好将其视为返回某些值的函数。
所以在案例中cc = (++cc < cl.length)? cc : 0
等同于写下这样的东西:
cc = nextIndex();
function nextIndex() {
if (++cc < cl.length) return cc;
else return 0; //else is redundant here - if "if" is ture then function will return "cc" and no other instruction are executed in this function.
}
<强>摘要强>
总结一下myColorTransform.color = cl[cc = (++cc < cl.length)? cc : 0];
行的作用。
检查新索引是否小于颜色列表的长度。
如果为true,请将cc
设为cc
(保持原样)
否则,请将cc
设置回0
从cl
内评估的索引处的颜色列表[]
中选择颜色值。
myColorTransform.color
设置为已选择的值。回答其他问题。
从我们刚刚结束的那一点开始,cc
值就是存储新颜色的索引,因此您只需再次使用它来访问cl
而无需重做这些疯狂的东西。例如,如果您只想拥有一个mc,则可以使用visible属性:
function changeColour(event:MouseEvent):void
{
myColorTransform.color = cl[cc = (++cc < cl.length) ? cc : 0];
half1a.transform.colorTransform = myColorTransform;
half_number1a.visible = cl[cc] == 0xFFFFFF; //check if current color is white and set it's visible state accordingly
}
请注意,如果没有将按钮添加到舞台拳头,即使可见属性设置为true
,您也不会看到它。
更灵活的解决方案
或者另一种方法是创建并行或多维数组。在这样的简单场景中,并行阵列应该是更好的选择,因为它更容易跟踪,并且您不需要更改您已经拥有的任何内容。 基本上这个想法是创建另一个数组,其中每个值(在您的情况下,影片剪辑与同一索引处的颜色值配对:
var cl:Array = [0xFFFFFF, 0xD5E40D]; //list of all colors.
var ml:Array = [half_number1a, null ]; //movie clips list.
所以如果你有这样的东西,现在你的changeColor
函数看起来就像那样:
function changeColour(event:MouseEvent):void
{
myColorTransform.color = cl[cc = (++cc < cl.length) ? cc : 0];
half1a.transform.colorTransform = myColorTransform;
if (ml[cc]) addChild(ml[cc]); //add child if exist.
if (ml[cc - 1]) removeChild(ml[cc - 1]); //remove previous child if exist.
}
就是这样。请记住,在呼叫removeChild()
这个设置的好处是你可以通过将新值推送到数组来添加任意数量的颜色和动画片段:)
答案 1 :(得分:1)
我使用ColorMatrixFilter: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/filters/ColorMatrixFilter.html
var aMatrix:Array = [
0, 0, 0, 0, 0xD5,
0, 0, 0, 0, 0xE4,
0, 0, 0, 0, 0x0D,
0, 0, 0, 1, 0
];
var aYellow:ColorMatrixFilter = new ColorMatrixFilter(aMatrix);
// Make object yellow.
M.filters = [aYellow];
// Make object normal.
M.filters = null;
function toggleColor():void
{
if (M.filters) M.filters = null;
else M.filters = [aYellow];
}
答案 2 :(得分:1)
未经测试,但您可以尝试这样的事情......
var myColorTransform:ColorTransform=transform.colorTransform;
var nextColor : String = "yellow"; //set with expected Next Color
half1a.addEventListener(MouseEvent.CLICK, changeColour);
function changeColour(event:MouseEvent):void
{
if (nextColor == "yellow") { myColorTransform.color = 0xD5E40D; nextColor == "white" }
else if (nextColor == "white") { myColorTransform.color = 0xFFFFFF; nextColor == "yellow" }
half1a.transform.colorTransform=myColorTransform;
addChild(half_number1a);
}
理想情况下,您应该使用Boolean
设置true / false状态,然后使用If/Else
设置颜色。如果true
然后变为白色,或者如果false
则设置为黄色。