Ohrlando 0 Denunciar post Postado Setembro 27, 2010 olá! estou criando um menu dinâmico, com submenus. Os parâmetros vão ser passados tudo por xml, mas por enquanto estou criando matrizes para fazer isso. Estou fazendo assim, criei um MovieClip chamado Botao, e exportei para o ActionScrip. Dentro dele tem uma array chamado subMenus. no stage tem uma Array chamada botoes que são os botões. tem um for que lê a array pra saber quantos botões serão criados, está assim: for (i = 0; i <= numBtns; i++){ botoes.push(new Botao()); //botoes[i] = new Botao(); this.addChild(botoes[i]); botoes[i].x = posX; posX += 120; botoes[i].txtTitle.text = botoes[i].texto = "Teste de menu " + (i+1); botoes[i].id = i; botoes[i].link = links[i]; botoes[i].frame = "_self"; botoes[i].subMenu = boolSubMenus[i]; if (botoes[i].subMenu) constructSubMenu(botoes[i], i); } reparem que tem uma função constrói subMenu. Quando subMenu é verdade, então ele constrói um subMenu, por enquanto o pârametro i não tem função, mas vai servir pra saber quantos subMenus vão ser. aqui está a função constructSubMenu function constructSubMenu(botao:MovieClip, id:int){ var posY:int = 25; botao.subMenus.push(new Botao); //erro aqui trace("ID.:",botao.id); trace("Array:",botao.subMenus); botao.addChild(botao.subMenus[i]); botao.subMenus[i].y = posY; posY += 25; } o problema na linha 'botao.subMenu.push', eu não consigo add um item na matriz que tá dentro de um MC. a referência tá certa, tanto que se eu comentar a 'botao.subMenu.push' e as 2 últimas 'addChild' e a do 'y' ele exibe normalmente. Mas lógico que exibe null porque não added nada. como posso resolver isso? Compartilhar este post Link para o post Compartilhar em outros sites
Thiago de Oliveira Cruz 21 Denunciar post Postado Setembro 28, 2010 Ta errado lá desde o começo Isso aqui não existe: botoes.push(new Botao()); http://www.adobe.com/support/flash/action_scripts/actionscript_dictionary/actionscript_dictionary064.html new Botão teria que retornar uma array de botões para que isso funcione... e mesmo assim taria errado a aplicação disso. Pois como você pode ler push serve apenas e somente para Arrays até onde eu sei... não da para fazer um push de objects. Então não sei o que você ta tentando fazer... dando um push em new Botao() E se você reparar tbm caso esteja funcionando a primeira parte... no primeiro você faz new Botao() e no segundo apenas new Botao <--- cadé o ()??? Abraços Compartilhar este post Link para o post Compartilhar em outros sites
Ohrlando 0 Denunciar post Postado Setembro 28, 2010 E aí beleza? eu devia ter postado a declaração das variáveis. Botões é uma Array que representa todos os botões. essa parte funciona normalmente, o que não tô conseguindo é fazer um push numa array que tá declarada dentro de um mc. e eu só posso dar push fora do mc (dentro do MC o push funciona, mas nãotem jeito tem que ser fora), e aí eu usei a referência certinho mas não consigo fazer esse push. dá: TypeError: Error #1009: Cannot access a property or method of a null object reference. at Botao/constructSubMenu() at menu_dinamico_fla::MainTimeline/frame1() vou postar aqui a declaração das vars este está no stage var i:int = 0; var numBtns:int = 6; var botoes:Array = new Array (); //aqui está aqueles botões que disse (; var links:Array = new Array(['link1'],['link2'],['link3'],['link4'],['link5'],['link6'],['link7']); var subMenus:Array = new Array ([0], [1], [0], [1], [0], [0], [0]); var boolSubMenus:Array = new Array(); //subMenus var subMenus_lvl2:Array = new Array([0], [0]); var numSubMenu:Array = new Array([], [3], [], [1], [], [], []); este está no mcBotao: //subMenu var subMenus:Array = new Array(); //ele vai representar todos os subMenus do botão será que é melhor postar o código completinho? ele não é tão grande Compartilhar este post Link para o post Compartilhar em outros sites
Thiago de Oliveira Cruz 21 Denunciar post Postado Setembro 28, 2010 Então é como eu disse não tem nenhum NEW ali não... tu ta inventando moda Em vez de fazer o simples Assim que se usa push: var letters:Array = new Array(); letters.push("a"); letters.push("b"); letters.push("c"); trace(letters.toString()); // a,b,c Outro exemplo: var letters:Array = new Array("a"); var count:uint = letters.push("b", "c"); trace(letters); // a,b,c trace(count); // 3 Ou seja push apenas vai pushar um valor para dentro de uma variavel e se ela n for uma array vai virar uma em AS 2 E em AS 3 você vai ter que declarar que é uma array... E colocar o conteúdo desejado dentro dela. Então explica ai o que você quer fazer porque no momento você ta tentando puxar uma array para dentro de outra array... Ta querendo criar uma array bi dimencional??? Abraços Compartilhar este post Link para o post Compartilhar em outros sites
Ohrlando 0 Denunciar post Postado Setembro 28, 2010 assim... vão ter os botoes dos menus dinamicamente. Então eu crio uma array que vai representar os botoes, já que não sei a quantidade, eu crio uma array. essa array "botoes" que vai representar todos os botões. Quando precisar criar um botao simplesmente usar o botoes.push( new Botao() ); sendo que 'Botao' é minha classe do botão. esse 'botoes.push' funciona perfeitamente, assim que coloco 'addChild' ele aparece na tela perfeito. O problema é que, as vezes um botão pode conter subMenu. Então tem uma classe SubMenu que criei que vai ser added dentro das ocorrências de 'Botao' que conter subMenu. Não consigo dar um push na array que representa os subMenu a qual está declarada dentro da própria ocorrência de 'Botao'. Dentro de cada 'Botao' tem uma array lá declarada que serve pra representar possíveis submenus, se tiver, dou um 'push' e ponho no próprio botão ('botoes.addChild'), o problema que eu não consigo dar esse push, cujo código está no stage, na Array que está dentro do 'botoes'. D': aqui está a array dentro da classe Botao //subMenu var subMenus:Array = new Array(); o problema é no bendito push, se o push fosse interno na classe, não teria problema... mas não tem como ser, tem que ser lá no stage =( se você tiver uma outra forma mais simples de fazer um menu dinâmico pf me mostra *-* eu tô perdido, não sei como continuar. eu vou postar o código todo, acho que vai ser melhor qualquer coisa frame1 Action - STAGE var i:int = 0; //contador var numBtns:int = 6;//número de botões var botoes:Array = new Array ();//array representa os botões //isso vai ser substituido por xml depois var links:Array = new Array(['link1'],['link2'],['link3'],['link4'],['link5'],['link6'],['link7']); //links var submenu:Array = new Array ([0], [1], [0], [1], [0], [0], [0]); //possue subMenu? var boolSubMenus:Array = new Array();//igual a submenu mas com valore true ou false var numSubMenu:Array = new Array([], [3], [], [1], [], [], []);//quantos sub menus vão ser add no botao //no caso 3 subMenus no 2º botão e 1 no 4º for (i = 0; i < numBtns; i++){//transforma em valores booleans if (submenu[i] == 1) boolSubMenus.push(true); else boolSubMenus.push(false); //trace(boolSubMenus[i]); } var posX:int = 0;//posições dos botões for (i = 0; i <= numBtns; i++){//criar botões botoes.push(i); botoes[i] = new Botao(); this.addChild(botoes[i]); botoes[i].x = posX; posX += 120; botoes[i].txtTitle.text = botoes[i].texto = "Teste de menu " + (i+1); //título botoes[i].id = i; //identificação botoes[i].link = links[i]; //link de cada botão botoes[i].frame = "_self"; //frame do link de cafa botão botoes[i].subMenu = boolSubMenus[i];//se possui ou não subMenu if (botoes[i].subMenu){ //se ele possui subMenu if (numSubMenu[i] != null) constructSubMenu(botoes[i], numSubMenu[i]); //constroi subMenu } }//for //construtor do subMenu function constructSubMenu(botao:MovieClip, numSubMenu:int = 0){ var posY:int = 25; for (var i:int = 0; i < numSubMenu; i++){ botoes[i].subMenus.push(i); //cria nova slot na array botoes[i].subMenus[i] = new SubMenu();//transforma o slot em ocorrência de SubMenu botoes[i].addChild(botoes[i].subMenu[i]);//add o subMenu na tela dentro do botao botoes[i].y = posY; posY += 25; }//for } Botao txtTitle.mouseEnabled = false;//título var id:int; //código do botão var texto:String; //título var subMenu:Boolean;//tem submenu? var link:String; //link do botão var frame:String; //frame do link (blank, self...) //subMenu var subMenus:Array = new Array(); //array que representa os possíveis subMenus this.buttonMode = true; button.addEventListener(MouseEvent.CLICK, gotoLink); function gotoLink(e:MouseEvent):void{ /*if ((link != null) || (link != "")) navigateToURL(new URLRequest(link), frame);*/ trace(id, texto, "\n", subMenu, "\n", link); } button.addEventListener(MouseEvent.MOUSE_OVER, overHandler); function overHandler(e:MouseEvent):void{ //var alvo:MovieClip = new MovieClip(e.target); //if (subMenu) //showSubMenu(alvo); button.gotoAndStop(2); } button.addEventListener(MouseEvent.MOUSE_OUT, outHandler); function outHandler(e:MouseEvent):void{ //hideMenu(e.currentTarget); button.gotoAndStop(1); } function showSubMenu(e:MovieClip){ //exibe menu do alvo } function hideSubMenu(){ //hide menu } e o SubMenu é idêntico ao Botao, mas foi criado porque não pode add um 'Botao' dentro do próprio 'Botao'. abraço! Compartilhar este post Link para o post Compartilhar em outros sites
Thiago de Oliveira Cruz 21 Denunciar post Postado Setembro 28, 2010 ODEIO MAC e seu command <- que da voltar na m***** do navegador.....1!!!! Bom .... Você sempre pode criar um MC chamado myButton E colocar a classe dele como myButton e no AS fazer var mc:myButton = new myButton(); var t:TextField = new TextField(); //t.embedFonts = true; t.antiAliasType = "advanced"; t.text = "TEST"; var tf:TextFormat = new TextFormat(); tf.color = 0xFFFFFF; tf.size = 12; tf.font = "Arial"; t.setTextFormat(tf); mc.addChild(t); addChild(mc); mc.x = 50; mc.y = 50; Dai por diante tu pode ter uma ideia do que fazer Abraços Compartilhar este post Link para o post Compartilhar em outros sites
Ohrlando 0 Denunciar post Postado Setembro 29, 2010 Oi beleza? ué MAC? AHsuhsuashu então mano, assim, eu criei um botão e um subbotão no flash, ele não é um 'as', é um desenho lá que foi exportado pro action script, dei linkage tudo certinho... o menu tem que ser dinâmico, não sei exatamente quantos botões vai ter, pode ter 1 como 10. POr isso a necessidade de criar um array, que aí enquanto for tendo mais vou dando push, e do new Botao pra cada slot criado... isso funciona e eu já consegui fazer isso sem problema (mas só pros botões). A m**** que tá acontecendo é que além de ter botão pode ter botão que tenha submenu. A minha idéia é que quando tiver submenu eu add um 'SubMenu' ao Botao, com addChild. Por isso, cada botão tem uma array que vai representar todos os submenus added. o que tá cagando que quando tento fazer botoes.subMenus.push (new SubMenu) ou seja dar um push na array subMenus que está dentro do botão, ele não vai! não funciona dá aquele erro citado acima. Como posso fazer isso??? D: Ou se você tiver uma outra lógica que possa ser melhor e que atenda o que quero eu ficaria gratissíssimo, porque isso tá me fu***** =( mas desde que seja tudo dinâmico. Abraços mano! Compartilhar este post Link para o post Compartilhar em outros sites
Thiago de Oliveira Cruz 21 Denunciar post Postado Setembro 29, 2010 Então esquece essa desgraça de botoes ... a não ser que você faça assim: var botoes:Array = new Array(); for(var i = 0; i < 5; i++){ var mc:Botao = new Botao(); var t:TextField = new TextField(); //t.embedFonts = true; t.antiAliasType = "advanced"; t.text = "TEST"; t.x = -15; t.y = -10; var tf:TextFormat = new TextFormat(); tf.color = 0xFFFFFF; tf.size = 12; tf.font = "Arial"; t.setTextFormat(tf); mc.addChild(t); addChild(mc); mc.x = 50; mc.y = 40 * (i + 1); botoes.push(mc); } trace(botoes); Veja que agora você tem uma array que contem objects dentro dela... Ai sim você pode fazer var sm:SubMenu = new SubMenu(); botoes[0].addChild(sm); Que ai você vai ta adicionando ao primeiro movieclip um novo botão!!! E assim vai... Lembrando que tanto o SubMenu como Botao, são MovieClips que eu coloquei na minha biblioteca e coloquei a classe com esses nomes o antigo indentificador para fazer attachMovie Abraços Compartilhar este post Link para o post Compartilhar em outros sites
Irineu Antunes 2 Denunciar post Postado Setembro 29, 2010 As actions do botao estão no primeiro frame? Além disso: botoes.subMenu = boolSubMenus; botao.subMenus.push(new Botao()); //erro aqui Estas propriedades estão corretas? Compartilhar este post Link para o post Compartilhar em outros sites
Ohrlando 0 Denunciar post Postado Setembro 29, 2010 sim sim estão certas, subMenu é true ou false, pra saber se tem submenu ou não... e boolSubMenu é a matriz que representa os botões que vão ou não ter submenu... ou mano... eu tentei adaptar meu código... consegui fazer o push, eu fiz assim ao invés da array estar dentro da Classe Botao, ela está no stage.. aí dei o addChild dentro do botoes, isso funcionou certinho, aí só tive mudar que ao invés de fazer todos o código dos MouseEvent do SubMenu dentro do Botao, eu faço dentro do SubMenu mesmo usando MovieClip(this.parent).addEventListener() agora funcionou! só subistituir as matrizes pelo xml que tô montando! =D acredita que tava 2 dias empacado com isso, e não tinha pensado dessa outra forma D: agora fiquei indignado que não dá push de uma array dentro de um mc =P valeu muito mano! abração! Compartilhar este post Link para o post Compartilhar em outros sites
Thiago de Oliveira Cruz 21 Denunciar post Postado Setembro 29, 2010 Por nada A gente vai criando ideias :) Eu já passei por muito problema igual a esse ai rs... O problema do MAC é que aqui no meu trampo só uso MAC e como tenho mania de windows com alguns comandos... vira e mexe eu faço o browser volta pra pagina anterior... entre outras coisas... Abraços Compartilhar este post Link para o post Compartilhar em outros sites