Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 AS3键盘事件获胜';在NetStream停止后添加eventListener_Actionscript 3_Flash_Video_Event Listener_Netstream - Fatal编程技术网

Actionscript 3 AS3键盘事件获胜';在NetStream停止后添加eventListener

Actionscript 3 AS3键盘事件获胜';在NetStream停止后添加eventListener,actionscript-3,flash,video,event-listener,netstream,Actionscript 3,Flash,Video,Event Listener,Netstream,我设置了一个flashswf来播放netstream以响应键盘命令。有几个很短的视频剪辑是由数字键盘触发的。因为有这么多(在这个未完成的示例中只有几个),所以必须按两个数字才能播放视频 第一个数字触发videoArray函数,在videoArray函数中创建一个新的eventListener来播放视频,同时删除旧的eventListener。视频完成后,我使用NetStatusEvent删除netstream并再次添加videoArray eventListener 所有这些都可以正常工作,但是

我设置了一个flashswf来播放netstream以响应键盘命令。有几个很短的视频剪辑是由数字键盘触发的。因为有这么多(在这个未完成的示例中只有几个),所以必须按两个数字才能播放视频

第一个数字触发videoArray函数,在videoArray函数中创建一个新的eventListener来播放视频,同时删除旧的eventListener。视频完成后,我使用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);
    }
}

事件侦听器在videoArray函数中被删除,并且没有else语句。因此,任何时候按下另一个键,它都会禁用eventListeners,但不会触发play1、play2功能。

事件侦听器在videoArray函数中被删除,并且没有其他语句。因此,任何时候按下另一个键,它都会禁用eventListeners,但不会触发play1、play2功能。

以下是我如何重新编写代码的方法。更清晰、更容易了解单个键侦听器的情况,并且不需要一直添加和删除不同的键侦听器。请参阅代码注释

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;
    }
}
导入flash.events.AsyncErrorEvent;
导入flash.events.NetStatusEvent;
导入flash.media.Video;
导入flash.net.NetConnection;
导入flash.net.NetStream;
导入flash.ui.Keyboard;
导入flash.events.KeyboardEvent;
//创建NetConnection对象
var nc:NetConnection=newnetconnection();
nc.connect(空);
//使用NetConnection对象作为参数创建NetStream对象
var ns:NetStream=新NetStream(nc);
//只添加一次netstream侦听器(下一行是播放函数)
ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR,asyncErrorHandler);
ns.addEventListener(NetStatusEvent.NET_STATUS,statusHandler);
var vid:Video=新视频();
var firstNum:int=0//跟踪一组中按下的第一个数字
//您所有视频的列表,此示例支持此阵列/列表中的81个项目。
变量流:数组=[“matilda.mov”、“cfa.mov”、“illusionists.mov”、“janis.mp4”];
//一个单一的按键侦听器来处理一切
stage.addEventListener(KeyboardEvent.KEY\u UP,keyUp);
函数asyncErrorHandler(事件:AsyncErrorEvent):void{
//忽略错误
}
//只需编写一次关闭和打开流代码
函数closeStream(事件:KeyboardEvent):无效{
ns.close();
removeChild(vid);
vid.attachNetStream(空);
}
函数openStream(路径:字符串):void{
//播放视频
ns.游戏(路径);
//创建新的视频对象并附加NetStream对象
参见附件流(ns);
addChild(vid);
}
功能键控(事件:KeyboardEvent):无效{
//如果它们的键事件是numpad键
if(event.keyCode>=Keyboard.NUMPAD_1&&event.keyCode=index){
索引=streams.length-1;
}
//播放视频
openStream(streams[索引]);
//重置firstNum
firstNum=0;
}
返回//不要看下面的任何其他按键,因为没有理由这样做
} 
开关(event.keyCode){
case KEYBORD.SPACE:
ns.togglePause();
打破
case键盘.S:
closeStream();
打破
}
}
函数statusHandler(事件:NetStatusEvent):void{
跟踪(事件信息代码)
开关(事件信息代码){
案例“NetStream.Buffer.Empty”:
案例“NetStream.Play.Stop”:
案例“NetStream.Play.Complete”:
closeStream();
打破
}
}

以下是我将如何重新编写您的代码。更清晰、更容易了解单个键侦听器的情况,并且不需要一直添加和删除不同的键侦听器。请参阅代码注释

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;
    }
}
导入flash.events.AsyncErrorEvent;
导入flash.events.NetStatusEvent;
导入flash.media.Video;
导入flash.net.NetConnection;
导入flash.net.NetStream;
导入flash.ui.Keyboard;
导入flash.events.KeyboardEvent;
//创建NetConnection对象
var nc:NetConnection=newnetconnection();
nc.connect(空);
//使用NetConnection对象作为参数创建NetStream对象
var ns:NetStream=新NetStream(nc);
//只添加一次netstream侦听器(下一行是播放函数)
ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR,asyncErrorHandler);
ns.addEventListener(NetStatusEvent.NET_STATUS,statusHandler);
var vid:Video=新视频();
var firstNum:int=0//跟踪一组中按下的第一个数字
//您所有视频的列表,此示例支持此阵列/列表中的81个项目。
变量流:数组=[“matilda.mov”、“cfa.mov”、“illusionists.mov”、“janis.mp4”];
//一个单一的按键侦听器来处理一切
stage.addEventListener(KeyboardEvent.KEY\u UP,keyUp);
函数asyncErrorHandler(事件:AsyncErrorEvent):void{
//忽略错误
}
//只需编写一次关闭和打开流代码
函数closeStream(事件:KeyboardEvent):无效{
ns.close();
removeChild(vid);
vid.attachNetStream(空);
}
函数openStream(路径:字符串):void{
//播放视频
ns.游戏(路径);
//创建新的视频对象并附加NetStream对象
参见附件流(ns);
addChild(vid);
}
功能键控(事件:KeyboardEvent):无效{
//如果它们的键事件是numpad键
if(event.keyCode>=Keyboard.NUMPAD_1&&event.keyCode=index){
index=streams.length-