假设我在舞台上有一个电影剪辑。每次单击此影片剪辑时,我都希望它更改颜色,但是如果再次单击,则希望它重新着色(再次变为白色)。更清楚地说-一开始是白色,第一次单击我希望它变成黄色,第二次单击再次变成白色,第三次单击再次变成黄色,依此类推。
我只是为第一次单击编写了代码,但我想不出其余的方法。
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);
}
最佳答案
或者,如果您不喜欢输入太多内容:
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);
}
说明:
稍作解释,当我看到评论后,我意识到这可能会使经验不足的程序员感到困惑,我们希望在这里互相教,不要为别人做工作。
那么这是怎么回事?
基本设定
我们声明一些具有我们要循环使用的动画片段的颜色数组(by?)。
var cl:Array = [0xFFFFFF, 0xD5E40D]; //list of all colors.
不,我们不想知道我们现在正在显示哪种颜色,因此我们声明另一个变量,该变量将存储当前颜色的索引。
var cc:uint = 0; //current color.
如果您已经很困惑,请参见Working with arrays
基本上(当前值为
0
),我们将通过以下方式访问数组0xFFFFFF
的第一项:cl[cc];
目标
现在,每次单击动画片段时,我们需要做的就是移动索引,使其指向数组中的下一个项目(颜色)。
我们可以像这样简单地增加当前颜色的值
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
}
请注意,如果未将按钮添加到舞台拳头,即使visible属性设置为
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()
之前,您需要先在舞台上拳打电影剪辑关于此设置的好处是,只需将新值推送到数组即可添加任意数量的颜色和影片剪辑:)