Comunidad de diseño web y desarrollo en internet online

como hacer una funcion reutilizable?

Citar            
MensajeEscrito el 18 Abr 2012 04:30 pm
Hola, tengo el siguiente codigo

Código ActionScript :

miClip.stop();

miBtnIN.addEventListener(MouseEvent.CLICK,entrada);

function entrada(e:MouseEvent):void
{
   miClip.addEventListener(Event.ENTER_FRAME,entrar);
}

function entrar(event:Event):void
{
   if (miClip.currentFrame == miClip.totalFrames)
   {
      miClip.stop();
      miClip.removeEventListener(Event.ENTER_FRAME,entrar);
   }
   else
   {
      miClip.nextFrame();
   }
}

que con el click sobre un botón (miBtnIN) arranca la animación de un clip (miClip) y funciona, mi pregunta es, si quisiera usar la misma función con diferentes clips, se que debe cambiar el nombre del clip, pero no se como hacerlo, si ponerlo en una variable pero no se de que tipo, o si usar algo como un this pero ni idea como hacerlo, si alguien (hola Jorge ;)) me puede dar una idea seria de lujo, muchas gracias.

Por Finvara

807 de clabLevel



 

EL reino de los duendes...

chrome
Citar            
MensajeEscrito el 18 Abr 2012 05:08 pm
Leete este hilo, casi al final encontrarás la solución, solo habrás de adaptarlo a lo que necesitas.
Hilo

Si con eso no te aclaras, te lo explico con tu ejemplo.

Un saludo.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 18 Abr 2012 05:42 pm
Gracias Abducted, ese hilo lo había leído justo antes de hacer mi pregunta, pero la verdad no veo por donde adaptarlo a lo que necesito, probé poniendo el nombre del clip en una variable pero la función no me reconoce el nombre del objeto, y me parece que eso lo solucionas definiendo los clips con un for, pero pues en este caso los nombres de los clips no son secuencia, no se si me hago entender ;)

Por Finvara

807 de clabLevel



 

EL reino de los duendes...

chrome
Citar            
MensajeEscrito el 18 Abr 2012 05:55 pm
No se si te entendí bien pero genere un ejemplo






este es el código:

Código :

 

var miTar//Creamos la variable miTar para asignarle luego el nombre de un clip

miBtnIN.addEventListener(MouseEvent.CLICK,entrada);


miClip1.addEventListener(MouseEvent.MOUSE_UP,selecTar);
miClip2.addEventListener(MouseEvent.MOUSE_UP,selecTar);
miClip3.addEventListener(MouseEvent.MOUSE_UP,selecTar);

 //Con la funcion selecTar asignamos nuevo objetivo a la variable



function entrada(e:MouseEvent):void
{   miTar.addEventListener(Event.ENTER_FRAME,entrar); }

function entrar(event:Event):void{
   if (miTar.currentFrame == miTar.totalFrames)
   {
      miTar.stop();
      miTar.removeEventListener(Event.ENTER_FRAME,entrar);
   }
   else
   {
      miTar.nextFrame();
   }
}

function selecTar(evento:MouseEvent):void{
   
   miTar = evento.currentTarget;
   
   
   ind.x = miTar.x;
   
   
   }
   
   //*******************MAXISAN********************//
 

Por MaxiiSan20

Claber

168 de clabLevel



Genero:Masculino  

Montevideo

firefox
Citar            
MensajeEscrito el 18 Abr 2012 05:56 pm
voy a explicar mejor la situacion, tengo unos clips, digamos 3 (los llamaremos: miClip, caja, y triangulo (soy malo para los nombres XD)) cada uno tiene una animacion y asumiremos que todos estan en el stage (aunque en realidad los jalo desde el codigo y con eso no tengo lio), el objetivo es que cuando cargue arranque la animcion de miClip y al llegar al final se detenga, eso es controlado por el click en un boton, luego, con otro boton, miClip se rebobinara, osea va en reversa y justo cuando llegue al primer fotograma arranca la animacion del segundo (caja) y se detiene en el ultimo frame, de nuevo con el boton caja se va en reversa y cuando llega al primer fotograma arranca triangulo, ahora pues, el codigo lo dividi en dos funciones, una para arrancar y otra para salir, lo hice asi por que no se me ocurrio como llamar una funcion desde ella misma cuando finalice el movimiento de cada clip, entonces la primera funcion es la siguiente

Código ActionScript :

miClip.stop();

miBtnIN.addEventListener(MouseEvent.CLICK,entrada);

function entrada(e:MouseEvent):void
{
   miClip.addEventListener(Event.ENTER_FRAME,entrar);
}

function entrar(event:Event):void
{
   if (miClip.currentFrame == miClip.totalFrames)
   {
      miClip.stop();
      miClip.removeEventListener(Event.ENTER_FRAME,entrar);
   }
   else
   {
      miClip.nextFrame();
   }
}

y funciona correcto, ahora la segunda funcion

Código ActionScript :

miBtnOUT.addEventListener(MouseEvent.CLICK,salida);

function salida(e:MouseEvent):void
{
   miClip.addEventListener(Event.ENTER_FRAME,out);
}

function out(event:Event):void
{
   if (miClip.currentFrame == 1)
   {
      miClip.stop();
      miClip.removeEventListener(Event.ENTER_FRAME,out);
   }
   else
   {
      miClip.prevFrame();
      
   }
}

y tambien funciona, ahora, mi precaria logica me indica que cuando el condicional

Código ActionScript :

if (miClip.currentFrame == 1)
   {
      miClip.stop();
      miClip.removeEventListener(Event.ENTER_FRAME,out);
   }
se cumpla debe llamar la funcion entrada () y hacerlo con el objeto caja y no con miCLip, ahi es donde estoy patinando

Por Finvara

807 de clabLevel



 

EL reino de los duendes...

chrome
Citar            
MensajeEscrito el 18 Abr 2012 06:03 pm
gracias maxiisan, aunque no es lo que busco eso de la variable miTar y esta linea miTar = evento.currentTarget; me pueden dar una luz, voy a probar a ver que tal

Por Finvara

807 de clabLevel



 

EL reino de los duendes...

chrome
Citar            
MensajeEscrito el 18 Abr 2012 06:21 pm
Jeje, yo también te lo estaba haciendo
Ahí te lo dejo

Código ActionScript :

import flash.display.MovieClip;

miClipA.stop();
miClipB.stop();
miClipC.stop();

miBtnINA.addEventListener(MouseEvent.CLICK, entrada);
miBtnINB.addEventListener(MouseEvent.CLICK, entrada);
miBtnINC.addEventListener(MouseEvent.CLICK, entrada);

function entrada(e:MouseEvent):void {
   var objetivo:MovieClip;
   
   if (e.target == miBtnINA) {objetivo = miClipA}
   else if (e.target == miBtnINB) {objetivo = miClipB}
   else if (e.target == miBtnINC) {objetivo = miClipC}
   else {trace('fun entrada: objetivo Incorrecto')};
   objetivo.addEventListener(Event.ENTER_FRAME, entrar);
}

function entrar(e:Event):void {
   if (e.target.currentFrame == e.target.totalFrames) {
      e.target.stop();
      e.target.removeEventListener(Event.ENTER_FRAME,entrar);
   }
   else {e.target.nextFrame()}
}

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 18 Abr 2012 06:24 pm
quizá si te sirve para orientarte

Código :



var miTar//Creamos la variable miTar para asignarle luego el nombre de un clip

miBtnIN.addEventListener(MouseEvent.CLICK,entrada);


miTar=miClip1



function entrada(e:MouseEvent):void
{ miTar.addEventListener(Event.ENTER_FRAME,entrar); }

function entrar(event:Event):void{
if (miTar.currentFrame == miTar.totalFrames)
{
miTar.stop();
miTar.removeEventListener(Event.ENTER_FRAME,entrar);

}
else
{
miTar.nextFrame();
}
}

function selecTar(evento:MouseEvent):void{

miTar = evento.currentTarget;


ind.x = miTar.x;


}
miBtnOUT.addEventListener(MouseEvent.CLICK,salida);

function salida(e:MouseEvent):void
{
miTar.addEventListener(Event.ENTER_FRAME,out);
}

function out(event:Event):void
{
if (miTar.currentFrame == 1)
{
miTar.stop();
addEventListener(Event.ENTER_FRAME,changeTar,false,0,true)
miTar.removeEventListener(Event.ENTER_FRAME,out);


}
else
{
miTar.prevFrame();

}
}
var mi = 1
function changeTar(evento:Event):void
{
mi++
if (mi == 1){miTar = miClip1} ;
if (mi == 2){miTar = miClip2} ;
if (mi == 3){miTar = miClip3} ;
if ((mi > 3) ||( mi < 0) ){mi = 1}
removeEventListener(Event.ENTER_FRAME,changeTar)


Por MaxiiSan20

Claber

168 de clabLevel



Genero:Masculino  

Montevideo

firefox
Citar            
MensajeEscrito el 18 Abr 2012 06:26 pm
Ahí te lo dejo funcionando



Un saludo.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 18 Abr 2012 06:39 pm
Y si lo quieres optimizar un poco mas, crea un array con pares [boton, movieclip]
Y para añadir nuevos botones/mc's sólo tienes que crear un par nuevo en el array

Código ActionScript :

import flash.display.MovieClip;

var array:Array = new Array([miBtnINA, miClipA], [miBtnINB, miClipB], [miBtnINC, miClipC])

for (var num:Object in array) {
   array[num][1].stop();
   array[num][0].addEventListener(MouseEvent.CLICK, entrada);
}

function entrada(e:MouseEvent):void {
   var objetivo:MovieClip;
   
   for (var num:Object in array) {
      if (e.target == array[num][0]){objetivo = array[num][1]}
   }
   
   objetivo.addEventListener(Event.ENTER_FRAME, entrar);
}

function entrar(e:Event):void {
   if (e.target.currentFrame == e.target.totalFrames) {
      e.target.stop();
      e.target.removeEventListener(Event.ENTER_FRAME,entrar);
   }
   else {e.target.nextFrame()}
}

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 18 Abr 2012 08:18 pm
hola, muchas gracias por las respuestas, muy interesantes, la de MaxiiSan es la que mas se acerca a la respuesta, intente acomodar el codigo segun las recomendaciones y quedo asi

Código ActionScript :

var miTar;         //miTar para guardar el nombre del clip
var clip:int;      //clip es un contador para saber que clip se ejecuta
clip = 1;

//se detienen las animaciones de los clips
miClip.stop();
caja.stop();
triangulo.stop();
//listener para el boton de arrancar animación
miBtnIN.addEventListener(MouseEvent.CLICK,entrada);

function entrada(e:MouseEvent):void
{
   miTar.addEventListener(Event.ENTER_FRAME,entrar);
}

function entrar(event:Event):void
{
   switch(clip)   //asigna el nombre del clip a la variable miTar
      {
         case(1): miTar = miClip;
         break;
         case(2): miTar = caja;
         break;
         case(3): miTar = triangulo;
         break;
      }
   if (miTar.currentFrame == miTar.totalFrames)
      {
         miTar.stop();
         miTar.removeEventListener(Event.ENTER_FRAME,entrar);
      }
   else
      {
         miTar.nextFrame();
      }
}

miBtnOUT.addEventListener(MouseEvent.CLICK,salida);

function salida(e:MouseEvent):void
{
   miTar.addEventListener(Event.ENTER_FRAME,out);
}

function out(event:Event):void
{
   if (miTar.currentFrame == 1)
      {
         miTar.stop();
         miTar.removeEventListener(Event.ENTER_FRAME,out);
         clip = clip++;
         miTar.addEventListener(Event.ENTER_FRAME,entrar);
      }
   else
      {
         miTar.prevFrame();
      }
}
pero me da el siguiente error

escribió:

TypeError: Error #1010: Un término no está definido y no tiene propiedades.
at Sint_fla::MainTimeline/entrada()

Por Finvara

807 de clabLevel



 

EL reino de los duendes...

chrome
Citar            
MensajeEscrito el 18 Abr 2012 09:12 pm
tines que definir "miTar" sino por defecto es null, en si que quieres que cuando rebobines y llegue al frame 1 automáticamente inicie el siguiente?

Por MaxiiSan20

Claber

168 de clabLevel



Genero:Masculino  

Montevideo

firefox
Citar            
MensajeEscrito el 18 Abr 2012 09:23 pm
Bueno, ya funciono, aunque no de manera perfecta, veamos:

Código ActionScript :

var miTar;         //miTar para guardar el nombre del clip
miTar = miClip;
//se detienen las animaciones de los clips
miClip.stop();
caja.stop();
triangulo.stop();

//listener para el boton de arrancar animación
miBtnIN.addEventListener(MouseEvent.CLICK,entrada);

function entrada(e:MouseEvent):void
{
   miTar.addEventListener(Event.ENTER_FRAME,entrar);
}

function entrar(event:Event):void
{
   if (miTar.currentFrame == miTar.totalFrames)
      {
         miTar.stop();
         miTar.removeEventListener(Event.ENTER_FRAME,entrar);
      }
   else
      {
         miTar.nextFrame();
      }
}
miBtnOUT.addEventListener(MouseEvent.CLICK,salida);
function salida(e:MouseEvent):void
{
   miTar.addEventListener(Event.ENTER_FRAME,out);
}

function out(event:Event):void
{
   if (miTar.currentFrame == 1)
      {
         miTar.stop();
         miTar.removeEventListener(Event.ENTER_FRAME,out);
         addEventListener(Event.ENTER_FRAME,changeTar,false,0,true);
      }
   else
      {
         miTar.prevFrame();
      }
}
var mi = 1;
function changeTar(evento:Event):void
   {
      mi++;
      if (mi == 1){miTar = miClip} ;
      if (mi == 2){miTar = caja} ;
      if (mi == 3){miTar = triangulo} ;
      if ((mi > 3) ||( mi < 0) ){mi = 0};
      removeEventListener(Event.ENTER_FRAME,changeTar);
      miTar.addEventListener(Event.ENTER_FRAME,entrar);
   }
la logica quedo mal, ya que se usa el boton de avanzar la primera vez y ya despues no sirve, solo queda funcionando el de retroceder y cuando llega al final del tercer clip, se repite y ahi si va al primero de nuevo, eso debe ser en la funcion changeTar, de todas formas muchas gracias.

Por Finvara

807 de clabLevel



 

EL reino de los duendes...

chrome
Citar            
MensajeEscrito el 18 Abr 2012 10:12 pm

MaxiiSan20 escribió:

tines que definir "miTar" sino por defecto es null, en si que quieres que cuando rebobines y llegue al frame 1 automáticamente inicie el siguiente?

igual no lo defini y funciona, es una pregunta que aun me esta rondando, y si exactamente eso es lo que quieroque cuando llegue al primero inicie el segundo ;P

Por Finvara

807 de clabLevel



 

EL reino de los duendes...

chrome
Citar            
MensajeEscrito el 18 Abr 2012 10:15 pm
a proposito, podrias explicarme esta linea porfavor que no la entiendo

escribió:

addEventListener(Event.ENTER_FRAME,changeTar,false,0,true);

Por Finvara

807 de clabLevel



 

EL reino de los duendes...

chrome
Citar            
MensajeEscrito el 18 Abr 2012 10:59 pm
addEventListener(Event.ENTER_FRAME, changeTar,false,0,true);


bubbles false
cancelable false; no hay ningún comportamiento predeterminado que cancelar.
currentTarget El objeto que procesa de forma activa el objeto de evento con un detector de eventos.
target Cualquier instancia de DisplayObject con un detector registrado para el evento ENTER_FRAME

Por MaxiiSan20

Claber

168 de clabLevel



Genero:Masculino  

Montevideo

firefox
Citar            
MensajeEscrito el 19 Abr 2012 03:19 am
no entendi XD

Por Finvara

807 de clabLevel



 

EL reino de los duendes...

chrome

 

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