Comunidad de diseño web y desarrollo en internet online

Problema con MovieClip

Citar            
MensajeEscrito el 05 May 2012 01:35 pm
Hola amigos del foro, esta vez mi problema es algo que me lleva la cabeza hace unos días y al no encontrar respuesta acudo a ustedes como mi salvación.
Buenos sucede que estoy haciendo un juego para aprender AS3, pero me frene al intentar que salgan varias barreras en tiempo aleatorio y que se detecte su colisión. Ya me funciona con una solo barrera pues en un tiempo dado la elimino y sale de nuevo; de este modo me detecta la colisión, pero si envío mas de una barrera si eliminar las anteriores no detecta la colisión. Este es mi código:
Bueno aclaro que la barrera y los otros objetos los agrego al escenario por AS3.

//creo la variable para la barrera de la biblioteca
var ice:MovieClip;
//hago la instancia del objeto para agregar a la biblioteca
ice = new Hielo() as MovieClip;
//Asigno las propiedades x, y
ice.x = 443;
ice.y = 53;
this.addChild(ice);

En el EnterFrame controlo si hay colisión con la barrera
if( muneco.hitTestObject(ice) ){
//Acciones
}

Funciona bien pero si quiero agregar mas barreras "ice" en tiempos diferentes no me da. solo cuando eliminno antes de crear
this.removeChild( ice );
ice = null;

bueno espero me puedan ayudar con este problemita. Gracias de antemano por su tiempo y colaboración.

Por jcsalazarm

38 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 05 May 2012 04:47 pm
Buenos días,les te cuento que buscando aquí en Cristalab encontré varias ayudas pero igual no me detecta la colisión; me crea muchos "ice" pero no detecta la colisión les muestro mi nuevo código a ver si encuentran algún error. De antemano muchas gracias por tu tiempo y ayuda.

//Creo el array y el timer
var array:Array;
var TimeGame:Timer;

//creo las variables para traer los objetos desde la biblioteca
var muneco:MovieClip;
var ice:Sprite;

//En mi constructor:
//Instancio el timer y lo inicio para la funcion lazaHielo
TimeGame = new Timer(350, 0);
TimeGame.addEventListener(TimerEvent.TIMER, lanzaHielo);
TimeGame.start();

//y aquí la función lanzaHielo, la que crea y valida la colisión con la barrera "ice"
private function lanzaHielo(e:Event):void{
for each ( var _hielo:Hielo in array )
{
array = new Array();
ice = new Hielo() as Sprite;
ice.x = 443;
ice.y = obUTil.fnNumAle(53,MaxAl);
array.push(ice);
addChild(ice);
//Creo la posición en y de forma aleatoria



if ( pinguino.hitTestObject( ice ) )
{
TimeGame.stop();
}
}
}

De nuevo muchas gracias por tu ayuda.

Por jcsalazarm

38 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 07 May 2012 02:04 pm
Nadie tiene una respuesta??

Por jcsalazarm

38 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 07 May 2012 02:13 pm
No entiendo mucho, tienes un array de elementos y quieres detectar una colisión con un solo hitTest? Si el hitTest está en el loop de creación se ejecuta una sola vez por cada referencia ...
Tip: síntesis y mas síntesis please

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 07 May 2012 03:07 pm
Buenos días Jorge, gracias por responder, mira tengo un ciclo for each y en él creo la berrera que llamo "ice" y luego evalúo su colisión con el muneco; te aclaro que esta en in ciclo pero no me genera ninguna colisión, espero me puedas dar ideas de que hacer o ayudarme a descubrir mi error. De antemano muchas gracias por tu tiempo y tu ayuda.

Código :

private function lanzaHielo(e:Event):void{
         for each ( var _hielo:Hielo in array ) 
            {
               array = new Array();
               ice = new Hielo() as Sprite;
               ice.x = 443;
               ice.y = obUTil.fnNumAle(53,MaxAl);
               array.push(ice);
               addChild(ice);
               
               
               
               if ( pinguino.hitTestObject( ice ) ) 
               {
                  //pinguino.x = pinguino.x -5;
                  //_NivelSangre.width -=1;
                  //pinguino.gotoAndPlay(2);
                  TimeGame.stop();
               }
            }
      }

Por jcsalazarm

38 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 07 May 2012 03:10 pm
Hazta donde veo el hitTest se ejecuta una sola vez por hielo y asumo que pinguino está en la misma línea de tiempo. ¿Es esto lo que buscas? Si por ejemplo el hielo se desplazael hitTest debería ser en un onEnterFrame, porque asi básicamente chequeas que no lo estes creando encima.

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 07 May 2012 03:36 pm
Mmmm, veo; creo que encontraste mi error, ahora mismo pruebo y te cuento. Gracias por responder

Por jcsalazarm

38 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 07 May 2012 03:42 pm

solisarg escribió:

Hazta donde veo el hitTest se ejecuta una sola vez por hielo y asumo que pinguino está en la misma línea de tiempo. ¿Es esto lo que buscas? Si por ejemplo el hielo se desplazael hitTest debería ser en un onEnterFrame, porque asi básicamente chequeas que no lo estes creando encima.

Jorge


bueno jorge muchas gracias por tu respuesta, ya probé y sigo igual con el problema; ademas ahora que reviso tenia la validación del HitTest en un Timer por tanto suponía que eso se repetía varias veces, igual lo cambie de posición y nada sigo igual, no detecta la colisión.

Por jcsalazarm

38 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 07 May 2012 03:54 pm
Si lo tienes en un Timer se repite si o no, supongo no es respuesta.
¿Lo cambiaste de posición? ¿Adonde?
Tip: precisión en las descripciones técnicas

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 07 May 2012 04:19 pm
Lo cambie a un enterFrame y no medio. Si se repite la creación de los "ice" pero no hace la validación del hitTest.

Por jcsalazarm

38 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 07 May 2012 04:26 pm
Ok, lo cambiaste a un onEnterFrame. Dado que el hitTest requiere referencias válidas a cada Ice, asumo que tienes un loop que toma referencia de cada IceTest para hacer el hitTest. Postea el código correspondiente
Tip: solo el código correspondiente, no TODO el código

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 07 May 2012 04:49 pm
No!! en verdad que no tengo referencia o al menos no te entiendo bien; te posteo mi código a ver si me das luces de tomar la referencia.

Código :

//Creo las variables
var array:Array;
var TimeGame:Timer;

var pinguino:MovieClip;
var ice:Sprite;

//En el constructor
//Instancio el timer y lo inicio para la funcion lazaHielo
TimeGame = new Timer(350, 0);
TimeGame.addEventListener(TimerEvent.TIMER, lanzaHielo);
TimeGame.start();

//La funcion que crea los ice, ya no verifica el hitTest (antes si lo hacia)
private function lanzaHielo(e:Event):void{
         for each ( var _hielo:Hielo in array ) 
            {
               array = new Array();
               ice = new Hielo() as Sprite;
               ice.x = 443;
               ice.y = obUTil.fnNumAle(53,MaxAl);
               array.push(ice);
               addChild(ice);
            }
      }

//En el enterFrame: doy movimiento al ice con la libreria TweenLite
private function MyEnterFrame(e:Event):void
      {
            TweenLite.to(ice,5,{x:-50 , scaleX:0.3, scaleY:0.3});
                        
            if( pinguino.hitTestObject(ice) ){
               pinguino.gotoAndPlay(2);
                                        TimeGame.stop();
            }
         }
      }



Espero me entiendas y me puedas ayudar!!

Por jcsalazarm

38 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 07 May 2012 05:49 pm
Ok, no veo que lances el listener del onEnterFrame en nigun lado,. pero suponiendo que así sea, usas el identificador ice, que se sobreescribe en el loop de lanzaHielo, que a su vez se lanza cada 350 ms
Suponiendo que _hielo tenga digamos 10 elementos, lo que ocurriria es que creas 10 ice y luego animas solo el último hasta que es sobreescrito por la siguiente llamada del lanzaHielo. Si esto es algo como algo lanzando pedazos de hielo, la gran mayoría se deben quedar estáticos, unos poquitos se mueven y hacen hitTest una o dos veces (depende de los FPS a los que tengas tu peli)
¿Me estoy olvidando algo?

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 07 May 2012 07:24 pm
De nuevo gracias Jorge por tu ayuda, me falto ponerte el listener del EnterFrame pero igual si lo tiene; pues te cuento que si se mueven todos los hielos y efectivamente se crean cada 350ms, pero como dices no hace hitTest no veo cual es el problema pues he buscado en internet varios ejemplos y todos lo hacen como lo tengo. Espero me puedas ayudar y de antemano muchas gracias por tu colaboración.

Por jcsalazarm

38 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 07 May 2012 07:43 pm
¿Que es _hielo:Hielo ? ¿Cuantos elementos tiene? ¿Como puede ser que se muevan todos los hielos si solo tienes un Tween? Algo no me cierra

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 07 May 2012 07:54 pm

solisarg escribió:

¿Que es _hielo:Hielo ? ¿Cuantos elementos tiene? ¿Como puede ser que se muevan todos los hielos si solo tienes un Tween? Algo no me cierra

Jorge


Hola de nuevo Jorge, mira _hielo es la variable que tengo para hacer la interacción con el
array en el for each: for each ( var _hielo:Hielo in array )

Bueno No sabria cuanto elementos tiene el array pues se crean y agrega al array cada 350ms y se eliminan al llegar a una posición en el escenario.

Código :

if( ice.x<80 ){
        //Destruyo el hielo que existe
   this.removeChild( ice );
   ice = null;
}


Y seguro se mueven todos los ice pues el TweenLite esta en el EnterFrame.

No se si tengas una solución diferente al código que te presento y me puedas ayudar desde cero si es que tengo demasiados errores en mi código.

Quedo atento.

Por jcsalazarm

38 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 07 May 2012 07:59 pm
No se si me puedas dar una solución para simplemente crear muchas barreras que hagan colisión con un objeto en el escenario. Me parece que te sorprende mi código; supongo debe tener muchos errores de lógica o de sintaxis no se!!

Por jcsalazarm

38 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 07 May 2012 08:09 pm
Ah, ok, array le pusiste a la variable, pésimo nombre. Ok, para evitar 5 tiros lo pongo mas coherente

Código ActionScript :

private var _cantBolas:int = 5;
private var bolasActivas:Array = new Array();

private function lanzaHielo(e:Event):void{
         for ( var i:Number = 0; i<_cantBolas; i++) 
            {
               ice = new Hielo() as Sprite;
               ice.x = 443;
               ice.y = obUTil.fnNumAle(53,MaxAl);
               bolasActivas.push(ice);
               addChild(ice);
            }
      }
private function MyEnterFrame(e:Event):void
      {
            var tot:int = bolasActivas.length
             for ( var i:Number = 0; i<_cantBolas; i++) 
            {
               var t:Sprite = bolasActivas[i];
               TweenLite.to(t,5,{x:-50 , scaleX:0.3, scaleY:0.3});                        
              if( pinguino.hitTestObject(t) ){
                 pinguino.gotoAndPlay(2);
                 break;
             }
         }
      }


Lo hago muy rápido y de memoria, puede que halla algun error de sintaxis o coma de mas, pero esa es la idea. Los nombres de variables deben ser obvios y en un juego el rendimiento es el rey. La rutina para quitar el hielo debería:

- recorrer todo el array de hielos y ver si su posición supera el limite
- si lo supera, hacer el removeChild y quitarlo del array, porque sino no se quita de memoria

Idealmente deberías hacer un pool de hielos para evitar instanciarlos cada vez ... pero deja eso cuando el resto funcione ok

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos



Ultima edición por solisarg el 07 May 2012 08:40 pm, editado 1 vez

Argentina

firefox
Citar            
MensajeEscrito el 07 May 2012 08:39 pm
Gracias jorge por tu ayuda, mira escribo el codigo que me diste y me sale un error:
TypeError: Error #2007: Parameter hitTestObject must be non-null.
at flash.display::DisplayObject/_hitTest()
at flash.display::DisplayObject/hitTestObject()

Este error me sale inmediatamente ejecuto el SWF Entiendo que el hitTest no tiene el parámetro del "t" que le envias!! y no veo porque pues esta bien y no veo error.

Por jcsalazarm

38 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 07 May 2012 08:42 pm
Aqui lo pones

bolasActivas.push(ice);

Aqui lo recuperas

var t:Sprite = bolasActivas[i];

Si no existe, haciendo un trace sale undefined

trace(t);

¿Existe o no existe?

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 07 May 2012 08:50 pm
Bueno Jorge te cuento que ya no me sale el error tenia un error en una coma, sin embargo hago el trace y me sale bien; sale algo como:
Mostrar:[object Hielo]
Mostrar:[object Hielo]
Mostrar:[object Hielo]

Pero tengo el problema que solo se mueven los 5 primeros ice, los otros se queda en el principio; pero efectivamente ya me hace colisión con todos los ice, intentare cambiando cosas para terminar el código. muchas gracias de verdad por tu ayuda!!

Por jcsalazarm

38 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 12 May 2012 07:49 pm
Hola Jorge y compañeros del foro, les cuento que con la ayuda de Jorge ya puede poner a funcionar lo que necesitaba pero ahora no entiendo por que pero me da colisión para casi todos los ice solo que cuando vienen muchos no me la detecta; no se que puede pasar pues aveces si trabaja sin problemas pero otras me jode y no da. Si se les ocurre algo por favor me ayuda.

Aquí les muestro como puse mi code:

Código :


//En el constructor agrego un timer
TimerIce = new Timer(25);
TimerIce.addEventListener( TimerEvent.TIMER, creaIce );

//Luego en la función que es donde esta casi toda la crema de esto:
private function creaIce(e:TimerEvent):void{

         avatar.x = mouseX;
         avatar.y = mouseY;
         
         if ( Math.random() < 0.02 ){
            muchosIce = new Array();
            nIce = new Hielo();
            muchosIce.push(nIce);
            addChild(nIce);
            nIce.correHielo();
         }
         
         for each ( var ice:Hielo in muchosIce ) 
         {
            if( avatar.hitTestObject(ice) ){
               trace("Me Colision");
               avatar.gotoAndPlay(2);
            }
         }
      }


Bueno la variable muchos Ice como sabes es un array, el avatar es mi muñeco a mover y ya lo muevo con el mouse.

De antemano muchas gracias por la ayuda que me puedan brindar!!

Por jcsalazarm

38 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 13 May 2012 01:10 pm
Dado que los hitTest se ejecutan a la velocidad del procesador, si hay muchos elementos involucrados no llega a procesar todo y puede que alguno pase de largo. Para optimizar hittest te conviene que los dibujos sean lo mas rectangulares posibles y que la velocidad de desplazamiento no sea muy grande.
Luego mejor que hitTest es Rectangle.intersects, aunque para eso deberías capturar los rectángulos de cada MC

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox

 

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