A ver quién me puede echar una mano.
Estoy intentando desarrollar una clase para hacer "pan" y "zoom" en el stage
Para el "pan", utilizo un timer que me da la posición del mouse cada 0.10s, valor que con mi posición actual, me sirve para mover el stage.
Esto funciona desde mi linea de tiempo general, pues cambio la x y la y del stage con root.x y root.y.
El problema viene cuando implemento la misma funcion en una clase con addlistener: no me deja acceder a las propiedades del stage.
p.d.: el addlistener lo tengo "trucado" para pasarle parámetros
Código ActionScript :
package src { //Para interceptar los eventos del mouse y del teclado import flash.display.MovieClip; import flash.display.Stage; import flash.events.KeyboardEvent; import flash.events.MouseEvent import flash.utils.Timer; import flash.events.TimerEvent; //Utilidad para pasar parámetros a los eventlisteners import src.utilities.callBack; public class Teclado extends MovieClip { //Este reloj almacena la posición delmouse cada 0,10s, para saber donde está el mouse, para efectos de zoom y pan private var timerPan:Timer=new Timer(10); //En estas variables se almacena la posición del mouse cada 0,10s private var xMouse:Number; private var yMouse:Number; //Almacenará el keyCode de la tecla pulsada private var keyPressed:uint; public function Teclado(escena:Stage) { escena.addEventListener(KeyboardEvent.KEY_DOWN, teclaPulsada) escena.addEventListener(KeyboardEvent.KEY_UP , teclaLiberada) timerPan.addEventListener(TimerEvent.TIMER,TomaCoordenadasDelMouse); escena.addEventListener(MouseEvent.MOUSE_WHEEL, callBack.create(cadZoomConMouseWheel,escena)); escena.addEventListener(MouseEvent.MOUSE_DOWN, cadPanConMouseDown); escena.addEventListener(MouseEvent.MOUSE_UP, cadPanConMouseUp); escena.addEventListener(MouseEvent.MOUSE_MOVE, cadMouseMove); } //------------------------------------------- function cadZoomConMouseWheel(event:MouseEvent, escenarioActual:Stage):void { if (keyPressed==17) { if (event.delta > 0 ) { escenarioActual.scaleX =1.05*escenarioActual.scaleX escenarioActual.scaleY=1.05*escenarioActual.scaleY } else { escenarioActual.scaleX =0.95*escenarioActual.scaleX escenarioActual.scaleY=0.95*escenarioActual.scaleY } } } function cadPanConMouseDown(event:MouseEvent):void { } function cadPanConMouseUp(event:MouseEvent):void { timerPan.stop(); } function cadMouseMove(event:MouseEvent):void { // if (keyPressed==16) { // timerPan.start(); // escena.root.x=escena.root.x+escena.mouseX-xMouse // escena.root.y=escena.root.y+escena.mouseY-yMouse // } } //Si tengo pulsada una tecla, capturarla. Se llama desde los eventos del mouse function teclaPulsada(event:KeyboardEvent):void { keyPressed=event.keyCode; } //Si libero tecla, capturarla. Se llama desde los eventos del mouse function teclaLiberada(event:KeyboardEvent):void { keyPressed=0; } function TomaCoordenadasDelMouse(evento:TimerEvent):void { //xMouse=escena.root.mouseX; // yMouse=escena.root.mouseY; } } }
Desde el .fla, llamo a una instancia del stage así:
Código ActionScript :
var RespondeAEventosCad:Teclado = new Teclado(stage);
Cuando llamo a cadZoomConMouseWheel mediante el listener, interpreto que está pulsada la tecla "control" (keyCode 17) mientras hago girar la rueda del mouse: Las propiedades del stage las pilla bien (mouseX, mouseY, etc), pero NO me deja cambiar ninguna, en particular las propiedades xcaleX y scaleY.
"Error: Error #2071: La clase Stage no implementa esta propiedad o método.
at Error$/throwError()
at flash.display::Stage/set scaleX()
at src::Teclado/cadZoomConMouseWheel()
at Function/http://adobe.com/AS3/2006/builtin::apply()
at Function/<anonymous>()
"
Obviamente, necesito cambiar las x, y, scaleX y scaleY desde la propia clase.
¿qué hago mal?
muchas gracias, compis.