2015-04-04 61 views
1

編輯:我不知道這是正常的,但我更願意留在原來的問題,並添加更新。請隨時讓我知道,如果我應該消除原代碼片段等。AS3:通過鍵盤控制兒童影片剪輯並返回到主時間軸

我想創建閃存CS6幻燈片般呈現,使用主時間軸,每一幀的一個符號和這些符號在不同的動畫(一些相當複雜)。由於我將使用演示遙控器,我已經捕獲的擊鍵和編碼pg_up和pg_down分別去到下一個和前一幀:

stage.addEventListener(KeyboardEvent.KEY_DOWN, pagerFunction); 
var symb:movieClip; 
function pagerFunction(e:KeyboardEvent):void 
{ 
    var myKey = e.keyCode; 
    if (myKey == Keyboard.PAGE_DOWN){ 
     if (symb != null){ 
      //some code that allows to control the symbols timeline forward 
     } else { 
      nextFrame(); 
     } 
    } 
    if (myKey == Keyboard.PAGE_UP){ 
     if (symb != null){ 
      //some code that allows to control the symbols timeline backward 
     } else { 
      prevFrame(); 
     } 
} 

我遇到的問題如下。我已經添加了framelabels和stop();代碼在符號動畫中,我需要控制從一個動畫到下一個動畫的步驟。然而,在網絡上嘗試了衆多解決方案之後,我無法成功地讓這些符號對pg_up和pg_down做出反應,就好像它們是主時間軸的一部分一樣。

綜上所述,我需要解決的是這樣的:

  1. 進入主時間軸幀
  2. 識別符號實例(標記爲_mc)
  3. 內部符號時間表,從第一幀播放(標記「0」),直到下一個標記的幀(「1」等)
  4. 停止並等待下一個pg_down開始從下一個標記的幀打以下(即「1」 - 「2」),或pg_up開始從以前標記的幀(即'0'到'1')播放(爲此,我將使用一個變量來保持音軌
  5. 最後一幀上(標記「最終」)退出符號焦點和鍵盤控制返回到主時間軸,以允許pg_down和pg_up到移動到下一個/前一個幀。在symbol.currentFrame == 0上的pg_up上,執行相同的操作。

順便說一句,如果有更好的方法來實現這一點,我打開(並非常絕望)的更好的建議/解決方案。

謝謝你這麼多的人誰可以幫助!

編輯:好吧,我想我是不是在這個問題上太清楚,所以我會盡力給位添加到此:

addEventListener(KeyboardEvent.KEY_DOWN, mc_pagerFunction); 
var lbl:String; 
var counter:Number = 0; 

function mc_pagerFunction(e:KeyboardEvent):void { 
    var myKey = e.keyCode; 
    if (myKey == Keyboard.PAGE_DOWN){ 
     lbl = this.currentFrameLabel; 
     if (this.currentFrameLabel == 'final'){ 
      stop(); 
      stage.focus = this.parent; //which would be the main timeline 
     } else if (Number(lbl) == counter){ 
      this.gotoAndStop(lbl); 
      counter++; 
     } else { 
      this.gotoAndPlay(lbl); 
     } 
    } 

    if (myKey == Keyboard.PAGE_UP){ 
     lbl = this.currentFrameLabel; 
     if (this.currentFrameLabel == '0'){ 
      stop(); 
      stage.focus = this.parent; //which would be the main timeline 
     } else if (Number(lbl) == counter){ 
      this.gotoAndStop(lbl); 
      counter--; 
     } else { 
      this.gotoAndPlay(lbl); 
     } 
    } 
} 

現在,該位是我想要的行爲當主時間軸進入下一幀時,可以使用主時間軸作爲排序的幻燈片和符號內發生的真實事件。

順便說一句,我想嘗試並保持所有代碼在主要行動層,而不是在符號。我試過了,把注意力轉移到了符號上,它也沒有用,並且讓代碼遍佈整個地方,對抗我的神經;)。

我希望這將引發對我被堵在什麼一些光。

再次,任何幫助表示讚賞。感謝所有提前

更新: 請有人幫我在這裏! 這就是我想要的。從邏輯上講,它使世界上所有的感覺,除了它不工作。

var symb:MovieClip; 

symb = MovieClip(root); //assign symbol I want to be controlled by pg_up/pg_down 

symb.focusRect = false; 
stage.focus = symb; //focus on current symbol 

symb.addEventListener(KeyboardEvent.KEY_DOWN, mc_pager); //add keyboard event listener 

function mc_pager(e:KeyboardEvent):void{ 
    var myKey = e.keyCode; 
    if (myKey == Keyboard.PAGE_DOWN){ 
     do{ 
      symb.play(); // it plays, then checks if the lbl is null or final, then quits 
     } while (symb.currentFrameLabel == null && symb.currentFrameLabel != 'final'); 
     symb.stop(); 
     symb.removeEventListener(KeyboardEvent.KEY_DOWN, mc_pager); 
     stage.focus=MovieClip(root); //return focus to main timeline (in the next keyframes, the focus is on the nested _mc 
    } 
    if (myKey == Keyboard.PAGE_UP){ 
     do{ 
      symb.prevFrame(); 
     } while (symb.currentFrameLabel == null && symb.currentFrameLabel != '0'); 
     symb.stop(); 
     symb.removeEventListener(KeyboardEvent.KEY_DOWN, mc_pager); 
     stage.focus=MovieClip(root); 
    } 
} 

我在哪裏爲了讓自己變得正確?請,夥計們,你們是專家,我需要你們的建議。謝謝!

更新: 在symb上做一個跟蹤,它似乎一進入函數就會忘記初始分配(symb = MovieClip(root))並顯示null。爲什麼?

+0

我會考慮調度自定義事件,而您會在主時間軸中設置偵聽器並在符號時間軸中分派事件。我也會考慮使用面向對象原則並儘可能避免時間表。 – hexobolic 2015-04-04 20:00:37

+0

感謝hexobolic的快速回復。不幸的是,我對as3(或任何動作版本)並不太瞭解。你會如此善意地闡述一下嗎?謝謝一堆 – Stratum 2015-04-04 20:15:52

+0

'stage.focus = _mc;' ... 'stage.focus = root;' http://www.williammalone.com/briefs/how-to-set-focus-flash-actionscript- 3-as3/ – 2015-04-04 21:52:34

回答

0

在本示例中,我創建了一個概念的基本證明,其中在主時間軸上具有實例名稱爲「c」的圓MC。在這個MC內部,我用兩個關鍵幀創建了兩個停止動作。我在第2幀爲圓圈塗上了不同的顏色,並將其標記爲「兩」。

主時間軸我有以下代碼:

import flash.events.KeyboardEvent; 

stage.addEventListener(KeyboardEvent.KEY_DOWN,keyEvt); 

function keyEvt(e:KeyboardEvent):void{ 
     if(e.keyCode == Keyboard.PAGE_DOWN){ 
       trace("down"); 
       c.gotoAndPlay("two"); 
      } 
    } 

這應該有助於只要通過直接引用瞄準符號作爲你堅持形成你的代碼基礎,並確保您的鍵盤事件被連接到舞臺。

此外,始終堅持首先獲得基本的工作版本。 I.E.檢查您的鍵盤偵聽器是否適用於您的目標對象,然後再建立其他功能。