AS3: Display List [Beginners]

47 views
Skip to first unread message

Comet!

unread,
Dec 30, 2008, 2:50:20 PM12/30/08
to ASNativos - Lista de Actionscript
Estoy intentando meter en un contenedor dos moviclips de la biblioteca
(clip y bg, vinculados como "Clip" y "Bg"). La idea es hacer un array
de contenedores y en cada un meter los dos clips.
Me aparece el siguiente error: 1180: Call to a possibly undefined
method contenedor

[CODE]
var titulos:Array=["Uno", "Dos", "Tres", "Cuatro", "Cinco"];

var contenedor:Sprite=new Sprite();

var clip:MovieClip = new Clip();
contenedor.addChild(clip);

var bg:MovieClip = new Bg();
contenedor.addChild(bg);

var arrayContenedores:Array=new Array;

for (var i:int=0;i<17;i++){
arrayContenedores.push(new contenedor());
stage.addChild(arrayContenedores[i]);
arrayContenedores[i].clip.salida_txt.text=titulos[i];
}
[/CODE]

Julio Rabadán González

unread,
Dec 30, 2008, 3:05:17 PM12/30/08
to asna...@googlegroups.com
Ains...
no puedes hacer lo que quieres de esa manera :)

contenedor no es el nombre de una clase, sino de una instancia. Luego no puedes hacer un new contenedor(), a lo sumo un new Sprite().

Además tienes otro par de fallos:

stage.addChild(arrayContenedores[i]) te va a petar porque el mñetodo addChild recibe como parámetro un objeto del tipo DispayObject, y tu le estás pasando a lo cafre un Array (de DisplayObjects, eso sí, pero un Array al fin y al cabo). Los tienes que añadir uno a uno.

Y caso de que te funcionara, tienes que sacarlo del bucle, porque sino te lo va a agregar 17 veces!!!

Lo que tu quieres hacer es algo así:

[CODE]
var titulos:Array=["Uno", "Dos", "Tres", "Cuatro", "Cinco"];

function buildContainer():Sprite
{
	var contenedor:Sprite=new Sprite();

	var clip:MovieClip = new Clip();
	contenedor.addChild(clip);

	var bg:MovieClip = new Bg();
	contenedor.addChild(bg);

	return contendor;
}
var arrayContenedores:Array=new Array;

for (var i:int=0;i<17;i++){
		contenedor:Sprite = buildContainder();
		stage.addChild(contenedor);
		// aqui tendrías que posicionarlo. Ponerle su x, su y, y esas cosas que tienen los sprites :)
		contenedor.clip.salida_txt.text=titulos[i];
}
[/CODE]
Aunque si quires hacer las cosas un poquito mejor, creáte una clase para ese contenedor, que lo está pidiendo a gritos.

Salute!



Comet! escribió:

Julio Rabadán González

unread,
Dec 30, 2008, 3:08:21 PM12/30/08
to asna...@googlegroups.com
De hecho sin hacerte la clase creo que esta línea te petará (al menos en AS3):

contenedor.clip.salida_txt.text=titulos[i];

Julio Rabadán González escribió:

Comet!

unread,
Dec 30, 2008, 3:16:33 PM12/30/08
to ASNativos - Lista de Actionscript
Gracias
Me peta en la línea que dice:

contenedor:Sprite = buildContainer();

Dice Implicit coercion of a value of type flash.display:Sprite to an
unrelated type Class
y Illegal asignment to Class Sprite

Julio Rabadán González

unread,
Dec 30, 2008, 3:32:30 PM12/30/08
to asna...@googlegroups.com
Error mio.
si es que ni lo he probao...

tiene que ser:

var contenedor:Sprite = buildContainer();

Comet! escribió:

Comet!

unread,
Dec 30, 2008, 3:39:39 PM12/30/08
to ASNativos - Lista de Actionscript
Gracias!
Funciona

Tienes razón, se peta en la línea:

contenedor.clip.salida_txt.text=titulos[i];

Dice Access of possibly undefined property clip through a reference
with static type flash.display:Sprite.

Con lo fácil que era en AS2...

Julio Rabadán González

unread,
Dec 30, 2008, 3:43:20 PM12/30/08
to asna...@googlegroups.com
Bueno, si te haces la clase te funcionara. Es muy sencillo, pero ahora me voy de cervezas y no me da tiempo. Tienes tarea ;)
Adios!

Comet! escribió:

Cay

unread,
Dec 30, 2008, 4:03:58 PM12/30/08
to asna...@googlegroups.com
si es por apañar, tb lo puedes hacer "a la" AS2 asi:

var contenedor=new MovieClip(); //en vez de Sprite
contenedor.clip=new Clip();
contenedor.addChild(contenedor.clip);
contenedor.clip.salida_txt.text=titulos[i];

Pero es bastante guarrete ;)

En todo caso, segun dices, por cada contenedor necesitas una nueva
instancia de clip, por lo que deberias hacer algo asi en tu loop:
for(...) {
var contenedor=new Sprite();
var clip=new Clip();
clip.salida_txt.text=titulos[i];
contenedor.addChild(clip);
addChild(contenedor);
arrayContendores.push(contenedor);
}

Aunque lo ideal, como te dicen, es hacerte una clase Contendor y ya ta ;)

for(...) {
var contenedor=new Contenedor(titulos[i]);
addChild(contendor);
arrayContendores.push(contenedor);
}

Saludos y suerte!

Comet!

unread,
Dec 31, 2008, 4:22:57 AM12/31/08
to ASNativos - Lista de Actionscript
Gracias Cay,

tira ok
Bueno, es lo de siempre: ¿hacer una clase sólo para esto?
Sigo pensando que AS3 está mal hecho
y tb Moock (http://www.insideria.com/2008/07/the-charges-against-
actionscri.html)
> > Con lo fácil que era en AS2...- Ocultar texto de la cita -
>
> - Mostrar texto de la cita -

Iván

unread,
Dec 31, 2008, 4:44:16 AM12/31/08
to asna...@googlegroups.com
No está mal hecho (aunque aún tienen que arreglar cosas), pero el
cambio es muy radical.
Han dado la espalda a todos los diseñadores-desarrolladores sin
conocimientos de programación, que son los que en su día hicieron
grande Flash, y ahora se encuentran con que no pueden poner un boton
para mandar un email sin pedir ayuda o leer mucho en internet. Y eso
si me parece mal. Es una apuesta muy arriesgada, y por mucho que nos
guste AS3 a los programadores, no se si podremos *mantener* nosotros
solos el ritmo de crecimiento del programa. El programa está muy
lanzado, pero antes conocía mucha gente que había empezado con Flash
trasteando, y ahora casi no veo que nadie empiece por su cuenta, y eso
a medio plazo no se en qué va a terminar.
Un saludo.

Julio Rabadán González

unread,
Dec 31, 2008, 4:44:16 AM12/31/08
to asna...@googlegroups.com
Comet, hacer una clase no es nada del otro mundo. Collin Moock no se refiere a eso el artículo. Tanto en AS2 como en AS3 la recomendación es hacer una clase ya que  tienes un objeto en pantalla, asociado a otros dos, y además quieres acceder a sus propiedades; y eso debe reflejarse en el código de una manera clara y ordenada, y la manera de hacerlo es con una clase.

Otra opcción (ñapera a no ser que sea algo ocasional) que puedes usar es acceder a clip usando el método getChildByName() para hacerlo parecido a AS2:

<code>
for(...) {
  var contenedor=new Contenedor(titulos[i]);
  addChild(contendor);
  var clip=contenedor.getChildByName("clip");
  clip.salida_txt.text=titulos[i];
  arrayContendores.push(contenedor);

}
</code>

Otro cantar es que con AS3 las cosas requieran más control del código que antes, y saber programar. Hasta ahora los diseñadores programaban a lo "Alfredo Landa", como dice mi diseñador, utilizando AS1. Cuando aparecio AS2 la cosa cambió un poco, ya se podía programar mejor, pero la compatibildiad hacia atrás hizo que se pudiera seguir con las mismas prácticas, y nadie aprendió. Se siguió programando en AS1, con ciertos cambios.
Con AS3 la cosa ha cambiado radicalmente. Desde un punto de vista de un programador la cosa ha mejorado sustancialmente, pero para un diseñador es una pesadilla. Para hacer lo que antes se hacía en una línea (mejor o peor) ahora hace falta programar de verdad en POO, requiriendo mucho más código. Desde mi punto de vista esto es un fallo para Flash. Adobe debería haber incluido alguna herramienta de generación de código automático para facilitar la vida a los diseñadores (y programadores), y no complicar tanto las cosas para ciertas funciones (como se puede leer en el artículo).

La conclusión: Si eres un diseñador que va a trabajar con AS3, y no quieres aprender a programar en serio, búscate un programador para hacer proyectos.

Comet! escribió:

Fede Rivas

unread,
Dec 31, 2008, 5:22:50 AM12/31/08
to asna...@googlegroups.com
Hombre, mal hecho no, pero es cierto que muchas comodidades se han
perdido. Yo pico ahora muchisimo mas codigo ahora con AS3 que antes
con AS2, esta claro que el lenguaje ha supuesto un avance brutal, pero
hay simples operaciones que ahora son ciertamente complicadas de
realizar, cuando no tendrían porque.

Estoy con Ivan, a ver a cuantos conoceis iniciandose en Flash por su
cuenta y riesgo, tal como hicimos muchos en su día.

Realmente, no se hasta que punto esto puede ser positivo o negativo.
Por una parte, esto nos deja a los que estamos mas puestos en picar
código en una posicion buena, ya que nuestro gremio es bastante
reducido y de hecho, puedes encontrar ofertas de programadores AS3
donde quieras, pero por otra parte, deja al público de flash mucho más
restringido a gente con conocimientos avanzados de programación, lo
cual para el avance de la aplicación es ciertamente peligroso.

Yo lo que veo es lo siguiente. Pongamos, una escala de 0 a 100 de
utilización Flash. Para un uso muy básico, lease animaciones sin más,
con interacción nula por parte del usuario, lease de 0 a 20 por decir,
el programa es sencillo, y adsequible para gran parte del público.

Ahora, si pasamos a un punto de 20 a 40, donde entra ya
interactividad, y uso de programacion, se pone la cosa bastante cuesta
arriba ( siempre hablando de AS3 ), aqui ya se produce una criba
importante. Es como el "salto al vacio" para aquellos que no saben
programacion.

Si el uso fuera de un 40 a un 80, digamos programacion avanzada, bases
de datos y tal, la aplicacion responde bien y tal, pero queda este
rango para programadores tal cual, y empieza a ser complicado meterse
hasta aqui.

Bien, si ya usas del 80 al 100, programando en plan friki aplicaciones
bastante tochas, Flash cojea bastante de muchos sitios, aparecen bugs,
empiezan terrenos farragosos de garbage collector, sandbox, y demas
movidas, y llegas a la conclusion de que quiza la aplicacion esta
verde aun en este rango.

En definitiva, creo que la aplicacion tiene un inicio "bueno" y una
zona intermedia "buena", pero cuenta con un salto importante para
aquellos que quieran una interactividad basica, y bastantes fallos
para aquellos que buscan exprimir mas alla del 80 el programa.

Adobe se tiene que poner las pilas, muy bonito lo del 3D, lo de los
"bones" y tal, muy potente el AS3, pero creo que deben pulirse muchas
cosas, y facilitar una curva de aprendizaje mas lineal para usuarios
que comienzan desde 0.

Iván

unread,
Dec 31, 2008, 5:33:51 AM12/31/08
to asna...@googlegroups.com
Así me cuesta a mi pasar de 80!! ;))
Muy buena explicación, no lo había visto así de clarito. Que tiempos
cuando íbamos a 20... con sus gotoAndPlay... ;D

xleon

unread,
Dec 31, 2008, 5:55:48 AM12/31/08
to asna...@googlegroups.com
Me sumo al asuntillo...

Yo añadiría que en la escala que se ha creado Fede, digamos que usaría flash solo del 0 al 60.
A partir de ahí usaría Flex directamente, te evita mogollón de problemas que con flash son una pesadilla. Aunque claro, también tiene sus pegas.
Si la app va a ser muy tocha creo que sería muy recomendable un framework, que para eso están. La mayoría de los problemas que nos encontramos ya se los encontraron otros antes.
Esta es mi ecuación:

Flex = (Flash - problemas + [peso añadido (kb)] ) / tamaño de aplicación

Fede Rivas

unread,
Dec 31, 2008, 6:05:46 AM12/31/08
to asna...@googlegroups.com
Bien, pero como dices, Flex tiene sus pegas, y su integracion con flash, al menos por lo que he ido viendo, no es para nada cómoda y mucho menos intuitiva.

Creo que son dos aplicaciones que deberian complementarse de una forma mucho mas fluida de como lo hacen ahora.

En cuanto al framework para aplicaciones tochas, o bien tiras de uno, o bien te haces el tuyo, pero si, es no solo recomendable, sino imprescindible.

xleon

unread,
Dec 31, 2008, 6:15:53 AM12/31/08
to asna...@googlegroups.com
Para eso espero que sirva el catalist, pero a parte de eso...
¿Qué problemas de integración le ves? Yo no he tenido grandes problemas al mezclarlos.

Fede Rivas

unread,
Dec 31, 2008, 6:41:16 AM12/31/08
to asna...@googlegroups.com
Parto de la base, que de Flex tengo conocimientos muy básicos, en su día me lo instalé, y lo volvi a desinstalar, no tenia tiempo en su dia para pelearme con mxml y ahora desgraciadamente sigo sin tenerlo.

De los problemas de integracion, segun los posts que han ido saliendo en la lista, me llama la atencion el que comentaba Javi Fernandez en su dia :

"Por otro lado y más a nivel estructural, por lo que he visto no puedo  
tener clases asociadas directamente a los assets que exporto en swc,  
sino que tengo que tener una clase que a su vez hace los addChild de  
estos swc, lo que no me gusta demasiado porque me parece otra forma de  
hacer lo mismo que se sale de lo estándar."

Segun entiendo, para diseñar una vista en flash, y llevartela a flex, debes crearte un swc, pero no puedes vincularle una clase ( cosa que hago constantemente ), sino que luego en Flex tienes que hacer un workaround para instanciar esa clase y vincularla a ese swc. 

En su dia, hablando todo esto con Javi, me comentaba que estaba bastante frustrado con la forma de usar contenido generado en flash dentro de Flex, y que cada paso era un "parto".

Si para cada vista, tengo que ir haciendo este tipo de historias, la verdad es que se me hace bastante cuesta arriba, luego si actualizas una, vuelve a compilar swc, vuelve a compilar con flex ... no se, repito, no tengo experiencia con ello, pero asi a bote pronto, no se me antoja comodo.

En la aplicacion en que trabajo actualmente, tengo tal cantidad de vistas, modelos y controladores, que andar con este tipo de historias de swc's me parece que se me iria de madre completamente la historia, haciendo que cada prueba de cambios en la aplicacion requieran varias compilaciones de aqui y allá, y que no se te olvide ninguna claro, que la lias, y sigo viendo lo que comentaba antes, que cuando llegas a un punto, te ves haciendo constantemente "workarounds" sin saber muy bien porque, dejandote la sensacion de que estas chapuceando, y a mi personalmente, esta sensacion no me gusta nada.

Por favor, corregidme si no es correcto, igual tengo un concepto equivocado de la historia.

Cay

unread,
Dec 31, 2008, 6:51:47 AM12/31/08
to asna...@googlegroups.com
Concuerdo en casi todo... y agregaria que incluso usando Flash de 0 a
20 te puedes encontrar con memory leaks tochos, y eso me parece un
fallo muy grande... yo le pediria a Adobe un "simple" dispose() a
todos los objetos nativos de flash, q se dedique él sólo a desuscribir
listeneres y demases...

2008/12/31 Iván <ivang...@yahoo.es>:

xleon

unread,
Dec 31, 2008, 7:38:42 AM12/31/08
to asna...@googlegroups.com
A ver, cierto es que con CS3 creas un símbolo vinculado en la librería y al publicar ya lo tienes disponible sin hacer nada más.
Con Flex Builder (tanto proyectos flex como ActionScript), necesitas un paso más, que es compilar el swc con flash, pero no me parece un paso tan dramático como comentáis.
Un símbolo vinculado creado en flash, es decir, un movieClip, no se puede instanciar directamente en un UIComponent de Flex. Pero existe una extensión para flash, que usa to kiski, que transforma cualquier MovieClip en un UIMovieclip (mx.flash.UIMovieClip), el cuál SÍ se puede instanciar directamente en cualquier parte de Flex. De manera que tendrías toda tu librería disponible sin hacer piruetas.

Aun así, y sin necesidad de este paso, tambien se puede instanciar cualquier simbolo vinculado en la librería en un componente de flex mediante su propiedad rawChildren:
componente.rawChildren.addChild(new SimboloLibreria()). // siendo SimboloLibreria un MovieClip de toda la vida, o un Sprite, etc

Y como ventaja al desarrollo con Flash:
Si mi símbolo (en el swc claro) se llama "Pepito", si escribo "pe" + control + enter, el entorno reconoce todos símbolos y te salta la ayuda de código, por lo que no tengo que irme a la libreria a buscar mis símbolos constantemente.

Todo al final es una cuestión personal, y cada uno debe decidir, pero yo antes de enfrentarme a un proyecto de verdad con flex, pensaba lo mismo que tú, y ahora me doy cuenta de Flex es lo mismo que flash, pero con un repertorio de componentes que ayudan muchísimo.
Ten en cuenta que para skinear un componente de flex, puedes usar tanto imágenes (normalmente pngs) como símbolos que tengas dentro de un swf. Y lo mejor de esto es que lo haces desde un archivo css.

Felisa me muerrrooooo

Fede Rivas

unread,
Dec 31, 2008, 7:51:03 AM12/31/08
to asna...@googlegroups.com
Jejee, buenas de nuevo.

Bueno yo no solo me referia a instanciación física, sino sobre todo a lo que comentaba Javi, el no poder vincular las clases y que sean reconocidas, sino que tienes que tener otra clase intermedia que haga los addchild y atacharles la clase.

Cuanto tenga algo de tiempo, me pelaré con él a ver si me entero de la historia, y valoraré todo, pero en definitiva, me reitero, creo que la integracion no es todo lo sencilla que debería ser, al menos asi a bote pronto.

Salu2!

Fede.

xleon

unread,
Jan 1, 2009, 12:29:29 PM1/1/09
to asna...@googlegroups.com
pues a eso me referia. si has leido lo que puse, las clases de la libreria se reconocen sin otra clase intermedia

Fede Rivas

unread,
Jan 1, 2009, 4:31:05 PM1/1/09
to asna...@googlegroups.com
Perdona, no lo habia entendido bien.

Como digo, cuando tenga tiempo me tengo q mirar bien todo, para colmo Flash me tiene contento ultimamente, y el IDE del CS4 es un infierno, me va lentiiisimo hasta el punto, que tenido q volver de nuevo al CS3.

Feliz año listeros !!!
Reply all
Reply to author
Forward
0 new messages