Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Ohrlando

[Resolvido] add item na Array dentro de um MovieClip

Recommended Posts

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

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

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

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

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

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

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.