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.
