Documentación de Flash CS3 |
|||
| Aprendizaje de ActionScript 2.0 en Adobe Flash > Gestión de eventos > Ámbito del controlador de eventos | |||
El ámbito o contexto, de las variables y los comandos que se declaran y se ejecutan con un controlador de eventos depende del tipo de controlador de eventos que se esté utilizando: controladores de eventos o detectores de eventos, o bien los controladores on() y onClipEvent(). Si está definiendo un controlador de eventos en una nueva clase de ActionScript, el ámbito también dependerá de cómo defina el controlador de eventos. En esta sección se incluyen ejemplos para ActionScript 1.0 y para ActionScript 2.0.
Ejemplos para ActionScript 1.0 Las funciones asignadas a los métodos de controlador de eventos (como todas las funciones ActionScript que se crean) definen un ámbito de variable local, pero los controladores on() y onClipEvent() no lo hacen.
Por ejemplo, veamos los dos controladores de eventos siguientes. El primero es un controlador de eventos onPress asociado a un clip de película denominado clip_mc. El segundo es un controlador on() asociado a la misma instancia de clip de película.
// Asociado a la línea de tiempo del clip principal de clip_mc:
clip_mc.onPress = function () {
var shoeColor; // variable de función local
shoeColor = "blue";
}
// controlador on() asociado a clip_mc:
on (press) {
var shoeColor; // sin ámbito de variable local
shoeColor = "blue";
}
Aunque los dos controladores de evento tienen el mismo código, los resultados pueden ser diferentes. En el primer caso, la variable color es local para la función definida para onPress. En el segundo caso, dado que el controlador on() no define un ámbito de variable local, la variable se define en el ámbito de la línea de tiempo del clip de película clip_mc.
Para los controladores de eventos on() asociados a los botones, en lugar de a los clips de película, las variables (así como las llamadas de función y método) se invocan en el ámbito de la línea de tiempo que contiene la instancia de botón.
Por ejemplo, el controlador de eventos on() siguiente produce un resultado diferente dependiendo de si se ha asociado a un objeto de clip de película o de botón. En el primer caso, la llamada a la función play() pone en marcha la cabeza lectora en la línea de tiempo que contiene el botón; en el segundo, la llamada a la función play() inicia la línea de tiempo del clip de película al cual está asociado el controlador.
// Asociado al botón.
on (press) {
play(); // Reproduce la línea de tiempo principal.
}
// Asociado al clip de película.
on (press) {
play(); // Reproduce la línea de tiempo del clip de película.
}
Es decir, cuando se asocia a un objeto de botón, la función play() se aplica a la línea de tiempo que contiene el botón, es decir, la línea de tiempo principal del botón. Pero si el controlador on(press) está asociado a un objeto de clip de película, la llamada a la función play() se aplica al clip de película al que se ha asignado el controlador. Si asocia el siguiente código a un clip de película, se reproduce la línea de tiempo principal:
// Asociado al clip de película.
on (press) {
_parent.play(); // Reproduce la línea de tiempo principal.
}
Dentro de una definición de controlador de eventos o de detector de eventos, se aplicaría la misma función play() a la línea de tiempo que contiene la definición de función. Por ejemplo, supongamos que declara el siguiente método de controlador de eventos my_mc.onPress en la línea de tiempo que contiene la instancia de clip de película my_mc:
// Función definida en una línea de tiempo:
my_mc.onPress = function () {
play(); // reproduce la línea de tiempo en la que se ha definido.
};
Para reproducir el clip de película que define el controlador de eventos onPress, haga referencia explícita a ese clip mediante la palabra clave this, del modo siguiente:
// Función definida en la línea de tiempo raízmy_mc.onPress = function () { this.play(); // reproduce la línea de tiempo del clip my_mc. };
Sin embargo, el mismo código situado en la línea de tiempo raíz de una instancia de botón reproduciría la línea de tiempo raíz:
my_btn.onPress = function () {
this.play(); // reproduce la línea de tiempo raíz
};
Para más información sobre el ámbito de la palabra clave this en los controladores de eventos, consulte Ámbito de la palabra clave this.
Ejemplo de ActionScript 2.0 La clase TextLoader siguiente se utiliza para cargar un archivo de texto y muestra texto después de cargar correctamente el archivo.
// TextLoader.as
class TextLoader {
private var params_lv:LoadVars;
public function TextLoader() {
params_lv = new LoadVars();
params_lv.onLoad = onLoadVarsDone;
params_lv.load("http://www.helpexamples.com/flash/params.txt");
}
private function onLoadVarsDone(success:Boolean):Void {
_level0.createTextField("my_txt", 999, 0, 0, 100, 20);
_level0.my_txt.autoSize = "left";
_level0.my_txt.text = params_lv.monthNames; // undefined
}
}
Este código no puede funcionar correctamente porque hay un problema de ámbito de los controladores de eventos; existe confusión en cuanto a qué hace referencia this entre el controlador de eventos onLoad y la clase. El comportamiento que podría esperar de este ejemplo es que se invoque el método onLoadVarsDone() en el ámbito del objeto TextLoader; sin embargo, se invoca en el ámbito del objeto LoadVars porque el método se extrajo del objeto TextLoader y se ha llevado al objeto LoadVars. El objeto LoadVars invoca el controlador de eventos this.onLoad cuando el archivo de texto se ha cargado correctamente y la función onLoadVarsDone() se invoca con this configurado como LoadVars, no como TextLoader. El objeto params_lv reside en el ámbito this cuando se invoca, aunque la función onLoadVarsDone() dependa del objeto params_lv por referencia. Por consiguiente, la función onLoadVarsDone() está esperando una instancia de params_lv.params_lv que no existe.
Para invocar correctamente el método onLoadVarsDone() en el ámbito del objeto TextLoader, puede utilizar la siguiente estrategia: utilice la expresión literal de una función para crear una función anónima que llame a la función deseada. El objeto owner continúa estando visible en el ámbito de la función anónima, de manera que puede utilizarse para localizar el objeto TextLoader que realiza la llamada.
// TextLoader.as
class TextLoader {
private var params_lv:LoadVars;
public function TextLoader() {
params_lv = new LoadVars();
var owner:TextLoader = this;
params_lv.onLoad = function (success:Boolean):Void {
owner.onLoadVarsDone(success);
}
params_lv.load("http://www.helpexamples.com/flash/params.txt");
}
private function onLoadVarsDone(success:Boolean):Void {
_level0.createTextField("my_txt", 999, 0, 0, 100, 20);
_level0.my_txt.autoSize = "left";
_level0.my_txt.text = params_lv.monthNames; // January,February,March,...
}
}
Flash CS3
Enviarme un mensaje de correo electrónico cuando se añadan comentarios a esta página | Informe de comentarios
Página actual: http://livedocs.adobe.com/flash/9.0_es/main/00000846.html