假设我在舞台上有一个电影剪辑。每次单击此影片剪辑时,我都希望它更改颜色,但是如果再次单击,则希望它重新着色(再次变为白色)。更清楚地说-一开始是白色,第一次单击我希望它变成黄色,第二次单击再次变成白色,第三次单击再次变成黄色,依此类推。

我只是为第一次单击编写了代码,但我想不出其余的方法。

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()之前,您需要先在舞台上拳打电影剪辑

关于此设置的好处是,只需将新值推送到数组即可添加任意数量的颜色和影片剪辑:)

10-07 19:14
查看更多