Actionscript 3 AS3键盘事件获胜';在NetStream停止后添加eventListener
我设置了一个flashswf来播放netstream以响应键盘命令。有几个很短的视频剪辑是由数字键盘触发的。因为有这么多(在这个未完成的示例中只有几个),所以必须按两个数字才能播放视频 第一个数字触发videoArray函数,在videoArray函数中创建一个新的eventListener来播放视频,同时删除旧的eventListener。视频完成后,我使用NetStatusEvent删除netstream并再次添加videoArray eventListener 所有这些都可以正常工作,但是,有一个由S键触发的stopVideo功能。它具有与NetStatusEvent相同的代码来删除netstream并重新加载eventListener,但只删除netstream。未添加eventListener 我是否遗漏了阻止添加eventListener的内容,或者我应该采取不同的做法?是否可以跳到视频的结尾并触发NetStatusEvent停止它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 所有这些都可以正常工作,但是
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-