Ir para conteúdo

POWERED BY:

Arquivado

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

Elektra

[Resolvido] Lista de exibição - DisplayObject

Recommended Posts

Tenho 3 movie clips: largeContainer, smallContainer e child (instâncias: child0, child1, child2)

 

largeContainer recebe smallContainer, child0 e child1

 

smallContainer recebe child2

 

child recebe texto

 

 

//import flash.display.MovieClip;
//import flash.display.DisplayObject;
//import flash.display.DisplayObjectContainer;

function showChildren(dispObj:DisplayObject):void {
for (var i:uint = 0; i < dispObj.numChildren; i++) {
	var obj:DisplayObject = dispObj.getChildAt(i)
	if (obj is DisplayObjectContainer) {
		trace(obj.name, obj);
		showChildren(obj);
	} else {
		trace(obj);
	}
}
}

showChildren(stage);

 

Deve exibir em output:

 

root1 [object MainTimeline]
largeContainer [object MovieClip]
[object Shape]
smallContainer [object MovieClip]
[object Shape]
child2 [object MovieClip]
[object Shape]
[object StaticText]
child0 [object MovieClip]
[object Shape]
[object StaticText]
child1 [object MovieClip]
[object Shape]
[object StaticText]

 

 

Estou refazendo o exercício de um livro, observei a mesma ordem para os mcs, mas obtenho erro em 2 linhas do code:

 

Line 4  1119: Access of possibly undefined property numChildren through a reference with static type flash.Display:DisplayObject

Line 5  1061: Call to possibly undefined property getChildAt through a reference with static type flash.Display:DisplayObject

 

Arquivo original + exercício com erro - salvei na versão CS4 >> http://rapidshare.com/files/442092804/DisplayObject.rar

 

Agradeço quem puder dar uma luz.

 

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Elektra, o parâmetro da função showChildren() é do tipo DisplayObject. Assim como deve estar estudando nesse exercício, esse é um tipo gráfico que não pode conter filhos. Portanto, ele não tem a propriedade numChildren e o método getChildAt(). Avalie a necessidade de alterar este parâmetro para esperar um DisplayObjectContainer.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é, eu tenho esse livro que a Sra D. Electra está estudando, e vejo muita gente falando do mesmo assunto, eu adptei o código para ficar assim:

 

function showChildren(dispObj:DisplayObjectContainer):void 
{
   for (var i:uint = 0; i < dispObj.numChildren; i++) {
       var obj:DisplayObject = dispObj.getChildAt(i)
       if (obj is DisplayObjectContainer) {
           trace(obj.name, obj);
           showChildren(DisplayObjectContainer(obj));
       } else {
           trace(obj);
       }
   }
}

showChildren(stage);

 

Porém vem um exemplo do livro que funciona, mas foi porque o rapazinho que fez o livro foi lá no publish settings, entrou em flash / Action Script 3.0 Settings e desabilitou o Strict Mode, testando assim o código do livro vai funcionar. Agora seguindo o que o Bruno disse, a função deve receber todo tipo de objeto, ali você está obrigando ela a receber um displayObject que como ele disse, e somente o displayObjectContainer terão filhos e seguindo disso funcionará o numChildren e getChildAt, então o melhor é colocar um * para o parametro pois assim ele aceitaria qquer tipo de objeto e usaria a recursão somente quando o objet for displayObject Container, ficando assim:

 

function showChildren(dispObj:*):void
{
if (!(dispObj is DisplayObjectContainer))
{
	trace(dispObj);
	return;
}
for (var i:uint = 0; i < dispObj.numChildren; i++)
{
	var obj:DisplayObject = dispObj.getChildAt(i);
	if (obj is DisplayObjectContainer)
	{
		trace(obj.name, obj);
		showChildren(obj);
	}
	else
	{
		trace(obj);
	}
}
}

showChildren(stage)

 

Ja dá pra imaginar a Electra com o livro na mão em frente a editora e gritando "JUS-TI-ÇA! JUS-TI-ÇA!"

Compartilhar este post


Link para o post
Compartilhar em outros sites

hahahhhh, ri muito Prof. Dr. carneirinho desdentado.gif

 

 

Asterisco malvado, eu fui refazer o code do fla e nada de funfar (dureza é que no livro usava o *). Não sabia sobre o Stric Mode e foi a primeira vez que ouvi falar sobre recursão.

 

Eu tinha percebido a relação com DisplayObjectContainer mas alterei nas linhas que notificavam o erro. Piorou.

 

 

 

 

Se me permite uma pergunta, porque adicionou a classe entre os parênteses?

 

showChildren(DisplayObjectContainer(obj));

 

 

Valeu pelo code carneirinho, vou estudar.

 

Muito obrigada amigos.

 

 

ps: eu já avisei, vou botar minha alma à venda pra aprender de vez esse trem do AS3 :grin: (gosto mesmo disso)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quando cria o obj, ele está sendo criado como displayObject, assim na hora de enviar eu posso modificar ou setar um novo tipo de objeto sem altera-lo, apenas para mandar pra função, olha esse exemplo:

 

var um:String = "1";

var dois: String = "2";

 

 

trace(um + dois);

// Aqui retorna 12 pois ele concatena

 

trace(Number(um) + Number(dois));

// Aqui retorna 3 pois ele soma

 

trace(um + dois);

// Aqui retorna 12 denovo pois não mudei o tipo de dados da String

Compartilhar este post


Link para o post
Compartilhar em outros sites

function showChildren(dispObj:*):void
{
if (!(dispObj is DisplayObjectContainer))
{
	trace(dispObj);
	return;
}
for (var i:uint = 0; i < dispObj.numChildren; i++)
{
	var obj:DisplayObject = dispObj.getChildAt(i);
	if (obj is DisplayObjectContainer)
	{
		trace(obj.name, obj);
		showChildren(obj);
	}
	else
	{
		trace(obj);
	}
}
}

showChildren(stage)

Se ainda quiser fazer uso de tipagem no parâmetro da função, poderia receber DisplayObject e fazer o casting quando necessário. Afinal, não se espera receber qualquer objeto, mas sim, um que seja no mínimo DisplayObject. "No mínimo", já que pode receber de qualquer tipo herdeiro (como DisplayObjectContainer por exemplo).

 

import flash.display.DisplayObjectContainer;
import flash.display.DisplayObject;

function showChildren(dispObj:DisplayObject):void
{
   if (!(dispObj is DisplayObjectContainer))
   {
       trace(dispObj);
       return;
   }
   var dispObjCont:DisplayObjectContainer = DisplayObjectContainer(dispObj);
   for (var i:uint = 0; i < dispObjCont.numChildren; i++)
   {
       var obj:DisplayObject = dispObjCont.getChildAt(i);
       if (obj is DisplayObjectContainer)
       {
           trace(obj.name, obj);
           showChildren(obj);
       }
       else
       {
           trace(obj);
       }
   }
}

showChildren(stage);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigada, compreendi.

 

Eu já tinha ouvido falar sobre passar um novo valor, mas não em alterar o tipo de dado dentro de uma função.

 

 

O tipo de dado declarado na função showChildren com o asterisco se assemelha a:

 

import flash.display.*;

 

ou seja, relaciona todas as classes do pacote display.

 

Ao definir na recursão faz referência aos objetos que possuem filhos a ser listados.

 

 

Valeu mestre :worship:

 

 

 

 

@ brunobispo

 

Agradeço pela atenção, postamos quase ao mesmo tempo.

 

Estou realmente me esforçando para saber como funciona cada vírgula, mesmo em um simples exemplo.

Meu curso de AS3 não chegou nem perto disso.

 

 

Grande abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Recursão no caso, é uma função chamar ela mesma, você tem um objeto no palco com 4 filhos, dai ele vai te listar esses 4 filhos e a cada filho que encontrar, ele vai verificar se esses mesmo contêm mais filhos, se conter... no caso ser displayObjectContainer com numChildren > 0, ele vai chamar a própria função e executar denovo do zero para esse filho, e a função denovo vai ver se esse filho do filho tem mais filhos, até chegar no ta-ta-ta-ta-ta-ta-taraneto como no chapolin, é o que ele faz aqui:

 

var obj:DisplayObject = dispObj.getChildAt(i);
               if (obj is DisplayObjectContainer)
               {
                       trace(obj.name, obj);
                       showChildren(obj);
               }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigada, compreendi.

 

Eu já tinha ouvido falar sobre passar um novo valor, mas não em alterar o tipo de dado dentro de uma função.

 

 

O tipo de dado declarado na função showChildren com o asterisco se assemelha a:

 

import flash.display.*;

 

ou seja, relaciona todas as classes do pacote display.

 

Ao definir na recursão faz referência aos objetos que possuem filhos a ser listados.

 

 

Valeu mestre :worship:

Na verdade, o tipo * (asterisco) significa "sem tipo". Somente uma variável sem tipo pode receber objetos de tipos variados como no exemplo do carneirinho.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Meu santinho é bom demais! nem mereço tanto. :clap:

 

Esse '.fla' baleado do livro tá valendo ouro, foi uma aula e tanto.

 

 

Muito obrigada mesmo.

 

 

ps: quando eu atacar o Essential AS3, vai ser com um pé nas costas! :lol: (senti firmeza)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só depois lembrei de visitar a 'errata', e olhem só, minha dificuldade estava categorizada como Erro Técnico Grave.

 

O Strict Mode é usado em todos os arquivos '.fla'.

 

Fica a referência para outros colegas que possam usar este livro, para conferir outras falhas na edição:

 

 

Aprendendo ActionScript 3.0 - O'Reilly

 

http://oreilly.com/catalog/errata.csp?isbn=9780596527877

 

 

 

Por favor, tópico [RESOLVIDO].

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.