Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Conhecendo o ActionScript 3
Olá pessoal, dando seqüência nos estudos das mudanças feitas no actionScript 3, postarei agora mais novidades da linguagem, um detalhe que devo avisar, é que o conteúdo aqui é voltado principalmente para ajudar a quem esta migrando agora do AS2 para o AS3, e não explicar do zero o AS3, por isso alguns tópicos não estão muito detalhados, e varias vezes eu farei comparações entre o AS2 e como esta agora no AS3(mais vezes do que eu gostaria até /applications/core/interface/imageproxy/imageproxy.php?img=http://forum.imasters.com.br/public/style_emoticons/default/tongue.gif&key=8d11c3c7c03c7a5a294e250694d100848a0423dc34ef2af8d774f49d1b969fde" alt="Imagem Postada" /> ).
Ok, agora vamos ao que interessa:
Finalmente temos constantes
Alteração no nome das propriedades
Variáveis e funções globais
Criando funções com parâmetros opcionais
Criando funções com números de parâmetros indefinidos
Adicionando ações em botões (detalhado)
Usando o this no Actions Script 3
Diferença entre rollOver e mouseOver, e rollOut e mouseOut
Simulando o onReleaseOutside
Finalmente temos DoubleClick
Cadê o getURL?
Carregamento de imagens ou swf externos
Cadê o attachmovie e o createEmptyMovieClip?
Sprite e SimpleButton
Adicionando comandos a um frame (addFrameScript)
Alterando o frame rate dinamicamente
Exibir a quantidade de memória utilizada
Carregando variáveis de um arquivo txt
Carregando um arquivo XML
Usando o Laço for...in
Usando FlashVars
Desenhando dinamicamente
Criando um Preloader simples
alguns link uteis (em inglês /applications/core/interface/imageproxy/imageproxy.php?img=http://forum.imasters.com.br/public/style_emoticons/default/tongue.gif&key=8d11c3c7c03c7a5a294e250694d100848a0423dc34ef2af8d774f49d1b969fde" alt="Imagem Postada" />):
Um passo a passo para iniciar:
Actionscript 3 - First Steps
Guia de referencia, o melhor lugar para aprender:
ActionScript 3 Language Reference
Guia para migração do AS2 para AS3 (muito util):
AS2 to AS3
Videos Tutoriais sobre AS 3
as3.metah.ch
Apostila
Programming ActionScript 3(PDF)
Arquivos fontes(.FLA) para estudo
Flash ActionScript 3.0 samples(8Mb)
Programming ActionScript 3.0 samples(44Mb)
Aviso
Incentivamos os Membros do fórum a ajudar a aumentar esse material, então se você achou alguma nova funcionalidade do AS3, criou alguma classe ou tem alguma dica, poste na área de Artigos, Dicas, Tutoriais e Matérias, que eu colocarei o link no índice acima :thumbsup:
Novos tipos de variáveis
Os tipos já existentes não sofreram alteração alguma(a não ser internamente para melhorar a performance), as novidades são 2 novos tipos de variáveis numéricas, int e uint.
são elas:
[table=Variáveis Numéricas][tr][th=5%]Nome[/th][th=30%]Tipo de valores[/th][th=40%]Faixa de valores[/th][/tr][tr]
intInteiros, negativos e positivosde -2.147.483.648 à 2.147.483.647 (32 bits)[/tr][tr]uintInteiros, apenas positivosde 0 à 4.294.967.295 (32 bits)[/tr][tr]Numberponto flutuante, negativos e positivosde -9,007,199,254,740,992 à 9,007,199,254,740,992 (52 bits)[/tr][/table]
O tipo Number não é nova, só coloquei para você poder compara-la com os outros tipos
com isso é possível concluir que é preferível usar o tipo unit para variáveis usadas como contador num laço FOR, ou para atributos como cores ou tamanhos, ou o int caso seja necessário usar números negativos, porem de uma “pequena” faixa, e usar Number apenas para números de ponto flutuante
Alteração no nome das propriedades
um detalhe importante no nome das propriedades é que agora não existe mais o _ (underline) antes do nome dela, veja como utilizar:
objeto_mc.x = 0;objeto_mc.y = 0;objeto_mc.width = 200;objeto_mc.height = 200;as propriedades _xmouse e _ymouse mudaram de nome, agora são mouseX e mouseY respectivamente o mesmo para as propriedades _xscale e _yscale que agora são scaleX e scaleY respectivamente, outra alteração é nos valores permitidos nesses atributos, antes você deveria colocar um valor entre 0 e 100, a nova maneira esses valores vão de 0 à 1.veja a diferença:
antes:
objeto_mc._xscale = 50;objeto_mc._yscale = 100;agora:
objeto_mc.scaleX = 0.5;objeto_mc.scaleY = 1;
o mesmo vale para a propriedade _alpha os valores vão de 0 à 1.
// atribuindo 50% de alphaobjeto_mc.alpha = 0.5;
Variáveis e funções globais
as variáveis e funções de escopo global(de toda a aplicação) que antes poderiam ser acessadas facilmente com o objeto _global, agora não podem, este objeto foi retirado do AS3, para usa-las, é recomendado você criar uma classe estática, de preferência na pasta raiz da sua aplicação, veja um exemplo da classe:
package { public class Global{ public static var data:Object = new Object(); }}como a classe é estática não será preciso instancia-la para usar suas variáveis ou métodos, com isso o uso da classe será assim:
Global.data.variavel = "teste"// ou dessa formaGlobal.data["variavel"] = "teste"o mesmo vale para criar funções globais
Global.data.mostraMenssagem = function():void{ trace("Olá") }Global.data.mostraMenssagem()
Criando funções com parâmetros opcionais
Algumas melhorias foram adicionadas no uso das funções, uma delas é a opção de definir um valor padrão para os parâmetros recebidos.
No AS2 por não existir essa opção erramos obrigados a fazer validações, como essa:
Usando AS2:
function exibeTexto(numero:Number, texto:String){ if(texto == undefined){ texto = "ontem"; } trace(numero,texto );}exibeTexto(1); //saída 1, ontemexibeTexto(2, "hoje");//saída 2, hoje
agora veja como pode ser feito com AS3:
function exibeTexto(numero:Number, texto:String = "ontem"){ trace(numero, texto );}exibeTexto(1); //saída 1, ontemexibeTexto(2, "hoje"); //saída 2, hoje
o mesmo resultado, porem de forma mais estruturada
um detalhe a ser lembrado é que os parâmetros opcionais devem ser colocados sempre por ultimo na lista de parâmetros, o exemplo abaixo mostra a forma errada
function exibeTexto(numero:Number = 2, texto:String){ trace(numero, texto );}
Criando funções com números de parâmetros indefinidos
caso seja necessário cria uma função onde o numero de parâmetros não é definido por padrão, no AS2 tínhamos a classe arguments, esta foi removida e adicionado o Statements " ... "
veja como funciona:
function testaExtraParams(m:String, ...parans){ trace("primeiro parâmetro:" + m); trace("segundo parâmetro:" + parans[0]); trace("terceiro parâmetro:" + parans[1]); trace("quarto parâmetro:" + parans[2]); trace("-------------------------");}testaExtraParams("gato", "pato");testaExtraParams("gato", "pato", "sapo", "leão");
Adicionando ações em botões (detalhado)
Uma grande alteração feita no AS3 é que não se pode mais colocar qualquer actions diretamente no objeto, isso mesmo, as ações agora só podem ser colocadas na time-line, para quem usava o flash para fazer coisas simples como banner´s e apresentações, e que as únicas ações que usavam eram um play(), stop() ou getURL(), para essas pessoas a nova sintaxe talvez assuste no começo, mas não é nenhum bicho de 7 cabeças.
isso acabou:
ACTIONSCRIPT
on(press){
trace("clicou");
}
o que antes era feito assim:
ACTIONSCRIPT
botao_btn.onPress = function(){
trace("clicou");
}
agora no AS3:
ACTIONSCRIPT
//criar a função que será executada no click do mouse
function onClick(event:MouseEvent):void {
trace("clicou");
}
// adiciona ao botão um ouvinte, especificando que no
// evento CLICK a função onClick deve ser chamada
botao_btn.addEventListener(MouseEvent.CLICK, onClick);
não esta é complicado assim fala a verdade /applications/core/interface/imageproxy/imageproxy.php?img=http://forum.imasters.com.br/public/style_emoticons/default/smile.gif&key=15294d64c22e9e9c4ae0bf82a62ec27d13f27d6ba7078a5f7982077798029364" alt="Imagem Postada" />
um detalhe no MouseEvent.CLICK, esse parâmetro que foi passado é uma constante que contem a string "click", por isso poderia ser feito dessa forma:
ACTIONSCRIPT
botao_btn.addEventListener("click", onClick);
ou
ACTIONSCRIPT
botao_btn.addEventListener("mouseMove", onClick);
vai da sua preferência mesmo usar a constante ou o string
agora vamos ver o parâmetro que foi recebido pela função onClick
function onClick(**event:MouseEvent**):void {
}
o parâmetro recebido varia dependendo de qual evento o listener foi adicionado, nesse parâmetro (que pode ter qualquer nome, no meu caso eu coloquei "event") esse objeto possui algumas informações sobre o evento que foi chamado, o que varia novamente de evento para evento no caso dos eventos ligados ao mouse, esse objeto possui as seguintes propriedades:
vou descrever apenas os mais importantes dessa classe
[table=Atributos do objeto MouseEvent][tr][th=20%]Atributo[/th][th=80%]Valor [/th][/tr][tr]buttonDowntrue se o botão primário do mouse estiver pressionado, false caso não esteja (pode ser mais útil no evento mouseMove)[/tr][tr]ctrlKeytrue se a tecla CRTL estiver pressionada quando o botão foi clicado, false caso não esteja[/tr][tr]shiftKeytrue se a tecla SHIFT estiver pressionada quando o botão foi clicado, false caso não esteja[/tr][tr]altKeytrue se a tecla ALT estiver pressionada quando o botão foi clicado, false caso não esteja[/tr][tr]currentTargeté a instancia do objeto que o listener foi adicionado[/tr][tr]localXposição na horizontal em que o objeto foi clicado pelo mouse (equivale a propriedade _xmouse)[/tr][tr]localYposição na vertical em que o objeto foi clicado pelo mouse (equivale a propriedade _ymouse )[/tr][tr]stageXposição na horizontal em que o objeto foi clicado, em relação ao Stage (equivale a propriedade _root._xmouse do AS2)[/tr][tr]stageYposição na vertical em que o objeto foi clicado, em relação ao Stage (equivale a propriedade _root._ymouse do AS2)[/tr][tr]targeté a instancia do objeto que ativou o evento, nem sempre ela será o mesmo objeto do qual o listener foi adicionado, para isso use o currentTarget[/tr][/table]
Faça o teste abaixo(lembrando de criar um botão com o nome botao_btn):
ACTIONSCRIPT
function onClick(event:MouseEvent):void {
trace("o mouse esta pressionado? " + event.buttonDown);
trace("a tecla CTRL esta pressionada? " + event.ctrlKey);
trace("a tecla SHIFT esta pressionada? " + event.shiftKey);
trace("a tecla ALT esta pressionada? " + event. altKey);
trace("objeto que possui o listener:" + event.currentTarget.name);
trace("posição X em relação ao objeto: " + event.localX);
trace("posição Y em relação ao objeto: " + event.localY);
trace("posição X em relação ao Stage: " + event.stageX);
trace("posição Y em relação ao Stage: " + event.stageY);
trace("objeto que ativou o evento:" +event.target.name);
}
botao_btn.addEventListener("click", onClick);
percebeu as vantagens do uso de listener no AS3? com o AS2 você também teria acesso a algumas dessas propriedades, mas não de forma tão estruturada e de fácil acesso como esta acima, como eu disse cada evento retornará um objeto com propriedades diferente, consulte o Help do flash ( F1 /applications/core/interface/imageproxy/imageproxy.php?img=http://forum.imasters.com.br/public/style_emoticons/default/smile.gif&key=15294d64c22e9e9c4ae0bf82a62ec27d13f27d6ba7078a5f7982077798029364" alt="Imagem Postada" /> ) para ver detalhado cada um deles A diferença entre currentTarget e target, será mostrada mais abaixo
Usando o this no Actions Script 3
A palavra chave this, no AS2 fazia referencia ao objeto onde se encontrava a função, exemplo:
function mostraThis(){ trace(this._name); // saida: "botao"}botao.onPress = mostraThis;Com isso você poderia manipular mais de um objeto com o mesmo código:
function mostraThis(){ this._x = 300; this._y = 300; trace(this.name); // saída: "botao1" ou "botao2"(o que for clicado)}botao1.onPress = mostraThis;botao2.onPress = mostraThis;
Porem, no AS3 as coisas mudaram, o this, quando usado como no exemplo acima, fará referencia a time-line do objeto onde esta a função, e não mais a ele próprio.
function mostraThis (event:MouseEvent) { trace(this) //saida [object MainTimeline]}botao1.addEventListener(MouseEvent.CLICK,mostraThis );botao2.addEventListener(MouseEvent.CLICK,mostraThis );
No caso acima o MainTimeline se refere a time-line principal(onde estava a função),
para utilizar o this como era usado no AS2, você deve usar a propriedade .currentTarget do objeto passado como paramento na função
function mostraThis (event:MouseEvent) { event.currentTarget.x = 100 event.currentTarget.y = 100 trace(event.currentTarget.name) //saida: "botao1" ou "botao2"(o que for clicado)}botao1.addEventListener(MouseEvent.CLICK, mostraThis )botao2.addEventListener(MouseEvent.CLICK, mostraThis )O currentTarget será sempre o objeto do qual o listener foi adicionado, isso vale para qualquer evento adicionado a um objeto como onEnterFrame, mouseOver, etc. Existe outra propriedade chamada target, cuidado ao usa-la pois ela nem sempre se refere ao objeto que contem o evento, para entender melhor, veja o exemplo abaixo ('Diferença entre "rollOver and rollOut" e "mouseOver and mouseOut"')
Diferença entre "rollOver e rollOut" e "mouseOver e mouseOut"
Como o modo de exibição dos objetos na tela foi alterado no AS3, os eventos ligados ao mouse que manipulavam esses objetos também sofreram algumas mudanças, sobre os eventos mouseMove, mouseOver e mouseOut, eles não são mais ativados em qualquer parte do stage como era no AS2, são ativados apenas no objeto do qual o listener foi adicionado, com isso o mouseOver funcionará como o evento onRollOver(mas não exatamente como veremos em breve), sendo ativados quando o mouse passar por cima botão sendo executados ao mesmo tempo inclusive, veja o exemplo abaixo
// cria um sprite que será o botão var bolaAzul:Sprite = new Sprite();//desenha uma forma para ele, no caso abaixo um circulo bolaAzul.name = "bolaAzul_mc" bolaAzul.graphics.beginFill(0x0000FF);bolaAzul.graphics.drawCircle(100, 100, 50);// adiciona o botão na telaaddChild(bolaAzul);// com MOUSE_OVE e MOUSE_OUTbolaAzul.addEventListener(MouseEvent.MOUSE_OVER, eventoMouseOver);// com ROLL_OVER e ROLL_OUTbolaAzul.addEventListener(MouseEvent.ROLL_OVER, eventoRollOver);function eventoRollOver(evt:MouseEvent):void { trace("Roll Over em: " + evt.currentTarget.name);}function eventoMouseOver(evt:MouseEvent):void { trace("Mouse Over em: " + evt.currentTarget.name);}
O mesmo vale para os eventos mouseOut e MouseMove
Agora digamos que você precise usar esses eventos da maneira como eles funcionavam no AS2, sendo ativados em todo o palco, para isso você deverá adicionar o listener ao objeto Stage.
exemplo, veja como usar o MouseMove como era usado no AS2
//essa variavel será apenas um contador, para vermos a saidavar i:int = 0// adiciona o listener ao Stagestage.addEventListener(MouseEvent.MOUSE_MOVE, conta);function conta(evt:MouseEvent):void { i++ trace("contador: " +i);}
Como vimos acima os eventos RollOver e MouseOver, RollOut e MouseOut fazem a quase a mesma coisa, a diferença esta no alvo que ativou o evento
teste o exemplo abaixo que você entenderá melhor
// cria um contêinervar todosBotoes:Sprite = new Sprite();todosBotoes.name = "todosBotoes";// cria 2 sprites esses serão a área do “todosBotoes”var bolaAzul:Sprite = new Sprite();var bolaVerde:Sprite = new Sprite();bolaAzul.name ="bolaAzul" bolaVerde.name = "bolaVerde"bolaAzul.graphics.beginFill(0x0000FF);bolaAzul.graphics.drawCircle(100, 100, 50);bolaVerde.graphics.beginFill(0x00FF00);bolaVerde.graphics.drawCircle(300, 100, 50);// adiciona a telatodosBotoes.addChild(bolaAzul);todosBotoes.addChild(bolaVerde);addChild(todosBotoes);// teste 1º com os eventos ROLL_OVER e ROLL_OUT, e veja a saída no painel output// depois comente essas 2 linha e dêscomente as linha após delas com MOUSE_OVE e MOUSE_OUT// e veja a diferença // com ROLL_OVER e ROLL_OUTtodosBotoes.addEventListener(MouseEvent.ROLL_OVER, over);todosBotoes.addEventListener(MouseEvent.ROLL_OUT, out);// com MOUSE_OVE e MOUSE_OUT//todosBotoes.addEventListener(MouseEvent.MOUSE_OVER, over);//todosBotoes.addEventListener(MouseEvent.MOUSE_OUT, out);function over(evt:MouseEvent):void { trace("over: " + evt.target.name);}function out(evt:MouseEvent):void { trace("out: " + evt.target.name);}
Quando se usa o evento RollOver e RollOut o target, ou seja, o objeto que chamou a função, se refere ao próprio objeto em que o listener foi adicionado, nesse caso o objeto todosBotoes, já nos eventos MouseOver e MouseOut o target se refere ao objeto dentro de todosBotoes que o mouse passou por cima.
Caso você queria utilizar os eventos MouseOver e MouseOut e fazer referencia ao objeto todosBotoes, use a propriedade "evt.currentTarget" ou invés de "evt.target"
Simulando o onReleaseOutside
O evento onReleaseOutside foi retirado do actionScript 3, então vamos fazer um "ajuste técnico" para simular esse evento.
Ele consiste em aplicar um listener ao evento mouseUP do stage(do palco todo) assim que o mouse for pressionado no botão, nesse mouseUP devemos verificar se o mouse esta sobre o mesmo botão que foi pressionado (o que resultaria num Release) ou se ele não estava sobre esse botão(resultando no ReleaseOutside)
exemplo:
// cria uma bola que será o botãovar circle:Sprite = new Sprite();circle.graphics.beginFill(0xFF0000);circle.graphics.drawCircle(200, 200, 50);addChild(circle);circle.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);function mouseDown(event:MouseEvent):void { //esse listener irá aguardar o mouseUP am qualquer lugar do documento (Stage) stage.addEventListener(MouseEvent.MOUSE_UP, mouseUp);}function mouseUp(event:MouseEvent):void { if (event.target == circle){ // o codigo abaixo será executado no Release do botão trace('onRelease') }else{ // o codigo abaixo será executado no onReleaseOutside do botão trace('onReleaseOutside') } //remove o listener mouseUP stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUp);}
Finalmente temos DoubleClick
Um evento que fazia falta a um bom tempo no ActionScript é o duplo-click, finalmente o pessoal da Adobe resolveu esse problema adicionando esse evento ao AS3, um detalhe que você não deve esquecer é setar como true a propriedade doubleClickEnabled, caso contrario não irá funcionar.
veja um exemplo dele:
// cria uma bola que será o botãovar circle:Sprite = new Sprite();circle.graphics.beginFill(0xFF0000);circle.graphics.drawCircle(200, 200, 50);addChild(circle);//você deve ativa essa propriedade para usar o duplo-clickcircle.doubleClickEnabled = truecircle.addEventListener(MouseEvent.DOUBLE_CLICK, onDobleClick);function onDobleClick(event:MouseEvent):void { trace("duplo-click");}
Porem existe um detalhe que pode prejudicar sua aplicação caso você queria atribuir a um botão uma ação no evento Click e outra ação no evento DobleClick do mesmo botão
Faça o teste abaixo dando um duplo-click no botão
// cria uma bola que será o botãovar circle:Sprite = new Sprite();circle.graphics.beginFill(0xFF0000);circle.graphics.drawCircle(200, 200, 50);addChild(circle);circle.doubleClickEnabled = truecircle.addEventListener(MouseEvent.DOUBLE_CLICK, onDobleClick);circle.addEventListener(MouseEvent.CLICK, onClick);function onDobleClick(event:MouseEvent):void { trace("duplo-click");}function onClick(event:MouseEvent):void { trace("click");}
a saída será
****
click
doble click
Ou seja ele executou o evento click primeiro clique, e no segundo clique o DobleClick, quando o "correto" seria executar apenas o duplo-click.
Podemos resolver esse "probleminha" de maneira simples
veja:
var isDobleClick:Boolean;var espera:Timer;// cria uma bola que será o botãovar bolaAzul:Sprite = new Sprite();bolaAzul.graphics.beginFill(0x0000FF);bolaAzul.graphics.drawCircle(100, 100, 50);// adiciona a telaaddChild(bolaAzul);bolaAzul.doubleClickEnabled = true;bolaAzul.addEventListener(MouseEvent.CLICK, onClick);bolaAzul.addEventListener(MouseEvent.DOUBLE_CLICK, onDobleClick);function onClick(event:MouseEvent):void{ isDobleClick = false; espera = new Timer(200, 1); espera.addEventListener(TimerEvent.TIMER, controlaClick); espera.start(); if (event.ctrlKey) { isDobleClick = true; }}function onDobleClick(event:MouseEvent):void{ isDobleClick = true;}function controlaClick(event:TimerEvent):void{ if (isDobleClick == false) { trace("click"); } else { trace("doble click"); }}
Cadê o getURL?
Uma outra ação muito utilizada, é o getURL para abrir uma pagina html, ou executar um comando em javaScript, no AS3 ele foi trocado pelo comando navigateToURL.
veja como fazer:
function onclick(event:MouseEvent):void { // cria a string com o endereço(URL) var url:String = "http://www.imasters.com.br";'>[http://www.imasters.com.br"](http://www.imasters.com.br); //cria o objeto com o endereço(URL) a ser carregado var pagina:URLRequest = new URLRequest(url); //abre a pagina na mesma janela do navegador navigateToURL(pagina, "_self");}botao_btn.addEventListener("click", onclick);
Repare que o frame em que a pagina abrirá deve ser colocado no comando navigateToURL.
Também pode ser feito em uma única linha:
function onclick(event:MouseEvent):void { navigateToURL(new URLRequest("[http://www.imasters.com.br"](http://www.imasters.com.br)), "_self");}botao_btn.addEventListener("click", onclick);
se fosse um comando javascript
function onclickevent:MouseEvent):void { // cria a string com o javascript var js:String = "java script:alert('ola!');"; //cria o objeto com o comando var pagina:URLRequest = new URLRequest(js); //abre a pagina na mesma janela do navegador navigateToURL(pagina, "_self");}botao_btn.addEventListener("click", onclick);
Carregamento de imagens ou swf externos
Agora não tem mais o loadMovie(), para carregar swfs/imagens use a classe Loader
Comentei o codigo linha por linha para ficar mais fácil
//cria o objeto que carregarávar carregador:Loader = new Loader();//inicia o carregamentocarregador.load(new URLRequest("preview.swf"));//adiciona o swf ao palcoaddChild(carregador);//posiciona no lugar corretocarregador.x = 10;carregador.y = 10;
Para carregar dentro de um movieClip especifico que esteja no palco use a função addChild();
//adiciona o swf carregado no movieClip chamado "holder_mc" que já está no palcoholder_mc.addChild(carregador);Cadê o attachmovie e o createEmptyMovieClip?
Tanto o attachmovie quando o createEmptyMovieClip foram removidos no AS3, a sintaxe para criar um movieClip vazio agora será esta:
var objeto_mc:MovieClip = new MovieClip ()É a mesma sintaxe que se usa para instanciar um objeto, e é isso mesmo que você fez, criou um novo objeto instanciado da classe MovieClip, porém após cri-lo ele ainda não foiadicionado ao palco, para fazer-lo use o comando addChild()
addChild(movie_mc)Ok, você adicionou ele mas não aparece nada, faltou desenhar a forma do movieClip,usaremos aqui as novas funções de desenho, alem das funções que ja existiam para desenho (lineTo() e curveTo() ), agora temos algumas funções que ja desenham uma forma geométrica.veja como criar um criculo azul dinamicamente
// cria o movieClipvar objeto_mc:MovieClip = new MovieClip ()// desenha um criculo neleobjeto_mc.graphics.beginFill(0x0000FF);objeto_mc.graphics.drawCircle(100, 100, 50);//adiciona o mc na telaaddChild(movie_mc)
você pode alterar as propriedades desse movieClip tanto antes como depois de adiciona-lo ao palco
// cria o movieClipvar objeto_mc:MovieClip = new MovieClip ()// desenha um criculo neleobjeto_mc.graphics.beginFill(0x0000FF);objeto_mc.graphics.drawCircle(0, 0, 50);//altera a posição antes de adicionar na telaobjeto_mc.y=50//adiciona o mc na telaaddChild(movie_mc)//altera a posição depois de adicionar na telaobjeto_mc.x=200
Já o attachmovie segue o mesmo principio de antes, você continua tento que marcar na biblioteca a opção linkage do symbolo que será "athachado", veja a caixa baixo:
/applications/core/interface/imageproxy/imageproxy.php?img=http://www.ederfortunato.com/forum/linkage.jpg&key=46ee73f82ae90d29e98769e53ae351dd562fa4b82e56fefa30ff2768f078d3e9" alt="Imagem Postada" />
Para adiciona-lo a tela você deve fazer do mesmo modo mostrado acima, mas a classe usada para instanciar o objeto deverá ser o nome que você determinou no linkage do símbolo na biblioteca
Exemplo, após criar um símbolo no flash, vá a biblioteca clique com o botão direito do mouse nesse símbolo, e selecione a opção linkage, e escreva no campo linkage de "TesteMC", clique em OK
Será exibida uma mensagem perguntando se você deseja que o flash crie uma classe para associar esse movieClip, clique em OK
Esse símbolo agora será tratado como uma classe , para athacha-lo no palco agora basta instancia-lo
var novo_mc:TesteMC = new TesteMC()addChild(novo_mc)
Vamos supor que você precisa athachar esse movieCLip no palco, a partir de uma string com o nome dele, como era feito no AS2, veja como fazer:
//a partir da string "TesteMC" será criada uma classevar movieClipClase:Class = getDefinitionByName("TesteMC") as Class;// instanciando objetovar novo_mc:DisplayObject = new movieClipClase();//adicionando o objeto no palcoaddChild(novo_mc);
Sprite e SimpleButton
Uma coisa bem sensata que fizeram no AS3 foi desmembrar a classe movieClip, agora foram criadas mais 2 subclasses da classes a partir dela MovieClip (na verdade existem outras), são elas Sprite e SimpleButton.
Sprite: É a classe mais básica para criar um objeto visual ou contêiner (usado para conter outros tipos de objetos visuais), ela não possui time-line com um MovieClip, então é mais indicada para substituir a MovieClip fazer desenhos dinâmicos, por ser mais leve.
Um exemplo simples do uso dela
public function criaBola(e:MouseEvent):void { var sp:MovieClip = new MovieClip(); sp.graphics.beginFill(Math.round(Math.random() * 0xffffff)); sp.graphics.drawCircle(e.stageX, e.stageY,Math.round( Math.random() * 20)); addChild(sp)}stage.addEventListener(MouseEvent.MOUSE_MOVE, criaBola);
SimpleButton: É a classe usada para manipulação de botões, ao se criar um botão no flash criando um simbolo do tipo "button", é um objeto dessa classe que será criado, então você pode usar essa mesma classe para manipula-lo, usando as propriedades upState, downState e overState, é possivel editar em tempo de executão os estados Up, Down e Over do botão.
veja o exemplo abaixo de como criar uma botão e definir os seus estados(Up, Down e Over) tudo isso dinamicamente.
// cria 3 formas na tela, uma de cada cor e na mesma posiçãovar bolaAzul:Sprite = criaBola(0x0000FF, 50, 50, 25);var bolaVerde:Sprite = criaBola(0x00FF00, 50, 50, 25);var bolaAmarela:Sprite = criaBola(0xFFFF00, 50, 50, 25);// instancia um objeto da classe SimpleButtonvar botao:SimpleButton = new SimpleButton();// adiciona cada forma a um estado do botão botao.upState = bolaAzul;botao.downState = bolaVerde;botao.overState = bolaAmarela;// essa propriedade sera a area de hit do botão,// usaremos um das formas acima botao.hitTestState = bolaAzul;// adiciona no palco o botãoaddChild(botao);// função para criar os circulos usados no botãopublic function criaBola(cor:int, x:int, y:int, rad:int):Sprite { var sp:Sprite = new Sprite(); sp.graphics.beginFill(cor); sp.graphics.drawCircle(x, y, rad); return sp;}Adicionando comandos a um frame (addFrameScript)
Essa é uma função não documentada no AS3, com ela você tem a possibilidade de adicionar um código qualquer, que será executado quando o movieClip chegar num frame especificado.
a sintaxe dele é esta:
MovieClip.addFrameScript(frame:int, method:Function, [frame:int, method:Function...]):void;Sempre passando os parâmetros aos pares, numero do frame + função a ser executada
Exemplo de uso:
crie um arquivo .AS chamado "FuncaoFrames.as", com os seguinte código:
package { import flash.display.MovieClip; public class FuncaoFrames extends MovieClip { public function FuncaoFrames(){ addFrameScript(2, onFrame3, 5, onFrame3); } public function onFrame3():void { trace("você esta no frame 3: "+currentFrame); } public function onFrame6():void { trace("você esta no frame 6: "+currentFrame); } }}Salve essa classe na mesma pasta que o seu arquivo .FLA, nesse mesmo arquivo(o .FLA) no painel de propriedades tem um campo de texto chamado "Document classe "(esse campo não existe nos documentos feitos com AS2):
/applications/core/interface/imageproxy/imageproxy.php?img=http://www.ederfortunato.com/forum/documentClass.jpg&key=0fa79e2820d268a09c1c80b0d14590e3ff9c58e89da8e84995a11164d304ca09" alt="Imagem Postada" />
nesse campo digite o nome da classe "FuncaoFrames.as" para associar a classe ao .FLA.
para remover uma função use o mesmo comando passando null no lugar da função:
addFrameScript(2, null);
Alterando o frame rate dinamicamente
Pois é pessoal agora é possível mudar a quantidade de frames por segundo em tempo de execução, os valores validos estão entre 0.01 e 1000
// para isso basta setar a propriedade frameRatestage.frameRate = 12;
Exibir a quantidade de memória utilizada
Para saber o quanto de memoria RAM(em bytes) seu filme esta usando enquanto roda use a propriedade System.totalMemory, aproveitando vou colocar como usar o onEnterFrame
function onEnter(event:flash.events.Event ) { //Mostra quando de memória esta sendo consumida no momento trace(System.totalMemory);}addEventListener(flash.events.Event.ENTER_FRAME , onEnter);
Carregando variáveis de um arquivo txt
A classe LoadVars deu lugar para a URLLoader que também é usada para carregar arquivos XML, mas não para manipulação deles, para isso ainda existe a classe XML
Um exemplo de carregamento de txt:
Crie um arquivo texto com o seguinte conteúdo
nome=maria&idade=25
e salve como "arquivo.txt", na mesma pasta onde esta o seu .FLA
o código para carregar é esse
//cria o objeto com o endereço(URL) a ser carregadovar endereco:URLRequest = new URLRequest("arquivo.txt")//cria o objeto que carregarávar loader:URLLoader = new URLLoader();//Específica o tipo de dado a ser carregadoloader.dataFormat = URLLoaderDataFormat.VARIABLES;//Função a ser executada quando o carregamento acabarfunction loadCompleto(event:Event):void { trace(loader.data.nome); trace(loader.data.idade);}//adiciona a função ao Listenerloader.addEventListener(Event.COMPLETE, loadCompleto);//carrega o arquivo txtloader.load(endereco);
Carregando um arquivo XML
Para carregamento de XML, é preciso usar 2 classes, a URLLoader para carregar o arquivo e a XML para manipula-lo, na XML aconteceram algumas modificações, no modo de acessar os nós, agora é preciso utilizar o nome de cada nó, e não mais childNodes, a propriedade ignoreWhite(que agora é ignoreWhitespace), já vem por default habilitada (e já não era hora)
//cria o objeto com o endereço(URL) a ser carregadovar endereco:URLRequest = new URLRequest("agenda.xml")//cria o objeto que carregarávar loader:URLLoader = new URLLoader();function onComplete(event:Event) { var agenda = new XML(event.target.data); var total = agenda.pessoa.length(); for (var i = 0; i < total; i++) { //os atributos dos nós são acessado com um "@" antes no nome trace('cod: ' + agenda.pessoa[i].@cod); //os valores do nós são acessado pelo próprio nome trace('nome: ' + agenda.pessoa.nome[i]); trace('fone: ' + agenda.pessoa.telefone[i]); trace('---------------------'); }}//adiciona a função ao Listenerloader.addEventListener(Event.COMPLETE, onComplete);//carrega o arquivo xmlloader.load(endereco);Usando o Laço for...in
Além do for...in agora existe uma nova forma de listar os dados de um array, é usando o for each, gostei muito desse comando, veja:
var itens:Array = new Array();itens[0] = 1;itens[1] = 2;itens[2] = 3;for each (var item:Object in itens){ trace(item);}
Usando FlashVars
no HTML não mudou nada, você só precisa passar as variaveis como se fosse uma url
<PARAM NAME=movie VALUE="teste.swf?nome=maria&idade=25">
e na tag embed
<EMBED SRC="teste.swf?nome=maria&idade=25" .......>
agora dentro do flash
//pega os dados que foram passadosvar paramObj:Object = LoaderInfo(this.root.loaderInfo).parameters;//instancia uma caixa de textovar caixa=new TextField()caixa.width = 500//pega os valors e insere na caixa de texto caixa.text = "nome: " + paramObj.nomecaixa.text += ", idade: " + paramObj.idade//adiciona a caixa de texto no palcoaddChild(caixa);
Desenhando com action script 3
A API usada para desenhar no flash ganhou algumas funções para facilitar a nossa vida, não temos mais que usar fórmulas e mais formulas para desenhar um círculo ou um quadrado com cantos arredondados, basta uma linha e pronto.
Um outro detalhe usado no código abaixo é a classe Sprite, pense nela como um movieClip usado apenas como contêiner para outros movieClips e objetos na tela, ela possui bem menos funções que a classe movieCLip, mas em compensação é mais leve, é perfeita para criar os desenhos dinamicos como no exemplo abaixo
var formas:Sprite = new Sprite();formas.graphics.beginFill(0x339999);// desenha um quadrado// os paramentros são:// drawRect(posição X, posição Y, largurar, altura)formas.graphics.drawRect(10, 100, 100, 50);// desenha um quadrado com cantos arredondados// os paramentros são:// drawRoundRect(posição X, posição Y, largurar, altura, arredondamento na largura, arredondamento na altura)formas.graphics.drawRoundRect(150, 100, 100, 50, 20, 20);// desenha um circulo// os paramentros são:// drawCircle(posição X, posição Y, raio do circulo)formas.graphics.drawCircle(300, 125, 25)// desenha uma elipse// os paramentros são:// drawEllipse(posição X, posição Y, largurar, altura)formas.graphics.drawEllipse(350, 100, 100, 50)formas.graphics.endFill();addChild(formas);
Criando um Preloader simples
Agora existe uma classe específica para carregar arquivos .SWF, .JPG, .PNG ou .GIF (de adeus a MovieClipLoader)
Nesse exemplo estou carregando dentro de um movieClip chamado holder_mc
//cria o objeto com o endereço(URL) a ser carregadovar endereco:URLRequest = new URLRequest("filme.swf");//cria o objeto que carregarávar carregador:Loader = new Loader();//função a ser executada enquado carrega a swffunction onProgress(event:ProgressEvent):void { var percentagem:Number = event.bytesLoaded / event.bytesTotal; percentagem = Math.round( percentagem * 100); trace("Carregamento em: " + percentagem + "%");}//função a ser executada no final do arregamentofunction onComplete(event:Event):void { //muda a posição do swf carregado var mc = event.target.content mc.x = 100 mc.y = 100 trace("carregou")}//adiciona os ouvintes ao objeto carregadorcarregador.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);carregador.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);// inicia o carregamentocarregador.load(endereco);//adiciona o swf carregado no movieClip que ja está no palcoholder_mc.addChild(carregador);COmo fazer duplicateMovieClip();
?????
eh o mesmo jeito do As2 ?
help plz
:grin:
Finalmente temos constantes
sim agora elas são reais, não tem mais aquele negocio de declarar a variável e “fingir” que ela é uma constante
const ALTURA_MAXIMA:Number = 900;ALTURA_MAXIMA = 10; // Aqui irá acusar um erroé um convenção em qualquer linguagem de programação declarar as constantes com caixa alta(letras maiúsculas)