Curso AS3

AS3 e as propriedades _root, _parent, _level, this, _global

As propriedades globais de acesso são uma das dúvidas de quem está migrando para o AS3, e tem gente que fica arrepiado quando fica sabendo que o _root não existe mais.

Escrevi em forma de lista alguns comentários sobre o assunto. =)

_root : foi removido, e a propriedade stage a substituiu. A propriedade root trabalha de forma semelhante a stage.

_parent : este propriedade permanece no Actionscript como parent. A propriedade retorna o pai de um objeto. Por exemplo, eu tenho dentro do mc_container o mc_bola, dando um trace em parent na no mc_bola ele retornará uma referência do mc_container.

_level : removido, era usando em conjunto com o loadMovieNum(), onde cada swf é carregado em um nível, sendo o swf principal de level zero. No Actionscript 3 a classe Loader faz todo o carregamento de SWF, e ele é adicionado com métodos como addChild() e addChildAt().

this : permanece da mesma forma, onde é retorna uma referência do escopo onde é usado.

_global : removido, porém podemos ter o mesmo efeito utilizando uma classe com propriedade estática.

Exemplo:

package
{
	public class dGlobal
	{
		public static var obj:Object = new Object();
	}
}

Para adicionar um valor:

dGlobal.obj['nome'] = 'Erick';

Resgatando um valor:

trace(dGlobal.obj['nome']); //output Erick

Eu uso um objeto porque posso ter acesso via referência, e não tenho limite de dados a serem armazenados, mas você pode também criar novas propriedades na classe dGlobal como uma String, Number, etc.

14 Responses to “AS3 e as propriedades _root, _parent, _level, this, _global”

  1. zoh Says:

    Falar que “ustentava uma má programação por ser usado incorretamente”, foi mto legal de sua parte, ela junto com o _lockRoot era responsavel pela formação de codigos absurdos! :D

    Principalmente quando vc trabalha em equipe e alguem utiliza isso!

    Post legal para quem tah começando.

    Só faltou falar do FlashVars o _root servia para pegar essa variavel que hj pode pegar usando:

    LoaderInfo(this.root.loaderInfo).parameters

  2. Erick Souza Says:

    @zoh Pois é, trabalhar em equipe + AS2 era muito perigoso, hehe. O Flash CS3 junto as AS3 deixaram muitas coisas ruins para trás, como os eternos bugs em componentes, que hoje é tranquilo para usar.

    Agora que você falou em _lockRoot passaram aquelas lembranças ruins. =P

  3. Cristiano Says:

    muito bom o post, já que tocou no assunto de propriedades e métodos estáticos, você poderia fazer um post sobre alguns problemas entre movies externos acessarem propriedades estáticas de movies internos, ja vi muita gente apanhando por ai nos fóruns, é alguma coisa relacionada a “LoaderContext” não sei se você já passou por isso.

  4. Miquéias Silva Says:

    Oi, td bem?
    Costumo ler seus artigos e tutoriais, porque acho muito interessantes, e gostaria de saber se vc pode me ajudar. Estou fazendo um sistema de mensagens ao vivo, o sistema qdo busca um arquivo xml isolado ele funciona só que a busca do Id é dinamica, e não condigo fazer referência no html da variável “meuId”, que usei para concatenar na busca do xml (urlXml = “sala”+meuId+”.xml”). E meuId já declarei como String, LoaderInfo, UrlLoader e etc. E no html coloquei o parametro da seguinte forma:. Caso possa me ajudar, desde já agradeço.

  5. Pablo Erick Cardoso Says:

    Acho que existe um equivoco o root nao foi removido, agora ele tem que ser declarado da seguinte forma:

    MovieClip(root)

    ou também

    MovieClip(parent.parent.parent)

  6. Erick Souza Says:

    Oi Pablo, o root e stage podem ser usando de forma semelhante, porém não obtém o acesso de forma absoluta como o _root, e é preciso associar a algum objeto.

  7. Pablo Erick Cardoso Says:

    Ummmm, posta um exemplo simples pra mim. Eu não entendi forma semelhante mas sem acesso absoluto ?

  8. Alan Says:

    Eu tentei utilizar esse exemplo, porém estou com a seguinte duvida:

    Tenho 2 mc , um que irá receber o valor e outro que irá enviar esse valor, utilizando esse exemplo consegui receber o valor porém inserido na classe, e não o valor enviado do botão.

    A minha classe ficou assim:

    package
    {
    public class dGlobal
    {
    public static var obj:Object = new Object();
    dGlobal.obj['nome'] = ‘Erick’;
    }
    }

    E no mc que irá receber , coloquei o trace e funcionou. Como faço para colocar no outro mc para enviar para o mc que irá receber. Tem como enviar o texto do mc que funciona como botao atraves de var? Substituir o nome Erick por uma variavel deste botao??

    Agradeço desde já
    Parabéns pelo site.

  9. Guilherme Ferreira Says:

    Opa! Tudo bem Erick?
    Aqui… Faz um imenso favor “pra nóis”… Já que você pelo visto domina o uso destas proproedades, cria um exemplo pratico e disponibiliza a o .fla (um arquivo compactado com o .fla em um rapdshare da vida).

    Seria de grande ajuda! :-)

  10. Pedro Pisandelli Says:

    Aê Erick.. cara, facilita pro povo! :D
    O DVD chegou… uma beleza! Valeu!

    Sim, Guilherme, vamos a um exemplo prático.
    Como foi dito acima, as propriedades _root e _parent estão deveras diferentes no AS3.
    O _root agora é “stage” (apesar da propriedade root ainda existir… veja os comentários acima). O _parent agora é somente “parent”. Para que ele funcione, o stage precisa ser referenciado antes, como um Movieclip.
    Vamos ao exemplo do uso do “parent”:

    1. Crie um arquivo .FLA (em AS3, lógico).
    2. Faça um quadrado (ou outro desenho qualquer) e depois transforme-o em MovieClip.
    3. Dê um nome de instância de sua preferência.
    4. No frame 20 crie um keyframe (tecle F6) e desloque o quadrado.
    5. Crie a interpolação de movimento (tradicional).
    6. No primeiro frame adicione um stop();

    No primeiro frame, entre no modo de edição do quadrado (clique 2x nele). Arraste um componente button e coloque o nome de instância “botao”.
    Crie uma camada e no primeiro frame dela e tecle F9.
    O que vamos fazer é o seguinte: Ao clicar no botão o stage vai seguir com play(); e você verá a animação.
    Vamos ao código:

    //evento CLICK no botão
    botao.addEventListener(MouseEvent.CLICK, SEGUIR);

    function SEGUIR(evt:MouseEvent):void
    {
    (parent as MovieClip).play();

    //ou então
    //(root as MovieClip).play();

    //ou então
    //MovieClip(parent).play();

    //ou então
    //MovieClip(root).play();
    }

    Parece mais complicado, mas isso se deve ao “Strict Mode” do Flash Player. Se você achar isso um saco, existe a opção de desabilitar o Strict Mode do Flash Player.
    Vamos lá:

    Tecle “CTRL+SHIFT+F12″ –> Na aba Flash, selecione “Settings” ao lado da caixa de seleção do Script. –> Desmarque a opção “Strict Mode”.
    Dessa forma seu script pode ficar mais semelhante ao AS2, apesar disso não ser recomendado, porque as melhorias do AS3 em detrimento ao AS2 são exatamente no fato de “forçá-lo” a usar boas práticas (mais lógicas) de programação, entre muitas outras. Mas fica a seu critério.
    Vamos ao código com o Strict Mode DESABILITADO:

    //evento CLICK no botão
    botao.addEventListener(MouseEvent.CLICK, SEGUIR);

    function SEGUIR(evt:MouseEvent):void
    {
    parent.play();
    }

    Tá aê a dica!
    FLW!

  11. Luis Carlos Says:

    Olá!
    Estou tendo uns problemas com o MovieClip(root).play tenho dois swfs, index e produto, o produto é carregado dentro do index, no swf produto eu tenho um botão que ao clicar deve dar player na timeline principal do index, ao invés disso dá player na timeline do produtos.swf, como posso resolver isso, já tentei de tudo aqui e nada

    Att

    Luis Carlos

  12. lucas farina Says:

    como faz assim _root.nomedomvclip.loadMovie(”entrada.swf”) ???

    ou assim _parent._parent.nomedomvclip.mvclipdentro.loadMovie(”abertura.swf”)

    acessem meu site… http://www.agenciavisavis.com abraço… as2 eu acho muito simples e perfeito… faloooo gostaria de apreender a as3 do mesmo modo que uso a 2… sem problemas algum…. falo

  13. lucas farina Says:

    e tipo on(release) on(press) on(rollOver) on(rollOut) como faz isso on(rollOver){_parent.loadMovie(”lalala.swf”)???

  14. André D´Angelo Says:

    Fala Erick, parou os posts cara! Flw Abraços!

Leave a Reply