Básico do AS3, Preloader, _parent, onRelease

Estava faltando na net um conteúdo com informações básicas na criação de um site em as3. No blog mesmo encontro várias pessoas procurando por loader e pré-loader. Por isto resolvi fazer o básico que você irá precisar para criar o básico do seu site, ou mesmo aplicaçãom, em flash.

Pré-loader (loader que aparece no começo do site)
onRelease, onRollOver, onRollOut… (criar botões)
Comunicação em movieclips (antigos _parent, _root e _global)

Nestes exemplos não serão usados classes, já que a idéia é a simplicidade. Mas nada impede de você faze-lo já que não muda quase nada.

 

Pré-Loader (loader do começo do site)

De forma simples e para situações simples podemos criar todo o código dentro do primeiro frame. Observe o exemplo as2 que será convertido:

this.onEnterFrame = function() {
loaded._width = (_root.getBytesLoaded()*MaxWidth)/_root.getBytesTotal();
if(_root._framesloaded == _root._totalframes) {
delete this.onEnterFrame;
//_root.play();
}
}

loaded é o movieclip que terá o seu tamanho atualizado a cada frame fazendo uma regrinha de 3 básica de sempre. Quando concluir o download será apagado esta função e, caso o load seja colocado em um movieclip separado do site terá será mandado chamado a função/método play();. No modo as3 não poderemos usar necessariamente um loop já que existe uma classe que cuida de carregamento conteúdos, loaderInfo.

this.loaderInfo.addEventListener(Event.INIT, getinit);
this.loaderInfo.addEventListener(ProgressEvent.PROGRESS, getprogress);
this.loaderInfo.addEventListener(Event.COMPLETE, getcomplete);

Não é necessário o evento INIT. Já que o que queremos é o progresso e quando estiver completo. Eu coloquei só para mostrar ou para alguém que precisar que alguma coisa seja feita quando iniciar o download, ou sei lá.

function getinit( event:Event ) {
loaded.width = 1;
}
function getprogress( event:Event ) {
var lb:Number = event.target.bytesLoaded;
var tb:Number = event.target.bytesTotal;
var MaxWidth:Number = 100;
loaded.width = (lb/tb)*MaxWidth;
}
function getcomplete( event:Event ) {
loaded.width = 730;
//MovieClip(this.parent).play();
this.loaderInfo.removeEventListener(Event.INIT, getinit);
this.loaderInfo.removeEventListener(ProgressEvent.PROGRESS, getprogress);
this.loaderInfo.removeEventListener(Event.COMPLETE, getcomplete);
}

Como disse, caso não use o evento INIT poderá remover o getinit. Todas as funções/métodos que são criados para receber eventos deverão ter a entrada de um argumento do tipo do evento. O getprogress será chamado toda vez que for alterado o valor carregado do site. loaded é um movieclip presente que terá o seu tamanho modificado a cada vez que o valor mudar. Em getcomplete poderá ser chamado o pai do mesmo no caso de você deixar o pre-loader dentro de um movieclip.

O código não está otimizado justamente por que isto é uma explicação e todos os conceitos estão sendo usados, no caso vocês devem personalizar eles para o seu uso. Por exemplo, eu não removo todos os listeners de eventos já que sempre deixo o pré-loader dentro de um movie e logo no segundo frame o mc já não estará mais instanciado, perdendo então a necessidade desta parte do código.

download do fonte

 

onRelease, onRollOver, onRollOut…

Eu tenho costume criar botões com movieclips mesmo. Acho que fica uma coisa, digamos, mais personalizada. E na verdade tudo é movieclip quando é compilado. Para o flash player botão, gráfico e clipe de filme são a mesma coisa.

Se eu quiser usar os eventos release, rollover e outros deveremos fazer assim:

this.addEventListener( MouseEvent.MOUSE_OVER, overExample );

function overExample( event:MouseEvent ) {
//
}

Criamos um evento do tipo MouseEvent. Então a função deverá receber um evento do tipo MouseEvent. O release você pode usar o moseUp, e o press mouseDown. Agora podemos criar eventos de outros tipos para substituir por exemplo o release, CLICK é um exemplo. duplo click também e coisas como releaseOutside deverão ser programas. Você terá que mesclar dois pontos, MOUSE_OUT e mouseUp. Não vou entrar em mais detalhes por que o objetivo é fazer você entender como funciona, os detalhes você conseguirá entender agora no próprio F1.

Para fazer o useHandCursor você pode deixar a propriedade buttonMode como true, “ligada”.

 

Comunicação em movieclips

Como vocês devem ter observado, a forma de interação entre movieClips irmão, pais e filhos mudou. Não existe mais _parent, _root, e _global. Agora todo movieclip criado tem um objeto chamado parent, e root. o global acabou em definitivo.

O uso neste caso é muito simples this.parent ou this.root.

Caso você queria chamar uma função você terá que informar o que se trata o objeto em questão. Por exemplo, se quiser dar um play no movieclip pai do atual deverei usar:

MovieClip(this.parent).play();

Nada de complicado e ajuda muito. Caso necessite mesmo do _global você poderá criar e instanciar uma classe estática e onde você deixe referência de objetos para depois chama-los. Assim qual instancia poderia acessar a variável “global”.

Caso tenham alguma duvida a mais não listada aqui poderão deixar um comentário por aqui e informar o que gostariam.

16 Responses to Básico do AS3, Preloader, _parent, onRelease

  1. mamp disse:

    legal, tratando de coisas bem basicas, pros meros mortais hehe.
    O loaded._width parece que nao tinha, pelo menos no mx.

  2. rubem disse:

    orlando, seu preloader foi o único que encontrei em AS3, muito bom!!! abaixo do seu(mas que usa o AS2), é do baldan – http://www.ffiles.com/flash/user_interface/full_preloader.
    eu gosto de precarregar tipo 80% do conteúdo e o resto descarregado enquanto navegam no site.como sou um jegue em AS, gostaria de saber como posso colocar, dentro do seu código esse artifício. seria uma maneira de diminuir o tempo de espera já que meu site (ainda não publiquei) tem fotos que somam uns 500 kb e acho excessivo o tempo que se fica esperando , mesmo que eu coloque conteúdo na pagina do preloader, “enrolando” o sujeito.

    obrigado, e mais uma vez, muito legal e sintético.valeu.um abraço.rubem eiras

  3. Orlando Leite disse:

    Fiz ele exatamente por isto. O próximo será um player decente. Se quiser carrega-lo somente até os 80% você não precisará, então, usar a função/método getcomplete. Apague-a e acrescente ao final do getprogress:
    var currentValue = (lb/tb)*100;
    if(currentValue > 80) {
    MovieClip(this.parent).play();
    this.loaderInfo.removeEventListener(ProgressEvent.PROGRESS, getprogress);
    }

  4. luka disse:

    muito bom, mas ainda tenho uma dúvida:

    eu tenho dois movieclips fazendo a função de botão e eles estão no mesmo movieclip, qnd aplico o parent ele chama as duas funções independente do botão que eu clicar.

    o código ta assim:
    _ _ _ _ _ _ _ _ _ _

    function abreEmpresa(e:MouseEvent):void {
    empresa.gotoAndPlay(41);
    }

    abertura.parent.addEventListener(MouseEvent.CLICK, abreEmpresa);

    function abrePortfolio(e:MouseEvent):void {
    portfolio.gotoAndPlay(55);
    }

    abertura.parent.parent.addEventListener(MouseEvent.CLICK, abrePortfolio);
    _ _ _ _ _ _ _ _ _

    se eu clicar no botão portfolio ele abre empresa e depois portfolio e se eu clicar em empresa e ele abre do mesmo jeito.

    já procurei em diversos fóruns e ainda não consegui tirar a minha dúvida.

  5. Orlando Leite disse:

    Olá Luka, acho que o problema seja na sua forma de pensar o código, observe que você “criou um botão” e depois criou um botão dentro do primeiro. Isto não funcionará corretamente em hipótese alguma. Não sei exatamente o que você fez ou queria fazer, mas você deve criar um botão para empresa e outro para portfolio.

  6. Luka (de novo) disse:

    oi orlando,

    a dúvida de cima é examente igual a esta, o de cima eu consegui fazer desse modo aqui embaixo, mas qnd fui utilizá-lo em um menu não consegui…
    eu tenho um menu, com alguns botões (movieclips) e um desses botoes tem um submenu, q contém outros botões(os quais eu não estão conseguindo acessar), o q há de errado???

    ps.: essa é uma parte do código pq ele ta com umas 200 linhas…
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

    function urlMarca(event:MouseEvent):void {
    var marca:URLRequest = new URLRequest(“portfolio_marca01.html”);
    navigateToURL(marca, “_self”);
    }

    submenu.btn_marcas2.addEventListener(MouseEvent.CLICK, urlMarca);

    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

  7. Orlando Leite disse:

    Mais uma vez acredito que o problema esteja no fato de você criar um botão dentro do outro.

    Quando isto ocorre, seja action script 2 ou 3 o botão que vai prevalecer é o que de nível maior, no caso o pai do menor. Para resolver isto o pai não poderá ser um botão ou deverá deixar de ser um assim que terminar de fazer sua função.

    No caso seria algo como:

    function clicouNoBotao {
    abreSubMenu();
    removeEventListener( botaoMenu, clicouNoBotao );
    }

    Ou também criar mais um botão por baixo de todos eles como background, e usar ele para verificar o primeiro clique.

  8. André Azevedo disse:

    Boas,
    olha sabes me dizer se da para ir buscar o numero total de frames de um swf que é carregado extenamente??
    Tanks

  9. Julio Farias disse:

    Sobre o problema dos menus…
    Solução:

    submenu[btn_marcas2].addEventListener(MouseEvent.CLICK, urlMarca);

  10. Lucas disse:

    Olá muito bom esse exemplo de preloader AS3. usei o scritping idêntico
    Funcionou bem. Porém agora estou com um problema qdo volto a página inicial…
    tranca tudo. O botão para voltar a pg inicial é uma imagem em um html .
    Sou novato e gostaria se vc pudesse me ajudar.
    Recapitulando…ao entrar a primeira vez na index…td tranquilo .Após navegar nas outras pgs ex:. contato , qdo queremos retornar ao index …tranca tudo e fica aparecendo a barrinha do loader.
    Muito obrigado

  11. RENAN disse:

    No caso de mc1.swapDepths(mc2) no as2, como procedo no as3?
    Não consegui achar nenhuma resposta satisfatoria pela NET.

  12. Vinicius disse:

    sobre o loader, deu certo mas uso o mesmo flash para 3 paginas, e quando mudo da principal para as demais o loader para e nao executa o resto do swf

    pode me ajudar nisso?

  13. Olá Orlando parabéns.
    Adorei seu artigo pois sempre trabalhei com Flash e AS mas fiquei muito tempo afastado desta profissão e estou me atualizando para voltar a ativa.
    Tenho uma dúvida:
    Queria colocar uma caixa de texto para informar numericamente ao visitante, além da barra, a quantas anda o download do site/aplicação e pensei que poderia criar uma textbox dinâmica com o nome de instância “carregando” e fazer assim:

    carregando.text = Math.floor((lb/tb)*MaxWidth)+ ” %”;

    Mas não rolou, o que está errado?
    Abraços

    Fabio Lima

  14. Ezequiel Godoy disse:

    Fábio, eu fiz um teste aqui funcionou a porcentagem.
    carregando.text = Math.floor((lb/tb)*MaxWidth) + ” %”;

    Lembre-se que estamos trabalhando com AS3, então seu arquivo deve estar no mesmo formato.

  15. Ezequiel Godoy disse:

    Olá Orlando!

    Parabéns, a explicação está bem clara.
    Fiz e preloader aqui e funcionou melhor que encomenda.
    Gostaria de usar este preloader para os carregamentos de arquivos swf externos.

    Estou carregando os arquivos da seguinte forma:

    var carregarSwf:Loader = new Loader();
    var enderecoSwf:URLRequest = new URLRequest(“home.swf”);
    carregarSwf.load(enderecoSwf);
    corpo_site.addChild(carregarSwf);

    Como poderia incluir este preloader no código acima?

  16. André disse:

    olá preciso de uma ajudinha

    como eu transfomo um comando como esse em as3?

    _root.mc_bg.slideTo( undefined, 50.1, 0.5, “easeOutExpo”);

    desde já, obrigado

Deixe um comentário