2011-03-03 34 views
0

我有一种情况,在加载我的swf时,我添加了一个事件监听器来监听键盘命令。其中之一是听空间栏,如果它被按下,它应该播放电影。问题是,该电影直到后来才被加载,这取决于其他用户交互,因此,直到它被加载时,其引用才会被定义。但是,如果我只在加载电影时等待并添加关键命令的侦听器,那么我不能将侦听器用于其他键盘命令,例如RIGHT或LEFT,这些命令是首先让您访问电影的按钮。有没有办法添加一个条件或东西,以防止执行代码,如果视频尚未定义?这是我的代码:flash as3只有在定义函数内的实例时才运行函数

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressedDown); 

function togglePause(event:MouseEvent):void { 
    video.videoPaused = !video.videoPaused; //video is undefined initially so this throws errors. 
} 

function keyPressedDown(event:KeyboardEvent):void { 
    switch (key) { 
     case 32: //Spacebar 
     //togglePause(); 
    } 
} 

function loadVideo(){ //called based on user interactions which happen later on 
    var video:VideoLoader = new VideoLoader(project_array[cp].project_display_files[0], {name:"myVideo", container:this, bgColor:0x000000, autoPlay:false, volume:1,onComplete:vidLoaded}); 
    video.load(); //currently set up for only one video ([0])--> 
} 

回答

1

要检查变量被定义或不只是使用if(typeof myVar == 'undefined')if(myVar === undefined)

要检查变量定义但未分配的值使用以下命令:

var myVar:MyClass; 
if(myVar === null) 
    ... 

现在要你的特定情况下,具有了video变量的loadVideo函数/方法内声明,它在该范围之外将永远不可用。所以你需要在更高层次声明它能够使用它。

其他错误:
- 在togglePause的参数应该是可选的,以允许功能
的人工呼叫 - 在keyPressedDown变量key没有定义

试试这个一变:

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressedDown); 

var video:VideoLoader; 

function togglePause(event:MouseEvent = null):void { 
    if(video) 
     video.videoPaused = !video.videoPaused; //video is undefined initially so this throws errors. 
} 

function keyPressedDown(event:KeyboardEvent):void { 
    switch (event.charCode) { 
     case 32: //Spacebar 
      togglePause(); 
      break; // not necesary here, but good practice to add it! 
    } 
} 

function loadVideo(){ //called based on user interactions which happen later on 
    video = new VideoLoader(project_array[cp].project_display_files[0], {name:"myVideo", container:this, bgColor:0x000000, autoPlay:false, volume:1,onComplete:vidLoaded}); 
    video.load(); //currently set up for only one video ([0])--> 
} 

声明:未经测试,但它可能会工作,或至少接近工作。

问候,
阿林

+0

啊 - 这就是我做错了 - 我早些时候宣布了视频,但没有将其指定为类型:VideoLoader,稍后将其作为视频引用:VideoLoader。一旦我扭转了这两件事情,它就起作用了。谢谢! – mheavers 2011-03-03 21:52:45

0

你可以在那里扔一个try/catch来照顾它。不是超级高效的,但在这种情况下,它不会可能造成任何伤害:

try { 
switch (key) { 
    case 32: //Spacebar 
    //togglePause(); 
} 
} catch (e:Error){ 
    // trace(e.message) // if it's needed, otherwise just fail silently 
} 

或者,你可以只定义了一个布尔变量,如:

var isLoaded:Boolean = false; 

然后,有一个载入监听器,和时触发,更改isLoaded = true,则:

switch (key) { 
    case 32: //Spacebar 
    if (isLoaded){ 
     //togglePause(); 
    } 
} 
+0

谢谢 - 问题是范围,如上面提到的,但渔获/试是一个有用的技术,就知道了。 – mheavers 2011-03-03 21:53:24

+0

是的,在捏的作品奇迹。如果你开始把它放到被称为很多事情的事物中(即:在一个定时器或enter_frame上),那么它就不是那么优化了,因此catch必须弄清楚它捕获和容纳什么,即使它被注释掉了。 – jpea 2011-03-03 22:54:36

相关问题