Comunidad de diseño web y desarrollo en internet online

encontrar las variables asociadas a elementos de un array

Citar            
MensajeEscrito el 05 Feb 2012 06:16 pm
Buenas, soy nuevo posteando, pero ya conozco un poco el foro. Gracias por todas las veces que con vuestros comentarios me habéis dado ideas para solucionar problemas que me he encontrado con el actionscript.

Bueno, mi problema es el siguiente:
Tengo varios movieclip cuyas rutas están metidas en un array de una clase diferente (la que controla el funcionamiento general del programa). Los movieclip comparten las mismas variables pero cada uno tiene valores diferentes. (por ejemplo en uno la variable arboles vale 100 y en otro vale 50). Lo que quiero es cargar en la clase general los valores de uno de los movieclips, pero no se cómo se hace referencia a una variable de un elemento que se encuentra en una matriz.

He probado con escena[i].arboles, pero me sale undefined.
En cambio si en vez de eso pongo la ruta original, (_root.bosque10.arboles) coge el valor correctamente.

Por pendragon44

4 de clabLevel



 

firefox
Citar            
MensajeEscrito el 06 Feb 2012 01:26 pm
Para que funcione el array debería tener una referencia al MC arboles10, y si es así por ejemplo este trace debería sacar ese nombre:

trace(escena[i]._name)

Si sale undefined es porque no tienes guardada la instancia en el array. El i supongo que es porque estás intentando esto detro de un loop, sino i no tiene ningún valor

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 06 Feb 2012 03:34 pm
la referencia que tiene el array al MC es la ruta del movieclip, de hecho en cada una de las clases de los movieclips le tengo puesto que meta la ruta del MC dentro del array. (el código está dentro de function onLoad() y es el siguiente:

_root.campodetexto.escena.push("_root." + _name;

siendo "campodetexto" el MC que controla todo, y "escena" el nombre del array.)

El "[i]" viene del método que utilizo para localizar el MC que quiero dentro del array, que es usando un hitTest combinado con un for.
Es decir:
function detectanuevaescena()
{
for (var i in escena)
{
if(_root.locator.hitTest(escena[i]))//locator es el nombre de instancia del puntero
{
escenaactual = escena[i];
}
}
}
Con este procedimiento me detecta la escena correctamente, (si le pongo un trace a "escenaactual" me sale la ruta del movieclip seleccionado en ese momento)
pero si en vez de querer conocer en qué MC estoy lo que busco es saber el valor de una variable de ese MC ( en este caso la variable arboles) no lo detecta. Y si le pongo un trace, es aquí donde me sale "undefined".

A modo de resumen:

tengo 2 MC de los que quiero obtener información, estos son:
"bosque10" y "bosque11"

estos MC están dentro de un array que se llama:
escena

quiero conocer el valor de una variable de estos MC, esta variable se llama:
arboles

los valores de esta variable los puedo conocer con el código:
_root.nombre de instancia.nombre de la variable (ej: _root.bosque11.arboles)

pero no lo logro si en vez de utilizar la ruta completa para identificar al MC utilizo su posición dentro del array, por lo que expresiones del tipo:

escena[1].arboles
escenaactual.arboles
escena[i].arboles (entendiendo esta última expresión dentro de un for combinado con un hitTest)

no funcionan.
Espero haberme explicado un poco mejor esta vez, y gracias de nuevo por vuestro tiempo, especialmente a Jorge por haber tardado tan poco en contestar.

Por pendragon44

4 de clabLevel



 

firefox
Citar            
MensajeEscrito el 06 Feb 2012 04:26 pm
¿Que sale de este trace?

trace(escena[i]._name)

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 Feb 2012 12:52 pm
me sale undefined.

No lo entiendo. ¿porqué me sale eso si cuando pongo trace(escena[i]) me sale la ruta correcta?

Por pendragon44

4 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Feb 2012 01:03 pm
Porque lo que tienes es una ruta, no una referencia al clip, tendrías que poner

escena[0] = _root.clip1.clip2

Puesto sin las comillas es una referencia al MovieClip y puedes acceder a sus propiedades. con comillas es solo un string que indica la ruta

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 Feb 2012 01:24 pm
vale. entonces, ¿cómo podría hacer para que funcione a la vez el hittest y el acceso a las propiedades del clip?

Por pendragon44

4 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Feb 2012 01:35 pm
Lo del acceso a las propiedades te lo acabo de contestar, lo del hittest, si es que lo usas haciendo un loop sobre el array, y chequeas que el clip de contra otro que este dentro de su mismo timeline (hitTest funciona sobre MCs con la misma jerarquia) también debería funcionar

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 Feb 2012 02:12 pm
pues metiendo en el array solo el _name, no me funciona el hitTest. De hecho es una de las cosas que probé antes de postear

Por pendragon44

4 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Feb 2012 02:38 pm
El name es una propiedad. Aquí pongo el name

miArray.push(_root.clipA.clipB._name)

En cambio aquí pongo una referencia al clip mismo

miArray.push(_root.clipA.clipB)

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 Feb 2012 03:44 pm
Y ¿se podría poner dentro del push una ruta que desconoces? ¿cómo se haría?

Por pendragon44

4 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Feb 2012 07:59 pm
Si la desconozco no la puedo poner, no entiendo la pregunta

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 08 Feb 2012 10:41 am
la idea es poner todos esos scripts dentro de una clase. Y asociar a esa clase todos los MC que tengan el mismo comportamiento. Imagina que yo quiero crear un bosque, por el que te puedas mover. Podría considerar que ese bosque es un cuadrado dividido en 9 casillas (3x3) y que cada una de las casillas es un MC.
Lógicamente las casillas que representan las lindes del bosque (las de los bordes) deberían tener menos árboles que las del centro. Con lo que podría asignar la misma clase para todas las casillas de los bordes (pues todas deberían tener pocos árboles) y una clase distinta para la casilla del centro (que debería tener muchos más).
Entonces para la clase a la que le corresponden las 8 casillas de los bordes, podría decirle manualmente todos los nombres de los MC que tiene asociados, o (mi idea era) que como cada MC al cargarse iba a ejecutar todas las acciones que estuvieran escritas en la clase, decirle a la clase que fuera identificando cada uno de los MC que la ejecutaban (con lo que yo no tendría por qué saber las rutas de los MC).
De hecho el problema viene cuando vas a hacer los hitTest, donde es más difícil o al menos más tedioso tener que ir averiguando con qué MC estás haciendo el hitTest.
____________________________________________________________________________________

La solución provisional que le he dado a toda esta historia es crear dos matrices (arrays para los que no sean de aquí) la orden que ejecutaba la clase de los MC para una de las matrices es:

matriz1.push("_root." + _name (_name te dice el nombre que tiene el MC en el .fla)

y otra matriz que recibe las propiedades de los MC:
matriz.push(numerodearboles).
Aunque luego se me ocurrió iniciarme en el noble arte de las matrices multidimensionales y sustituí la variable del número de árboles por una matriz (creada en la clase de los MC) que contuviera todas las propiedades de la clase en cuestión.
¿cómo relaciono las dos matrices?
Más sencillo de lo que parece. Decíamos que con la primera matriz hacíamos los hitTest, ¿no?
bueno, pues solo tenemos que saber el valor de "i" y tan sencillo como tener una variable que coja ese valor. Veamos:
for (var i in matriz1)
{
if (_root.puntero.hitTest (matriz1[i]))
{
valordei = i;
}
}
y a continuación buscamos esa misma posición en la segunda matriz:
matriz2[valordei]. (o matriz2[valordei][n], para matrices multidimensionales y siendo n la posición del elemento que estamos buscando dentro de la matriz de las propiedades.
Dicho esto, aclarar que como bien ha dicho jorge, una expresión del tipo "_root." + _name no es exactamente una referencia a un MC, sino una cadena (string) con lo que no podemos esperar que nos diga los valores de un MC que se llame igual.
(Jorge, muchas gracias porque sin ese aporte jamás habría podido salir del paso.)

No obstante, sea como fuere, (probablemente sea un bug bueno, {¡arrodilláos ante este raro hallazgo!, XD} ) sí cuela a la hora de hacer los hitTest con otro MC.
Aun así, hasta donde sé, para el resto de los aspectos se seguirá comportando como una cadena.

Por pendragon44

4 de clabLevel



 

firefox
Citar            
MensajeEscrito el 08 Feb 2012 12:18 pm

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.