Comunidad de diseño web y desarrollo en internet online

Cambiar propiedades del stage desde una clase (zoom y pan)

Citar            
MensajeEscrito el 12 May 2012 01:27 pm
Hola
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.

Por TheMagoZero

41 de clabLevel



 

Ingeniero Técnico Industrial

firefox
Citar            
MensajeEscrito el 12 May 2012 01:29 pm
p. d.: el error me surge cuando intento hacer lo siguiente:

Código ActionScript :

function cadZoomConMouseWheel(event:MouseEvent, escenarioActual:Stage):void {
         if (keyPressed==17) {
            if (event.delta > 0 ) {
              //AQUÍ SURGE EL ERROR DESCRITO
               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
               }
         }
      }

Por TheMagoZero

41 de clabLevel



 

Ingeniero Técnico Industrial

firefox
Citar            
MensajeEscrito el 12 May 2012 09:56 pm
Me contesto yo después de investigar: propiedades read only en tiempo de ejecución del stage:

Fuente: Adobe
Texto:
Además, las siguientes propiedades heredadas no son aplicables a los objetos Stage. Si intenta establecerlas, se emitirá un error IllegalOperationError. Estas propiedades siempre pueden leerse, pero dado que no pueden establecerse, siempre contienen valores predeterminados.

accessibilityProperties
alpha
blendMode
cacheAsBitmap
contextMenu
filters
focusRect
loaderInfo
mask
mouseEnabled
name
opaqueBackground
rotation
scale9Grid
scaleX
scaleY
scrollRect
tabEnabled
tabIndex
transform
visible
x
y

Por TheMagoZero

41 de clabLevel



 

Ingeniero Técnico Industrial

firefox
Citar            
MensajeEscrito el 13 May 2012 04:07 pm
A esta clase le podes pasar el movieclip que quieras y aplicarle a el las acciones que queres.
Tenes que mejorar lo del zoomIn y zoomOut.

Saludos


eXE

Por exekiel21

Claber

164 de clabLevel



Genero:Masculino  

programador

firefox
Citar            
MensajeEscrito el 13 May 2012 09:37 pm
Hola eXE
Ya se que tengo que mejorarlo :) Soy novatete en esto de AS3.

Creo que he conseguido algo simpático ya, y me hace cada zoom y cda pan que no veas :D

La solución que le he dado es pasarle una instancia de root a la función constructora de la clase Teclado, así:

Código ActionScript :

public function Teclado(escena:Stage,miRoot:DisplayObject)  {


Desde el root del .fla, lo llamo así:

Código ActionScript :

var RespondeAEventosCad:Teclado = new Teclado(stage,this);


y ya me responde excelentemente a los cambios. He configurado un zoom creo que suficiente, y un pan que también me va bien.

Los listeners se los pongo al stage, y las propiedades se las cambio al root. Un invento, pero oye, funciona

Muchas gracias por tu ayuda

p.d.: Estoy liado con un programa CAD. SI tienes algo sobre zoom y pan, pues que se agradece infinitamente :D

Salu2

Por TheMagoZero

41 de clabLevel



 

Ingeniero Técnico Industrial

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.