Pseudocódigo en Flash con XML
Hola chicos, supongo que el tema del xml está bastante trillado pero la pregunta que tengo es más de pseudocódigo o como hacer las cosas más que de código puro.
Por ejemplo un portfolio con varios menus, submenus y proyectos.
Yo lo tengo todo en un xml. ¿Alguien lo parte en varios xml's?
A la hora de implementar el código en flash, Yo lo he intentado hacer con funciones y cargar solo una parte del xml (p.ej, el menu principal) pero cuando tiro a cargar el submenu (otro objeto xml) el primer xml me desaparece. Y si cargara otro nuevo objeto xml supongo que desapareceria el submenu.
Entonces llego a la conclusión (porque no se mucho de AS y XML) que hay que cargarlo todo al prinicipio y hacer visibles los mc que quiera e invisibles los que no quiera que se vean.
Pero supongo que estaría mal porque tardaría un monton en cargar todo el xml ¿no?
¡Tengo la picha hecha un lio!
Alguien que haga esto normalmente que opine porfa please!
Gracias de antemano!
script
Gracias chicos, le he estado dando estos días al xml y ya he corregido el error de ralentización. es flipante, el error estaba en la sintaxis. ¿Como puede ser?
Tenía una función llamada así:
works = function(){
}
Pues nada, fue cambiarlo a así:
function works() {
}
Y dejó de pillarme el puñetero.
eto e increible (bisbal)xDDDD.
elsuricatorojo
El mensaje que dice que hay un script que puede ralentizar el flash sale cuando flash *cree* que se ha metido en bucle infinito del que no puede salir. Remarco *cree* porque no lo hace a ciencia cierta sino que solo lo supone porque se ha metido en una función o estructura lógica (un for por ejemplo) y pasado un <em>tiempo</em> no ha salido.
Por lo tanto al basarse en tiempo en un ordenador mas potente lo mismo no sale el mensaje porque se cepilla el for en menos tiempo (ya se no es consuelo pero es un sintoma).
En cuanto a las soluciones:
1) Trocear el xml en varios mas pequeños. Yo solo tiraría por aquí si por ejemplo tienes en un mismo xml, digamos "servicios" y "productos" de tal forma que se puede pasar de forma natural a 2 xmls. Si tienes un xml solo de productos creo que si lo cortas es peor.
2) Limitar el número de iteraciones del for. Si tienes 2000 productos parsearlo en fors de 100 ciclos, que saldrían unos 20 (yo dejaría incluso un frame libre entre for y for). La idea es que respire y por mucho que crezca el xml nunca salga el mensaje ese.
Gracias Athomix, pero el suricato lo que es es precavido, de las cornadas que me ha dado la "bicha" esta del flash :-).
athomix
Script
Por cierto, estas funciones al ejecutar, me sale que un script ralentiza el flash.
¿A que puede ser debido? Que yo sepa los "for" acaban bien, y todo esta correcto...¿no?
Eso es que entras en un bucle del cual muy posiblemente no puedas salir. (ahora no recuerdo el límite de iteraciones del compliador) pero son suficientes para que tenga razón.
elSuricatoRojo es sabio. ;) apoyo la moción.
elsuricatorojo
Programar con funciones es mejor que programar sin funciones desde luego :-) Mirando por encima el código yo intentaría avanzar en el tema de la encapsulación.
Falla bastante a este nivel. Las funciones no están encapsuladas. menu3D y menuworksXml no están declaradas como variables locales de la función (hay por ahí una variable "Nombre" que tampoco es local) y se quedarán por ahí. Pero sobre todo utilizas mucho "_root".
En AS2 no está muy bien visto utilizar _root (En AS3 es otra historia al parecer). El problema, al margen de que por definición rompe la encapsulación, es que el ámbito de root es distinto en función de en que nivel lo ejecutes. Antes que root utiliza "_level0" pero si puedes no trabajes con rutas/referencias "absolutas".
Por otro lado intentaría que hacer funciones mas genéricas... si vas a cargar 2 xml yo haría una función que se encargase de eso y tener parametrizado el path del xml y la función a asociar al callback onLoad. Y por otra parte tendría funciones para pintar la capa de representación (la parte de los attachs).
script
Ostris!que buena suricato, jajjaj, mira que no caer en eso. Dios, estoy en la parra.
En cuanto tenga 5 minutos lo pruebo.
Aun así, lo que más me importa, fuera errores de sintaxis, es si el pseudocódigo, o sea se, las maneras de programar, ¿son buenas formas, o a ti se te ocurriria otra manera para incrustar xml?
A mi me enseñaron a programar con funciones y creo que es un buen método estructurado y limpio pero a lo mejor para introducir otros lenguajes no es el mejor método.
Por cierto, estas funciones al ejecutar, me sale que un script ralentiza el flash.
¿A que puede ser debido? Que yo sepa los "for" acaban bien, y todo esta correcto...¿no?
elsuricatorojo
Bueno así a bote pronto:
Efectivamente tienes 2 instancias de XML distintas (menu3D y menuworksXml) las cuales no se pisan. Lo que se pisa es que cuando cargas el XML estás haciendo "attachs" sobre el root de instancias con el mismo nombre. Es decir que en la primera función crear instancias de MovieClip:
_root["item_mc"+z]
...y en la segunda función crea insyancias de MovieClip asi:
_root["item_mc"+i]
Teniendo en cuenta que "z" e "i" son valores de 0 a un número, las 2 funciones se pisan entre si ya que que la primera iteracción del for en ambas funciones se crea la instancia de MovieClip:
"_root.item_mc0"
Soluciones. Así, sin perspectiva del proyecto, yo cambiaría en la primera función:
_root["item_mc"+z]
por:
_root["itemMenu_mc"+z]
A ver que tal...
script
Perdona, esque el código del load lo tengo como tu pero lo había escrito a lo rapido.
Al final siempre acabamos con el código,xDDD
Este es mi código, son dos funciones, works carga el menuprincipal.
wtresde se encarga de cargar el submenu de 3d. Esta un copy-paste de works modificado por eso no se si se debería hacer con el mismo método o emplear otra forma de cargar el submenu.
<code>wtresde = function(){
menu3D = new XML();
menu3D.ignoreWhite = true;
menu3D.onLoad = function() {
var menuItem = menu3D.firstChild.firstChild.nextSibling.childNodes;
for (var z = 0; z<menuItem.length; z++) {
Nombre = menuItem[z].firstChild.attributes.labela;
attachMovie("item_mc","item_mc"+z,3);
_root["item_mc"+z]._y = 410;
_root["item_mc"+z]._x = i*90;
_root["item_mc"+z].f2btn_mc._visible = false;
_root["item_mc"+z].textobtn_mc.etiqueta_txt.autoSize = "center";
_root["item_mc"+z].textobtn_mc.etiqueta_txt.text = Nombre;
_root["item_mc"+z].puntobtn_mc._x=_root["item_mc"+i].fbtn_mc._x - 35;
_root["item_mc"+z].f2btn_mc._width = _root["item_mc"+i].textobtn_mc._width + 10;
_root["item_mc"+z].fbtn_mc._width = _root["item_mc"+i].textobtn_mc._width + 10;
_root["item_mc"+z].onRollOver = function (){
this.f2btn_mc._visible = true;
}
_root["item_mc"+z].onRollOut = function (){
this.f2btn_mc._visible = false;
}
}
}
menu3D.load("menuworks2.xml");
}
works = function () {
menuworksXml = new XML();
menuworksXml.ignoreWhite = true;
menuworksXml.onLoad = function() {
var menuItem = menuworksXml.firstChild.firstChild.childNodes;
for (var i = 0; i<menuItem.length; i++) {
Nombre = menuItem[i].attributes.labela;
attachMovie("item_mc","item_mc"+i,2);
_root["item_mc"+i]._y = 610;
_root["item_mc"+i]._x = i*90;
_root["item_mc"+i].f2btn_mc._visible = false;
_root["item_mc"+i].textobtn_mc.etiqueta_txt.autoSize = "center";
_root["item_mc"+i].textobtn_mc.etiqueta_txt.text = Nombre;
_root["item_mc"+i].puntobtn_mc._x=_root["item_mc"+i].fbtn_mc._x - 35;
_root["item_mc"+i].f2btn_mc._width = _root["item_mc"+i].textobtn_mc._width + 10;
_root["item_mc"+i].fbtn_mc._width = _root["item_mc"+i].textobtn_mc._width + 10;
_root["item_mc"+i].onRollOver = function (){
this.f2btn_mc._visible = true;
}
_root["item_mc"+i].onRollOut = function (){
this.f2btn_mc._visible = false;
}
_root["item_mc"+i].onRelease = function (){
if (this.textobtn_mc.etiqueta_txt.text == "TRESDE") {
wtresde();
}else if (this.textobtn_mc.etiqueta_txt.text == "PRINT") {
wprint();;
}else if (this.textobtn_mc.etiqueta_txt.text == "ONLINE") {
wonline();
}else if (this.textobtn_mc.etiqueta_txt.text == "OFFLINE") {
woffline();
}
}
}
}
menuworksXml.load("menuworks2.xml");
}; </code>
elsuricatorojo
La idea es tener 3 instancias de la clase XML, y que cada una cargue un xml distinto. En el código que pones veo que estás utilizando mal el método "XML.load()"... lo estás igualando a "manuworks.xml". Tu código debería parecerse mas a:
<code>
var miXML1:XML = new XML()
miXML1.load("xml1.xml")
var miXML2:XML = new XML()
miXML2.load("xml2.xml")
var miXML3:XML = new XML()
miXML3.load("xml3.xml")
</code>
Siendo "xml1.xml", "xml2.xml", etc los path a los ficheros xml.
Si lo que quieres es que aun teniendo 1 xml tener 3 instancias que tiren de ese xml aunque luego cada una se encarge de una parte del xml... no tiene mucho sentido tener 3 instancias de XML que tiren del mismo archivo xml. Si aun así quieres tenerlo así tu código debría ser parecido a:
<code>
var miXML1:XML = new XML()
miXML1.load("xmlUnico.xml")
var miXML2:XML = new XML()
miXML2.load("xmlUnico.xml")
var miXML3:XML = new XML()
miXML3.load("xmlUnico.xml")
</code>
De esta forma no se pisan... aunque la verdad no se si te he entendido bien.
script
Vale, eso lo tenia en cuenta pero se siguen pisando.
¿Puede deberse a que al tener un solo xml y hacerle el:
<code>xml1.load=menuworks.xml
xml2.load=menuworks.xml
xml3.load=menuworks.xml</code>
se pisen por tener solo un xml?
elsuricatorojo
Por ejemplo:
<code>
var miXML1:XML = new XML()
var miXML2:XML = new XML()
var miXML3:XML = new XML()
</code>
..así no deberían pisarse.
script
ok!perfecto, nosotros tambien estamos con AS2 y el xml es un poco engorroso.
En cuanto al orden de cargar los xml, tengo el problema de que cuando creo un new:XML. Si luego le digo crear otro Xml y lo cargo, este se come al anterior.
Es como cuando cargas dos mc y no has cambiado los niveles, uno se come al otro y sucesivamente.
¿Que hay que hacer para cargar varios xml sin que se coma al anterior?
elsuricatorojo
Si tienes que cargar 3 xmls no los cargues a la vez, sigue un proceso mas o menos así:
1) Mando cargar xml1.
2) Recibo callback de que se ha cargado y lo proceso.
3) Mando cargar xml2.
4) Recibo callback de que se ha cargado y lo proceso.
5) Mando cargar xml3.
6) Recibo callback de que se ha cargado y lo proceso.
Es mas, posiblemente el xml3 a cargar dependa de los datos de xml1 o xml2 por lo que no vas a poder cargarlo antes de tener esos datos.
En cuanto a si reunir todo en 1 xml o trocearlo. En principio divide la información de forma "natural", por ejemplo un xml para el menu, un xml para relación de imágenes, un xml para relación de videos, un xml para textos comunes, etc Solo si ves que un xml se va mucho de peso (>500kb o >1mb) planteate trocearlo para evitar problemas de rendimiento.. pero 500kb es muuucha información y por lo general es dificil llegar a ese peso.
Por otra parte nosotros al cargar un xml lo "interpretamos" y pasamos los datos a un modelo de datos basado en objetos y arrays y me olvido del xml. Esto en AS2 que siempre es un engorro navegar por el xml (a no ser que utilices XPath o algo similar).
En AS3, las clases asociadas a los xml son mas ricas y te permiten hacer busquedas o selecciones que lo mismo hacen que aquí nos replanteemos pasarlo todo a bjetos y arrays y, en cambio, utilizar el xml como contenedor de datos con el que trabajar.
script
Gracias por contestar, algo si que has aclarado excepto la ultima parte con el DOM y to eso, aun no he llegado en el manual, xDDD.
Pero que tienes que decir en cuanto a cargar en flash el xml?¿Todo antes? Mediante diferentes objetos de xml?¿Como se hace para cargar varios XML sin que se coma uno al otros?
Eso me interesa casi más que la estructura del xml que más o menos la tengo hecha aunque tu argumentación sobre seperarlo es buena.
Un saludo!
isma
Siempre es mucho mejor tenerlo todo separadito, así te evitas el tener que parsear un archivo excesivamente 'grande' y recorrer marcas y marcas.
Yo por ejemplo, lo que siempre hago, en los menús dinámicos, es hacer referencia mediante un atributo, al XML de contenido; así te es mucho más fácil desarrollar, ya que tienes los conceptos bien separados.
Viene tb muy bien para cuando quieres realizar posicionamiento en otra capa mediante el DOM XML o SimpleXML en PHP.
Espero haber aclarado algo, es tan solo una opinión.