簡體   English   中英

如何切換影片剪輯的顏色?

[英]How to toggle color of a movieclip?

假設我在舞台上有一個電影剪輯。 每次單擊此影片剪輯時,我都希望它更改顏色,但如果再次單擊,我希望它重新着色(再次變為白色)。 更清楚地說 - 它在開始時是白色的,第一次點擊時我希望它變成黃色,第二次點擊再次變成白色,第三次點擊再次變成黃色,依此類推。

我只是為第一次點擊編寫了代碼,但我想不出如何去做剩下的事情。

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.

如果您已經感到困惑,請參閱使用數組

基本上(當前值為0 )我們將通過以下方式訪問數組0xFFFFFF的第一項:

cl[cc];

目標

現在,每次單擊影片剪輯時,我們只需移動索引,使其指向數組中的下一項(顏色)。 我們可以像這樣簡單地增加當前顏色的值

myColorTransform.color = cl[++cc];

注意這里x++++x之間的區別。 Adobe 有一個很好的例子來說明這有何不同。

它會工作,但只有在我們到達數組末尾(顯然我們不想再增加我們的索引,我們希望它回到0 )剩下的就是這樣做 - 將索引重置為0

如果你不知道這個奇怪的()?:; 語法意思。 您可能想檢查一下這個- 只是if...else縮寫,但您最好將其視為返回某個值的函數。

那么在這種情況下cc = (++cc < cl.length)? cc : 0 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]; myColorTransform.color = cl[cc = (++cc < cl.length)? cc : 0]; 線確實是。

  1. 增加顏色索引。
  2. 檢查新索引是否小於顏色列表的長度。

    • 如果為 true,則將cc設置為cc (保持原樣)

    • 否則,將cc設置回0

  3. []內評估的索引處從顏色列表cl中選取顏色值。

  4. myColorTransform.color設置為選取的值。

回答附加問題。

從我們剛剛結束的角度來看, cc值正在存儲新顏色的索引,因此您可以簡單地使用它再次訪問cl ,而無需重做這些瘋狂的事情。 例如,如果您只想擁有一個 mc,您可以只使用可見屬性:

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()之前,您需要先在舞台上播放影片剪輯

這種設置的好處是,您可以通過將新值推送到數組來添加任意數量的顏色和影片剪輯 :)

我會使用 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];
}

未經測試,但你可以嘗試這樣的事情......

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來設置真/假狀態,然后使用If/Else來設置顏色。 如果為true則設置為白色,否則為false則設置為黃色。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM