Comunidad de diseño web y desarrollo en internet online

Movimiento de Mc y uso de clase

Citar            
MensajeEscrito el 12 Abr 2011 10:10 pm
Hola tengo un problema estoy migrando de As 2.0 a As 3.0 y la verdad que es como empezar a aprender de 0, hasta el momento estoy tratando de crear una aplicaron en la cual se presione un botón se cree un mc("Player") y lo que intento es controlar este mc con la teclas.
Por lo que he leído de AS 3 es recomendable usar lo menos posible la linea de tiempo así que que estoy tratando de evitarla.
Bien hasta el momento ya tengo creada una clase motor con el siguiente script:

Código ActionScript :

package scriptgame.motor{
   
   //Importación de paquetes necesarios
   import flash.display.MovieClip;
   import flash.display.Stage;
   import flash.events.Event;
   import flash.events.MouseEvent
   
   public class motor extends MovieClip{

   public var NewPlay:player;
   public var id:Number= 0
   
   public function motor ():void{
      
   addEventListener(Event.ENTER_FRAME, loop, false, 0, true);
   
   btn.addEventListener(MouseEvent.CLICK,OtroPlayer);
   }

   private function OtroPlayer(e:Event){
      NewPlay=new player();
      id = id + 1 
      
      NewPlay.x = Math.random() *  350
      NewPlay.y = 110//stage.stageWidth * stage.stageHeight
      addChild(NewPlay);

         }
      
   public function loop(e:Event){      }   
         
      
      }//End Class
   }//End package

acá todo bien presiono btn y se crea otro player su clase es:

Código ActionScript :

package scriptgame.motor{
   
   import flash.ui.Keyboard;
   import flash.display.MovieClip;
   import flash.display.Stage;
   import flash.events.Event;
   import flash.events.KeyboardEvent
   
   public class player extends MovieClip{

private var vx:Number = 0;
private var vy:Number = 0;


   public function player():void
{
   

addEventListener(KeyboardEvent.KEY_DOWN, mover);

   
}
   
   public function mover(e:KeyboardEvent)
{
   
         if(e.keyCode==Keyboard.LEFT)
            trace("Lefth")
         else if (e.keyCode==Keyboard.RIGHT)
            trace("Right")
            
}
   
   }//End Class
}//End package

Ahora mi problema es que no logro hacer que el "player" se desplace mediante el uso de las teclas, agradezco sugerencias,.
Saludos Maxxx

Por MaxiiSan20

Claber

168 de clabLevel



Genero:Masculino  

Montevideo

firefox
Citar            
MensajeEscrito el 13 Abr 2011 10:50 am
Antes que nada, te felicito por moverte a AS3. Con el tiempo veras que no es tan dificil. Tambien me gusta que tomes en cuenta lo de la linea del tiempo, personalmente no la uso para nada XD (literalmente, ni un fotograma en la linea del tiempo principal, solo en mis movieclips si en dado caso lo necesitan).

Consejos:
- Los nombres de las clases deben comenzar con mayusculas, o sea, cambia 'class motor' por 'class Motor' y lo mismo con 'player'.
- Al contrario, los metodos deben comenzar on minuscula, en tu caso, cambia la funcion OtroPlayer por otroPlayer
- A tus clases, funciones y propiedades, es mejor darles nombres que sean logicos y precisos, por ejemplo tu funcion otroPlayer fuese mejor que se llamase agregarPlayer

Veamos ahora tu codigo:

Código ActionScript :

private function agregarPlayer(evento : Event) : void
{ 
      newPlayer = new player(); 
      id++;  
       
      newPlayer.x =  Math.round(Math.random() * 350); 
      newPlayer.y = 110;
      addChild(newPlayer); 
} 


Que hice?
- Cambie el nombre de la funcion.
- e no me dice nada, lo cambie por evento
- Ya que la funcion no regresa nada, agregue 'void'.
- NewPlay lo cambie por newPlayer (con minuscula)
- id++ es lo mismo que id = id + 1; por cierto, no lo estas utlizando, si no lo usas, borralo
- La propiedad 'x' del newPlayer es mejor que sea un numero entero, por eso el Math.round, asi el flash player lo ejecuta mas facilmente. Lo mismo con tamaños de clips y posiciones (width, height, x, y), es mejor que el valor sean numeros enteros.

Sobre tu problema, lo que sucede es que primero tienes que darle 'focus' a tu newPlayer, sino, el keyboardEvent se va al stage y no al child. Busca info sobre 'focus'.

Cualquier cosa, aqui estamos ;)

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox
Citar            
MensajeEscrito el 13 Abr 2011 11:02 pm
Gracias Acreonte tome tus consejos, el id ahora no tiene un uso especifico pero supone ser para identificar cada "Player"(No se me ocurre nada mejor),
Bien con el tema de focus encontre esto;

Código ActionScript :

stage.stageFocusRect = false;
stage.focus = stage0;
se supone que así el foco queda en player
y luego

Código ActionScript :

stage.addEventListener(KeyboardEvent.KEY_DOWN, mover);

pero me tira error


"TypeError: Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo.
at scriptgame.motor::Player$iinit()
at scriptgame.motor::Motor/::agregarPlayer()"
esto salta cuando presiono en el botón para agregar Player. alguna orientación mas precisa gracias de antemano

Por MaxiiSan20

Claber

168 de clabLevel



Genero:Masculino  

Montevideo

firefox
Citar            
MensajeEscrito el 14 Abr 2011 11:28 am
Me imagino que stage no existe en tu clase.
Por cierto, stage YA tiene el focus, la idea es pasarle el focus a tu objeto porque lo que quieres que reaccione a las teclas es el objeto y no el stage.

Por ejemplo:

Código ActionScript :

private function agregarPlayer(evento : Event) : void 
{  
      newPlayer = new player();  
      id++;   
      
      newPlayer.x =  Math.round(Math.random() * 350);  
      newPlayer.y = 110;
      newPlayer.addEventListener(MouseEvent.CLICK, cambiarFocus);
      addChild(newPlayer);  
}  

private function cambiarFocus(event : MouseEvent) : void 
{
      stage.focus = newPlayer;
}

O mejor aun, eso debiese estar en la clase Player y quiza tambien la posicion x,y.

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox
Citar            
MensajeEscrito el 15 Abr 2011 10:43 pm
Ya lo solucione, ahora el problema es como le paso la propiedad xscale?

Por MaxiiSan20

Claber

168 de clabLevel



Genero:Masculino  

Montevideo

firefox
Citar            
MensajeEscrito el 15 Abr 2011 11:23 pm
hmm... tienes que estudiar un poquito!

ya no se llama xscale sino scaleX ;)

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox
Citar            
MensajeEscrito el 16 Abr 2011 07:48 am
Si de verdad, gracias voy a tratar de investigar mas y preguntar menos XD.

Por MaxiiSan20

Claber

168 de clabLevel



Genero:Masculino  

Montevideo

firefox
Citar            
MensajeEscrito el 16 Abr 2011 08:48 am
jaja no, no dejes de preguntar que para eso estan los foros y para eso estamos todos aqui, para compartir conocimientos ;)

Leer blogs, participar en foros e investigar cuando nos atascamos, es parte importante en la formacion de todo cristalabero U_U

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox

 

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