2016-07-26 3 views
0

キーボードコマンドに応答してNetStreamを再生するようにFlash SWFを設定しました。数字パッドによってトリガーされるいくつかの非常に短いビデオクリップがあります。非常に多く(この未完成の例では少数しかありません)、ビデオを再生するには2つの数字を押す必要があります。AS3 KeyboardEventは、NetStreamが停止した後にeventListenerを追加しません。

最初の番号はvideoArray関数をトリガーし、videoArray関数内では新しいイベントListenerが作成され、古いイベントリスナーは削除されます。動画が終了すると、NetStatusEventを使用してnetstreamを削除し、videoArray eventListenerを再度追加しました。

しかし、これはうまくいきますが、SキーでトリガーされるstopVideo関数があります。 NetStatusEventと同じコードがあり、netstreamを削除してeventListenerを再アドオンしますが、netstreamだけが削除されます。 eventListenerは追加されません。

eventListenerの追加が中止されていますか、これを別の方法で行う必要がありますか?ビデオの最後までスキップしてNetStatusEventをトリガして停止することはできますか?

import flash.ui.Keyboard; 
import flash.events.KeyboardEvent; 

// Create a NetConnection object 
var nc:NetConnection = new NetConnection(); 
nc.connect(null); 

// Create a NetStream object with NetConnection object as a parameter 
var ns:NetStream = new NetStream(nc); 
var vid:Video = new Video(); 

// Play control 
stage.addEventListener(KeyboardEvent.KEY_UP,videoArray); 

function preStop(event:KeyboardEvent):void { 
    if (event.keyCode == 97) { 
     trace("O Stop"); 
     ns.close(); 
     removeChild(vid); 
     vid.attachNetStream(null); 
    } 
    else if (event.keyCode == 98) { 
     trace("P Stop"); 
     ns.close(); 
     removeChild(vid); 
     vid.attachNetStream(null); 
    } 
} 

function videoArray(event:KeyboardEvent):void { 
    stage.removeEventListener(KeyboardEvent.KEY_DOWN,preStop); 
    stage.removeEventListener(KeyboardEvent.KEY_UP,videoArray); 

    if (event.keyCode == 97) { 
     stage.addEventListener(KeyboardEvent.KEY_UP,play1); 
     trace("play1"); 
    } 
    else if (event.keyCode == 98) { 
     stage.addEventListener(KeyboardEvent.KEY_UP,play2); 
     trace("play2"); 
    } 

    // PLAY 1 
    function play1(event:KeyboardEvent):void { 
     if (event.keyCode == 97) { 
      stage.removeEventListener(KeyboardEvent.KEY_UP,play1); 
      stage.removeEventListener(KeyboardEvent.KEY_UP,play2); 

      // Play video 
      ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler); 
      ns.play("cfa.mov"); 

      // Create a new Video object and attach NetStream object 
      vid.attachNetStream(ns); 
      addChild(vid);  
     } 
     else if (event.keyCode == 98) { 
      stage.removeEventListener(KeyboardEvent.KEY_UP,play1); 
      stage.removeEventListener(KeyboardEvent.KEY_UP,play2); 

      // Create a NetStream object with NetConnection object as a parameter 
      ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler); 
      ns.play("matilda.mov"); 

      // Create a new Video object and attach NetStream object 
      vid.attachNetStream(ns); 
      addChild(vid); 
     } 
     stage.addEventListener(KeyboardEvent.KEY_UP,videoArray); 
    } 

    // PLAY 2 
    function play2(event:KeyboardEvent):void { 
     if (event.keyCode == 97) { 
      stage.removeEventListener(KeyboardEvent.KEY_UP,play1); 
      stage.removeEventListener(KeyboardEvent.KEY_UP,play2); 

      // Create a NetStream object with NetConnection object as a parameter 
      ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler); 
      ns.play("illusionists.mov"); 

      // Create a new Video object and attach NetStream object 
      vid.attachNetStream(ns); 
      addChild(vid);  
     } 
     else if (event.keyCode == 98) { 
      stage.removeEventListener(KeyboardEvent.KEY_UP,play1); 
      stage.removeEventListener(KeyboardEvent.KEY_UP,play2); 

      // Create a NetStream object with NetConnection object as a parameter 
      ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler); 
      ns.play("janis.mp4"); 

      // Create a new Video object and attach NetStream object 
      vid.attachNetStream(ns); 
      addChild(vid); 
     } 
     stage.addEventListener(KeyboardEvent.KEY_UP,videoArray); 
    } 

    function asyncErrorHandler(event:AsyncErrorEvent):void { 
     // ignore error 
    } 
} 





// Stop at end of video 
ns.addEventListener(NetStatusEvent.NET_STATUS, statusHandler); 

function statusHandler(event:NetStatusEvent):void 
{ 
    trace(event.info.code) 

    if (event.info.code == 'NetStream.Buffer.Empty') { 
     ns.close(); 
     removeChild(vid); 
     vid.attachNetStream(null); 
     stage.addEventListener(KeyboardEvent.KEY_DOWN,preStop); 
     stage.addEventListener(KeyboardEvent.KEY_UP,videoArray); 
    } 
} 


// Pause control 
stage.addEventListener(KeyboardEvent.KEY_UP,togglePauseHandler); 

function togglePauseHandler(event:KeyboardEvent):void { 
    if (event.keyCode == Keyboard.SPACE) { 
     ns.togglePause(); 
    } 
} 


// Stop control 
stage.addEventListener(KeyboardEvent.KEY_UP,stopVideo); 

function stopVideo(event:KeyboardEvent):void { 
    if (event.keyCode == Keyboard.S) { 
     ns.close(); 
     removeChild(vid); 
     vid.attachNetStream(null); 
     stage.addEventListener(KeyboardEvent.KEY_DOWN,preStop); 
     stage.addEventListener(KeyboardEvent.KEY_UP,videoArray); 
    } 
} 
+0

をコメントしています。 'videoArray'関数が呼び出されるたびに、それはあなたのリスナーに付けられた以前のものと同じではない新しいplay1/playメソッドのセットを作成します。 – BadFeelingAboutThis

+0

あなたが提案したことを試みたとき、私は、イベントリスナーがvideoArray関数で削除されていて、else文もなかったことに気付きました。したがって、別のキー(この場合はS)が押されるたびに、eventListenersは無効になりましたが、play1、play2の関数はトリガーされませんでした。見ていただきありがとうございます。 – Browntastic

答えて

1

コードを再作成する方法は次のとおりです。単一のキー・リスナーで何が起こっているのかを把握し、常に異なるキー・リスナーを追加したり削除したりするのが簡単で簡単です。コードを参照してください、私は(あなたが読み超簡単ではありません多くのコードを掲載)あまりにも密接に見ていないが、あなたの問題がありそうなイベントリスナーとして使用されているインライン関数の結果である

import flash.events.AsyncErrorEvent; 
import flash.events.NetStatusEvent; 
import flash.media.Video; 
import flash.net.NetConnection; 
import flash.net.NetStream; 
import flash.ui.Keyboard; 
import flash.events.KeyboardEvent; 

// Create a NetConnection object 
var nc:NetConnection = new NetConnection(); 
nc.connect(null); 

// Create a NetStream object with NetConnection object as a parameter 
var ns:NetStream = new NetStream(nc); 

//add your netstream listeners just once (the next line was in your play functions) 
ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler); 
ns.addEventListener(NetStatusEvent.NET_STATUS, statusHandler); 

var vid:Video = new Video(); 



var firstNum:int = 0; //to track the first number pressed in a set 

//a list of all your videos, this example supports 81 items in this array/list. 
var streams:Array = ["matilda.mov", "cfa.mov", "illusionists.mov", "janis.mp4"]; 

// A single Key up listener to handle everything 
stage.addEventListener(KeyboardEvent.KEY_UP, keyUp); 

function asyncErrorHandler(event:AsyncErrorEvent):void { 
    //ignore error 
} 

//write the close and open stream code just once 
function closeStream(event:KeyboardEvent):void { 
    ns.close(); 
    removeChild(vid); 
    vid.attachNetStream(null); 
} 

function openStream(path:String):void { 
    // Play video 
    ns.play(path); 

    // Create a new Video object and attach NetStream object 
    vid.attachNetStream(ns); 
    addChild(vid); 
} 

function keyUp(event:KeyboardEvent):void { 
    //if they key event is numpad key 
    if (event.keyCode >= Keyboard.NUMPAD_1 && event.keyCode <= Keyboard.NUMPAD_9) { 
     var index:int = event.keyCode - Keyboard.NUMPAD_0; //which number was pushed between 1 - 9 


     if (firstNum < 1) { 
      //if this is the first number press, just assign that number 
      firstNum = index; 
     }else { 
      //if the second press, play the appropriate video 

      //this is the math for finding the video number 
      index = ((firstNum - 1) * 9) + index - 1; // -1 one at the end since arrays are 0 based 

      //if the number is higher the amount of videos available, set the index to the last video in the list 
      if (streams.length >= index) { 
       index = streams.length - 1; 
      } 

      //play the video 
      openStream(streams[index]); 

      //reset the firstNum 
      firstNum = 0; 
     } 

     return; //don't look at any other key presses below since there's no reason to 
    } 

    switch(event.keyCode) { 
     case Keyboard.SPACE: 
      ns.togglePause(); 
      break; 

     case Keyboard.S: 
      closeStream(); 
      break; 
    } 
} 

function statusHandler(event:NetStatusEvent):void { 
    trace(event.info.code) 

    switch(event.info.code){ 
     case 'NetStream.Buffer.Empty': 
     case 'NetStream.Play.Stop': 
     case 'NetStream.Play.Complete': 
      closeStream(); 
      break; 
    } 
} 
1

イベントリスナーは、videoArray関数で削除され、else文はありません。したがって、別のキーが押されるたびにeventListenersは無効になりますが、play1、play2関数はトリガーされません。

+0

これは確かに起こりそうな問題のようです。これはおそらく、リスナーは 'S'を押すかnetstreamバッファが空になったときにのみ追加されます。 – BadFeelingAboutThis

関連する問題