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.
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.
legal, tratando de coisas bem basicas, pros meros mortais hehe.
O loaded._width parece que nao tinha, pelo menos no mx.
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
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);
}
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.
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.
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);
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
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.
Boas,
olha sabes me dizer se da para ir buscar o numero total de frames de um swf que é carregado extenamente??
Tanks
Sobre o problema dos menus…
Solução:
submenu[btn_marcas2].addEventListener(MouseEvent.CLICK, urlMarca);
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
No caso de mc1.swapDepths(mc2) no as2, como procedo no as3?
Não consegui achar nenhuma resposta satisfatoria pela NET.
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?
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
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.
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?
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