flash as3 запускает функцию, только если определен экземпляр внутри функции - PullRequest
0 голосов
/ 04 марта 2011

У меня есть ситуация, когда при загрузке SWF я добавляю прослушиватель событий на сцену для прослушивания команд клавиатуры.Одним из них является прослушивание пробела, и если он нажат, он должен воспроизводить фильм.Проблема в том, что фильм не загружается позже, в зависимости от других взаимодействий с пользователем, поэтому до его загрузки ссылка на него будет неопределенной.Но если я жду и добавляю слушателя для клавишных команд только при загрузке фильма, тогда я не могу использовать слушателя для других клавиатурных команд, таких как ВПРАВО или ВЛЕВО, которые являются кнопками, которые в первую очередь приводят вас к фильму.,Есть ли способ добавить условный код или что-то еще, чтобы предотвратить выполнение этого кода, если видео еще не определено?Вот мой код:

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])-->
}

Ответы [ 2 ]

1 голос
/ 04 марта 2011

Чтобы проверить, была ли переменная определена или нет, просто используйте 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 голосов
/ 04 марта 2011

Вы можете бросить попытку / поймать там, чтобы позаботиться об этом. Не супер эффективно, но в этом случае это, вероятно, не принесет никакого вреда:

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();
    }
}
...