Ir para conteúdo

Arquivado

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

d3rson

Duplicando movieclip com XML e cada um de um tamanho

Recommended Posts

Pssoal...

 

tenho o seguinte script:

 

var dados:XML = new XML();
dados.ignoreWhite = true;
dados.load("xml/15anos.xml");// + _root.xmlport

dados.onLoad = function():Void  {
qtd = this.childNodes[0].childNodes.length;
_root.qualqtd = this.childNodes[0].childNodes.length;

for (j = 0; j <= qtd; j++) {
	mcPanels.item_mc.duplicateMovieClip("item_mc" + j,mcPanels.getNextHighestDepth());

	mcPanels["item_mc" + j].imagem = this.childNodes[0].childNodes[j].childNodes[0].attributes.imagem;
	mcPanels["item_mc" + j].tamanho = this.childNodes[0].childNodes[j].childNodes[1].attributes.tamanhofoto;

	mcPanels["item_mc" + j].foto.loadMovie(mcPanels["item_mc" + j].imagem);

	mcPanels["item_mc" + j]._x = j * mcPanels["item_mc" + j].tamanho;

	mcPanels["item_mc" + j]._y = 0;

}//FIM FOR
};//FIM DADOS LOAD

 

o que acontece é que cada imagem que vou carregar do XML é de uma largura diferente, e gostaria de posicioná-las exatamente uma ao lado da outra...

 

Se todas as imagens forem do mesmo tamanho, o codigo acima funciona perfeito, mas com fotos de tamanhos diferentes já da problema...

 

alguma dica ai???

 

XML:

<menu>
<item>
	<fotoevento imagem='portfolio/15anos/15anos_01.jpg'/>
	<foto tamanhofoto='738'/>
</item>
<item>
	<fotoevento imagem='portfolio/15anos/15anos_02.jpg'/>
	<foto tamanhofoto='738'/>
</item>
<item>
	<fotoevento imagem='portfolio/15anos/15anos_03.jpg'/>
	<foto tamanhofoto='738'/>
</item>
<item>
	<fotoevento imagem='portfolio/15anos/15anos_04.jpg'/>
	<foto tamanhofoto='738'/>
</item>
<item>
	<fotoevento imagem='portfolio/15anos/15anos_05.jpg'/>
	<foto tamanhofoto='472'/>
</item>
<item>
	<fotoevento imagem='portfolio/15anos/15anos_06.jpg'/>
	<foto tamanhofoto='738'/>
</item>
</menu>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem.. como não obtive resposta no problema acima.. será que poderiam apenas me esclarecer o que se passa abaixo:

 

var dados:XML = new XML();
var imageList:Array = [];


dados.ignoreWhite = true;
dados.load("xml/15anos.xml");

dados.onLoad = function():Void  {
qtd = this.childNodes[0].childNodes.length;
_root.qualqtd = this.childNodes[0].childNodes.length;

var totalWidth:Number = 0;

for (j = 0; j <= qtd; j++) {
	mcPanels.item_mc.duplicateMovieClip("item_mc" + j,mcPanels.getNextHighestDepth());

	mcPanels["item_mc" + j].imagem = this.childNodes[0].childNodes[j].childNodes[0].attributes.imagem;
	mcPanels["item_mc" + j].tamanho = this.childNodes[0].childNodes[j].childNodes[1].attributes.tamanhofoto;

	mcPanels["item_mc" + j].foto.loadMovie(mcPanels["item_mc" + j].imagem);

	mcPanels["item_mc" + j]._x = totalWidth;
	mcPanels["item_mc" + j]._y = 0;

	imageList.push(mcPanels["item_mc" + j]);

	totalWidth = totalWidth + mcPanels["item_mc" + j].tamanho;
	trace(totalWidth)

}//FIM FOR
};//FIM DADOS LOAD

 

agora vem o resultado do trace acima, se repararem não está somando.. está colocando um numero na frente do outro.. o porque disso???

 

 0100
 010050
 010050100
 010050100undefined

 

o meu XML está assim:

 

<menu>
<item>
	<fotoevento imagem='portfolio/15anos/Untitled-1.jpg'/>
	<foto tamanhofoto='100'/>
</item>
<item>
	<fotoevento imagem='portfolio/15anos/Untitled-2.jpg'/>
	<foto tamanhofoto='50'/>
</item>
<item>
	<fotoevento imagem='portfolio/15anos/Untitled-3.jpg'/>
	<foto tamanhofoto='100'/>
</item>	
</menu>

 

onde "tamanhofoto" é a largura de cada imagem.

 

resolvido!!!

 

o problema estava na linha que chamo o tamanhodaimagem do XML

 

errado:

 mcPanels["item_mc" + j].tamanho = this.childNodes[0].childNodes[j].childNodes[1].attributes.tamanhofoto;

 

correto:

 mcPanels["item_mc" + j].tamanho = Number (this.childNodes[0].childNodes[j].childNodes[1].attributes.tamanhofoto);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não tinha visto ainda o seu post, mas seu raciocínio está certo, se você está indicando a largura dele pelo xml, é só você ir somando como fez.

O seu código não está funcionando porque tudo o que se puxa de xml vem como string, então você precisa transformar essa string em number para que ele interprete corretamente e faça o cálculo, um parseInt ja resolve seu problema, tente assim:

 

dados.onLoad = function():Void  {
       qtd = this.childNodes[0].childNodes.length;
       _root.qualqtd = this.childNodes[0].childNodes.length;

       var totalWidth:Number = 0;

       for (j = 0; j < qtd; j++) { // tirei o menor ou igual, pois com o igual ele daria o ultimo valor como undefined
               mcPanels.item_mc.duplicateMovieClip("item_mc" + j,mcPanels.getNextHighestDepth());

               mcPanels["item_mc" + j].imagem = this.childNodes[0].childNodes[j].childNodes[0].attributes.imagem;
               mcPanels["item_mc" + j].tamanho = parseInt(this.childNodes[0].childNodes[j].childNodes[1].attributes.tamanhofoto);

               mcPanels["item_mc" + j].foto.loadMovie(mcPanels["item_mc" + j].imagem);

               mcPanels["item_mc" + j]._x = totalWidth;
               mcPanels["item_mc" + j]._y = 0;

               imageList.push(mcPanels["item_mc" + j]);

               totalWidth = totalWidth + mcPanels["item_mc" + j].tamanho;
               trace(totalWidth)

       }//FIM FOR
};//FIM DADOS LOAD

Compartilhar este post


Link para o post
Compartilhar em outros sites

hhe pois é... eu vi esse erro agora pouco... mas como eu nunca tinha feito somas com XML eu nem sabia dessa opção de transformar direto quando importo do XML.. btw... vlew ai...

 

esse "parseInt" ele transforma em inteiro? .. ou nada disso? seria a mesma coisa que colocar "Number"?

 

 

Imaginando que eu não tenho o tamanho da imagem no XML, como ficaria???....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem várias maneiras de resolver, você pode criar uma variável "carregados" com valor zero, e fazer uma função que faz um preloader de cada imagem, e a cada imagem carregada, ele somaria esse carregados até atingir um total de imagens. Enquando isso você pode rodar um onEnterFrame com um for, reposicionando todos os movieclips em relação ao _x + _width do movieclip anterior. Pra facilitar esse for, você pode criar um array e colocar todos os movieclips duplicados nesse array, assim no onEnterFrame ele roda o for com relação ao tanto de imagens e vai acertando a posição deles, sem array seria mais ou menos assim:

 

onEnterFrame = function(){
 for(i = 1; i < dados.childNodes[0].childNodes.length; i++){ // começa pelo 1 porque o zero sempre ficará na posição zero
     mcPanels["item_mc" + i]._x = mcPanels["item_mc" + (i - 1)]._x + mcPanels["item_mc" + (i - 1)]._width;
 }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

entendi... por que botar o tamanho de + de 180 imagens. no XML é trash!!!!

 

esse onEnterFrame ele ficaria dentro do meu for onde duplico os MovieClips? ou substituiria ele??

 

mas a minha maior dúvida era mesmo na lógica da função de posicionamento do movieclip sem um valor determinado...

 

muito obrigado pela dica.. vou testar aqui.. qualquer coisa volto a postar....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ficaria depois do seu for, você usa seu for pra inserir os movieclips no palco e depois você cria um onEnterFrame que posiciona todos os movieclisp do stage, mas isso fica processando, então o ideal é você deletar esse onEnterFrame depois que todos foram carregados, entendeu?

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.