ENG - LROCHA.com
Transcrição
ENG - LROCHA.com
· \(Vvvvv,eng.com.br f .--, j \ <' Levei 3 TION SCRIPT p a r t i cip a nte: instruto r cer Lfi c a do: có d i go da t;jrma. realiza ção: a i ENG ACTION SCRIPT 3 - LEVEL 3 www.eng.c om.br ,"-. AUTH ORlZED Adob. , Indice Módulo 1 - Introdução Pré-requisitos ................... . ECMAScript . ...................... Sintaxe ..... Case Sensitivity . Onde inserir seu código. Boas Práticas . '",: Módulo 2 - Programação Orientada a Objetos Oque é um obje to 7 Por que objetos 7 ................ . OOP x Procedura l (estruturada ) ......... .. ... .. . Entendendo uma Classe Propriedades ... Escopo de variáveis .... Métodos . Construtor .. Módu lo 3 - Operadores wi th ..... protected .. internal super continue sWltch case default break 7 [condltloral) Módu lo 4 . Funçoes Funções acessadas em pacotes Funções globais Funções an lnhi)dns Funções err nível de arquIvo Funções recurs ivas Módulo .... ....._....... .. 02 ...... 02 .. ...... 02 ....... 03 . ....... 04 ........ 04 ....... !E ... !E ...... 07 ...... 07 .. 08 . ...... 08 ..... 08 ... CE .... 12 .............. 13 .... 13 14 14 15 1J 15 16 16 18 19 20 .20 20 Disparando um Evento Acessando o obleto via proprredade target Acessando oobjelo viapropriedade current Target Custom Event Estendendo uma classe de evento Módulo 6 - Classe Shape Objero Triangulo Objeto Circulo Módulo 7 - Classe arguments arguments lengtll arguments callee Modulo 8 . Construrndo uma Classe Abstrata Classes abstratas e concretas Conceito Exemplo 23 24 .. Z5 27 31 32 34 34 ENG Módulo 9· Polimorfismo Conceito .. Exemplo Módulo 10 . Classe XMl e XMlDocument Objeto XML Lendo um XML externo 40 40 42 az Módulo 11 . Classe Animator Convertendo ammação de timellne para XMl Classe Anirrator e Classe MotlonEvent 47 48 Módulo 12 . Animação com ActionScr lpt Programando uma Animação Ammação baseada na frame rate Alterando a frame rate Animação baseada em tempo Conclusão 52 52 53 54 56 Módulo 13 . Detecçào de Collsao Detecçào de cOlisão baseada num pont o Detecção de coli são bôseada nLm obleto 58 59 Módulo 14 . Manipulando o Tec lado Clas se Keyboard Classe KeyboardEvent De tectando teclas pressionadas simultaneamente Módulo 15 . Exibindo Data e Hora Trazendo data e hora do servidor . . .... .... ... . Retornandodados do ob!eto Dateseparadamente . Recebendo o nome do mês edo dia da semana . Convertendo entre Otvi YHr\!:SM e Epoch Milliseconds . Módulo 16· Criando um Cursor de Mouse Aplicando máscara a um obleto Exibindo e escondendo ocursor de mouse .. Criando um cursor personalizado . Módulo 17 . Util izando Filtros Criando e aplicando Filtros Aplicando Filtro a um DisplayObject . Removendo um Filtro de um DIsplayObject. Classe BlurFilter . Classe DropShadowFilter . Classe ColorMatrixFi lter .. Módulo 18· Aplicando Fullscreen Alinhando oconteúdo do stage .. Alterando a exibição do stage . Definindo a Qualidade de exi bição do SVVF Retornando o tamanho do stage Aplicando FullScreen ao stage .. Módulo 19 . Acessando a Impressora Imprimindo como um VelOr ou Bitmap .. . Escolhendo entre impressão Horizontal ou Verti cal .. Detectando a possibilidade de Impressão . Imprimindo uma página ... ............. ...... 67 62 .. 53 65 E6 . .67 69 . 71 71 ... 72 .. 7S 76 .. 76 76 77 .. 78 .80 .80 .. 81 ...... ..... ..82 ... .. .82 ............ 88 .... 88 ..89 ... 89 EI\JG _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _A __ C_T_I_O_N ____ S C_RI_p_T __ __a__-_LE_V_EL_3 __ __ __ __ w__ r.. I Adobe Módulo 1 INTRODUÇÃO - Pré-requisitos - ECMAScript Sintaxe - Case Sensllivity . Onde inserir seu código - Boas Práticas 1iI .. EI\.IG INTRODUÇÃO PRÉ-REQUISITOS Para este curso são necessários conllecimentos em: Flash CS3 ActionScript 3 - Nível 2 ou possuir conhecimento equivalente. Conhecer a Programação Orienlada aObjetos e lógica de programação facilita o aprendizado neste curso. ACTIONSCRIPT 3 ActionScript 3.0 é uma linguagem de programação poderosa. orientada a objetos que significa uma etapa importanle na evolução das potencialidades do Flash Player A molivaçao que dirig e a ActionScript3.0 é criar uma linguagem servida de desenvolvimento rápido para conslrução de aplicações ricas para a Inlernet. que se transformaram uma parte essencia l da experiência na web . Versões antigas da ActionScript ofereceram o poder e a fl exibilidade requeridos criando experiên cias ünicas. OActionScript 3.0 promove agora avanços na linguagem. fornecendo um desempenho soberbo e a facilidade do desenvolvimenlo para criar aplicações altamente complexas. expansíveis e código tolalmente orienlado a objelos. Com ActionScripl 3.0. os colaboradores podem conseguir a produtividade e o desempenho exce lenles com índice eap li cações que alvejam o Flash Player. ECMASCRIPT AclionScript 3.0 é baseado no ECMAScript, a linguagem de programação de padrão internacional para códigos ActionScripl 3.0 é compilado com a especi1icação da linguagem ECMAScripl, terceira edição (ECMA-262) Contém também a funcionalidade baseada em trabalho na ediçao 4 de ECMAS cript, ocorrendo dentro do escopo dos padrões ECMA. ,. SINTAXE Assim como na linguagem portuguesa e outras li nguagens. os discursos são seqüências lineares de mor1emas e palavras. Obviamente. as palavras não se alinham no discurso ao acaso. Exislem regras para ordená-Ias de modo que o di scurso faça sentido. A sintaxe ocupa de estudar as palavras agrupadas ,;" em segmentos que cumprem funções específicas no discurso eas relações enlre os segmentos. 00 . E 1\.1G Na ActionScript temos uma série de concordâncias para que sejam elaboradas frases correlamenle afim de que sejam geradas linhas de código. Por exemplo. através de ponlos .. .... acessamos método s. propriedades. evenlos eobjelos. Disculiremos so bre a sinlaxe da AclionScripl ao longo desse curso. bem como nos cursos mais avançados para possamos formar frases melhores elaboradas. CASE SENSITIVITY AAclíonScript não permite que um objefo seja chamado com alterações em maiúsculas e minúsculas. Ouando você escreve AclionScript para o Flash Player 7 em diante. seu código é sensivel. Islo significa que as variáveis com capilalização ligeiramente diferente estão consideradas diferent es de si. Oseguinfe código de AclionScripl exibe isso: II uso mixado de capitalização var fi rstName :String "Leandro Amano"; 1/ use fotal de caixa baixa trace!firstname); // 112 0: Access of undefined property firstname. NOTA: Não é uma prática boa dilerenciar-se entre variáveis. usando um case diferente. Para uma boa prática. possuímo s uma condição que muitos programadores adotam: Para variáveis. palavras começam com caixa baixa. ou caraclere "_". ou '$" para caracleres seguinles é permitido se usar caracleres não acentuados. números, e $. Palavras compostas como firstName, tem o primeiro caraclere a parlir da segunda palavra. sua capitalização em caixa alia. Para nomeação de constanles. disculidas posteriormente. capitalização em caixa alIa. Para nomeação de classes, o primeiro caraclere de estar em caixa alia. os seguinles possuem a mesma convenção de variáveis comuns. Para mais detalhe, consulte seu instrutor. ENG ONDE INSERIR SEU CÓDIGO Seu código "deve" ser inserido em trames e arquivos de classe externos. BOAS PRÁTICAS Seguir as convenções de nomenclatura. Comentar seu código. .;'- . ' . Seguir as convenções de código Otimizações no código. Formatação da correta si ntaxe. Para mais detalhes. acesse: Q9Ql1Jml ENG ACTION SCRIPT :3 - LEVEL:3 www.eng.com .bf r I Adobe .. ' <'; Módu)o2 PROGRAMAÇÃO ORIENTADA AOBJETOS - O Que é um ob jeto? - Por Que objeto s? - OOP x Procedural (estruturada) - Ent endendo uma Classe Propri edades Escopo de variáveis Métodos Conslrutor ,', III ENG PROGRAMAÇÃO ORIENTADA AOBJETOS Este curso é locado ao início de desenvolvimento de aplicações Flash orientado aobjetos Ironicamente. usuários do Flash que são novos para programação orientada a objeto (OOP) são geralmente fami liarizados com muitos conceitos de orientação aobjeto. Sem saber seus nomes larmais. Este capítulo desvenda algumas das term inologias e Iraz mais programadores para acelerar conceitos da chave OOP Ainda serve como uma visão geral de alto nível de OOP em Flash para programadores experientes que estão lazendo sua primeira incursão dentro do desenvolvimento Flash o QUE É UM OBJETO? Um ob jeto é a repre sentaçao de uma entidade em um sistema. Resumindo. tudo são objetos. No Ftash existe uma série de objetos prontos que facilitam o desenvolvimento e tem aspectos condizentesao objeto. Com certeza. não encontraremos nenhum campo de texlo executando um play. ou um MovieC lip exibindo um texto. Isso porqueobjetos contém caracteristicas retativas ao próprio ob jeto. Se pensarmos em pessoas, elas podem falar. andar. voar não seria uma característica do objeto pessoa. Um objeto então se resume em suas caracterí sticas e no que pode executar. POR QUE OBJETOS? A idéia de OOP (Oriented Object Programming) é modelar um sistema baseado em sistemas, o que representa maior adapta ção. Cada objeto deve ser auto-explicativo e lácil de entender. Mas qual o conceito de modetagem? Isso simptesmente se retere em como o sistema é desenhado. um sistema desenhado em OOP se relere auma aplicação onde cada unidade possui características e comportamentos relacionados ao objeto Imagine que você pode mudar características de cada ser vivo na Terra:-"· Porém, cada ser vivo tem suas particularidades e coisas em comum Por exemplo. todos os seres vivos respiram, logo poderíamos ler um objeto de nome SerVivo. pessoas são seres vivos? Sim l Então dizemos ,..;'! - ' - - - ' :',';' . ENG pessoa estende o objeto se r vivo. Essa definição pod ena ser ainda mais bem dividida se colocássemos um objelo mamifero entre pessoa e ser VI VO Pensando assim teríamos um sis tema bem dividido o que apresentaria menos redundância de código e menos manutenção. caso precisássemos trocar apenas um dos objetos OOP X PROCEDURAL (ESTRUTURADA) OOP foi resumido nas linhas acima eestudaremos este assunto ao longo desse curso. bem como nos posteriores aeste Linguagem eslruturada nao é um lermo conheCido por lodos. mas aplicado por aqueles que la desenvolviam no Flash sem a ullllzação da OOP Resumindo linguagem estruturada (procedural). é uma linguagem baseada em procedimentos lunções Para esclarecer bem a diferença enlre ambos. imagine uma galeria de lolos. Teríamos minimamente os seguintes itens. - Foto Pequena - Folo Grande - Botão de Navegação - Barra de Progresso para os devido s Pré-carregamentos Galeria com o deVido Eleito de TranSições Em OOP diVidiríamos cada um dos objetos em suas devidas classes. o que indica que. caso qUiséssemos reutilizar agaleria e trocar (ou adaptar) qualquer um dos elementos. poderíamos simplesmente editar a classe em questão ou eslende-Ia (herança. discullremo s mais tarde). Em linguagem estrulurada nao leríamos que copiar o arquivo fonte ( fia) e adaptar cada uma das funções ao nosso LISO aluai . o que normalmente acaba em grande e tedioso re-trabalho. sem contar que qualquer alteração errada pode afetar lodo o reslo da aplicação. no caso. essa simples galeria. ENTENDENDO UMA CLASSE Uma apticação OOP deve ser Ião dividida quanto possível (encapsulamento), para que cada objelo haja independente dos outros. \.,... ... Imaginando uma casa. teríamos diversos componentes. como. número de .: .. ::. . salas. sistema de ar condicionado. sistema de aquecimento slstem(:flétrico. etc. ENG '-f_\"F_ , F Todos esses elemento s em conjunto devem formar uma casa. e o arquitelo (e os demais experts em cada assunto) é respof1sáve l pelo desenho de cada um dos sistemas. Se o arqui teto quer faze r uma nova casa. não é necessário recomeçar tudo novam ente. A maioria dos componentes da casa já estão pré-construídos. usando objetos pré-construído s a complexidade de construção de uma casa é altamente reduzida. Obj etos if1dividuai s pod em ser substituídos, sem que haja f1ecessidad e de reconstruir todo o sistema. PROPRIEDADES Uma classe pode COf1ter propriedades propriedades são características do objeto . ela deve conte r um tipo etambém um valo r. São também chamadas de variáveis de instân cia. var name:String; Defini ção de classe com propriedad es: class AdobeCou r se { l / propriedades va r course:S tring "Actio nScript 3 - Nivel ]"; "rar data : Da te ; var d ays :uin t ; l/mé todos ESCOPO OE VARIÁVEI S Quando se usa apalavra chave var dentro do bloco de uma classe, ela fi ca disponívet por todo o corpo da classe. quando se usa a mesma palavra chave dentro de btocos de funções ou loops. estas exi slem somente dentro do seu corpo, escopo. MÉTODOS '. São os comportamentos que o objeto pode executar. métodos também são chamados de funções Elas podem passar argumef1to s e retornar dados quando necessário. .. .::< . ,-. E 1\.16 l/nome do método, nome do argumento, tipo do argumento, tipo do retorno fun c tion setAltura(var altura:Number) :void ( altura = altura; Na classe: clas s Pessoa { l/propr iedades var olhos:Strlng; var _ altura:Number; var _ peso:Number; ! / mé t odos tunction se tAltura( a ltura:N umber ) :void altur a altu ra; = CONSTRUTOR Você deve criar um método que escreve a construção do objeto. este é chamado de mélodo construtor. O construtor tem o mesmo nome da classe. mantém. inclusive a mesma capitalização. class Pessoa ( l/propriedades var olhos:String; var altura :Number; var _peso: Number; l/con strutor function Pess oa(olhos:String, altura:Number, peso:Number) { olhos altura yeso = olhos; = altura; peso; ENG l/ mé todo s fun c tion se tAllura ( a ltur2. :Number) :void a1 tUl"êl aI tura; O o ,.' ENG ACT'ON SCR'PT :a - LEVEL:a www.eng.com.br , Adob, ,', Módulo3 OPERADORES - with - protected - internal - super - con ti nue - switch - case - default - break - ? (conditionat) II ENG OPERADORES WITH with (o bj ec t : Obj e ctl li s t a t e ment(s) Estabelece um obleto padrão para ser usado para execuçao de uma ou mais declarações. reduzindo potencialmenle a quanlidade de códigos que precisam ser escrilos o parâmelro objecttorna-se o contexto no qual as propriedades. variávei s e funções dos parâmetros na(s) declaraçao(ões) sao lidos Por exemplo se object fosse my _array. e duas das propriedades especificadas corno lenglh e conca!. essas propriedades são automallcamenle lidas como mv _arrav lenglh e my_array con cal Em outro exemplo. se object fo sse stale callfornia quaisquer ações ou decfaraçoes dentro da declaraçao wlth sao chamada s de dentro da instãncia california. Para achar o valor de um idenlificador no parâmetro das declarações. o ActionScript começa no começo do escopo especificado por um ohjelo e procura pelo idenlilicador em cada nível do escopo em uma ordem especifica. o escopo usado pela declaração wilh para resolver identificadores começa com o primeiro it em na seguinte lista e continua até o último. o objeto especificado no parâmetro objeto na mais aproximada declaração with. Oobjeto especificado no parâmetro objeto na mais longínqua declaração with. O objeto de alivação (um objeto temporário que eautomalicamenle críado quando o scripl chama uma função que segura as variáveis locais chamadas na função) Oobjeto que conlém o script de execução atual. Oobjeto Global (objetos buill-in tais como Math eString) Para fixar uma variável dentro de uma declaração wilh. você deve ter declarado avariável fora da declaração with. ou deve entrar o caminho completo para a Timeline na qual você quer que avariável fique. Se você fixar uma variável em uma declaração wilh sem declara-Ia, adeclaração with irá procurar pelo valor de acordo com o escopo se avariável não .existir ainda, o novo valor será lixado na Timeline da declaração Que loi chamada. .., '"; -.. .. . ENG PROTECTED class c l assNa me{ protect ed var varName; prote cted cons t kName; protect ed function meth odNa me() II you r s tat e ment s he r e protected namespace nsName; Especifi ca que uma variáve l. constante. método ou namespace é disponível so ment e para a classe que a define e para quatquer subclasse daquela classe . A definição do protected em AclionScript 3.0 é sí mi lar a definição do AclionScript 2.0. exceto em acessos resl rilos ao protected em ambos tempo de com pilação e execução Por padrão umava ri áve l ou função está di sponível para qualquer invocador chamado no mesmo pacote. Use esta palavra-chave se você quer restringir acesso para uma variável ou fun ção Você pod e usar esta palavra-chave somente em defini ções de classe. não em definições de interface. Você não pode aplicar privado a uma classe. ou para qualquer oulro pacole de definições de nível A definição de prolecled em AclionScript 3D é mais reslritiva que aquelas prolegidas em linguagem de programação Java Em AclionScripl 3.0 protected limita o acesso eslritamente asubclasses. uma vez que em Java prolected ainda permite acesso para qua lq uer classe no mesmo pacote. Por exemplo, se uma classe chamada Base cont ém uma propri edade marcada como protecled. em ActionScript 3.0 somenle classes que estendem Base podem acessar a propriedade prot ec led. Em Java. qualquer classe no mesmo pacote como Base lem acesso pa ra a propriedade protegida mesmo se a classe não é uma subclasse de Base. INTERNAL .: . . .', A"- ....' . .... • . .>, ;:;;,_:' [internal] var varName [ i nternal] cons t kNam e [interna l] '", ":,.::,:,.< .i function fun c ti onNa me () II you r statements here [int e rna l] c l ass clas s Na me{ II yo ur s tat e ments h e re [ internal) namespace nsNa me -: *" t"!; ,, ENG Especifica que uma classe. variável, constante. ou função está disponível a qualquer invocador dentro do mesmo pacote. Classes. propri edades. e métodos pertencem ao acesso modificador internal por padrão. SUPER super ( [argl, ... , argN]) super.method([argl, ... , argNJ) Invoca a superclasse ou versão pai de um método ou construtor. Quando usada dent ro do corpo de uma classe construtora. a declaração super()invoca a versão da superclasse construtora. A invocação para a superclasse construtora deve ter o número correto de argumentos. Note que a superclasse construtora é sempre chamada. você tendo ou não chamada-a explicitamente. Se você não o fez. uma invocação sem argumento s é automaticamente inserida antes da primeira declaração dentro da subclasse do corpo conslrulor. Isto quer dizer que se você definir uma função conslrulora denlro de uma subclasse. e a subclasse construtora ter um ou mais argumentos, você deve chamar exp licitamente a superclasse construlora com o número correto de argumentos ou um erro irá ocorrer A invocação para a superclasse construtora. porém não precisa ser a primeira declaração em sua subclasse construtora. como era necessário em ActionScript 2.0 Quando usada no corpo de um método de uma instância. super deve ser usada com o operador ponto () para invocar a versão superclasse de um método e pode opcionalmente passar argum entos (arg .. argN) para o método da superclasse. Isso é útil para criar métodos de subclasse que não somente adicionam comportamento adicional a métodos de superclasse. mas também invocam os métodos de superc lasse para lazer seus comportamentos originais Você não pode usar a declaração super em um método estálico. CONTINUE continue [ labelJ Pula todas as declarações remane scentes no toop mais próximo e começa a próxima interação do loop como se o controle tivesse passado para o lim do loop normalmente. Adeclaração continua a não ter eleito lora de um loop. ..:1... ENG SWITCH switch (expression) { caseClause: [defaultClause:l Faz o control e de uma de muitas declaraçóes. dependendo do valor de uma expressão. Todas as dec larações trocadas deveriam incl uir um caso de default que irá executar se nenhuma das declaraçóes de caso eq uivaler-se com a expressão. Cada declaração case deveria acabar com uma declaração break. que previne um erro. Quando um caso fura, ele executa o código na próxima declaração case, mesmo apesar que aquele caso pode não equivaler-se a expressão de teste. CASE case jumpTarget: statements Define algo a execular na declaração swi tch. Se o valor da condição fo r igual a do parâmetro da expressão do switch usando equivalência estrita (= -=). o Flah Player executa as declarações nos parâmelros de declaração até encontrar uma declaração break ou o fim do switch. Se você usar a declaração case lora do switcll . ela produz um erro e o scripl não compila. Sempre termine os parâmetros da declaração com um break. Se você omitir o break dos parâmetros. ele continua executar com a próxima declaração case ao invés de sair do switch. DEFAULT ', . default: statements I'· Define um caso padrão para o swi tch. A declaração executa se o parâmetro da expressão do switch for diferente (usando equivalência estrita) qualquer dos parâmetros de expressão que seguem a palavra-chave case para uma declaração switch dada. Um switch não necessita de um default. Um default não tem que estar em último na lista. Se você usar um default fora do switch, elevai produzir um erro e não vai compilar. " ::.ff.l\.fY::.: ,'c :í, ENG BREAK break [l abe l] Aparece denlro de um loop (for. fOL .in, lar each.. in, dO.. while. or while) ou dentro de um bloco de declarações associadas com um case particular em um switcll. Guando usado em um loop, o break inslrui o Flash a pular o resto o do loop. parando sua ação e executando o código seguinte. Quando usado em um switch, o break instrui o Flash a pular o resto das declarações naquele bloco case e pula para a primeira declaração que segue o swi tch anexado. Em loops aninhados. o break so mente pula o reslo do loop imediato e não para uma séri e int ei ra de loops aninhados. Para parar uma série inteira de loops an inhados. use o label ou try.. catch .. linally. ?: (CONDlTtONAL) expressionl ? expression2 : expres s i on3 Avalia a expressionl. se o valor da expressionl lor verdadeiro, o resu ltado é o valor da expression2: caso contrário o resultado e o valor da expressionJ Operandos expression1Boolean - Uma expressão Que ava lia para um valor booleano: geralmenle uma expressão de comparação. como x < 5. expression2' - Um valor de qualquer tipo. expression3:* - Um valor de qualquer tipo. Resu ltado' - Ovalor da expression2 ou expressionJ ENG Módulo4 FUNÇÕES - Funções acessadas em pacotes - Funçôes globais - Fun ções aninhadas - Funções em nivel de arquIvo Funçóes recursivas ENG · .' FUNÇÕES . ;.' Tivemos a primeira parte de funções no módulo ActionScript 3 nível 1, agora temos sua continuidade nesle módulo. Lembrando que 1unções nada mais S30 que atalhos nomeados para um trecho de código , as convenções de nomenclalura devem seg uir a mesma especifi cação de uma variável. Se uma função é definida no mesmo script, esta pode ser chamada antes de ser definida: !/ActionScript 3.0 Language and Component s Reference var yNum:Num.i:;er = sqr(J); trace (yNum) ; II output: 9 function sqr( xNum:Number ) return Math.pow(xNum, 2); Urna função é semp re um objelo da classe Fun cliol1 , o que nos permi le usála também da maneira abaixo : va r fun cao:F unction m funct ion(para metro:Number) :Number re turn pa r a metro * para metro; var resultado:Number funcao(S); trace(resultado) ; FUNÇÕES ACESSADAS EM PACOTES Um arquivo externo ".as'· pode ser usado para criar arquivos de classe, corno já vimo s. Também serve para a criação de interlaces (assunto não discutido neste módulO) e também permite a criação de funçõesde uso externo. Em ActionScript3.0, podemos definir uma fun ção para que esta esteja disponível através de pacotes. como é o caso da função flash.net.navigateToURLO. Para criarmos um arquivo desse tipo , não podemos detinir a palavra chave class dentro do arquivo ·'.as", como segue abaixo: ENG l/arquivo de nome author as pack.age pacote{ public function author() :String return "Leandro Amano"; Repare que o arqUivo ·'author.as·· está dentro do pacote de nome "pacote" e o nome da função e o nome do arquivo são o mesmo. ambos respeitam a mesma capltallzaçao. sendo que neste caso. o primeiro caractere é sempre uma letra minúscula Já que este arquivo é uma função. não uma classe Para usar lmport pacote.author; trace( a uthor()); Para saber nlais. procure por package-levei funcl ions. FUNÇÕES GLOBAIS Funções globais são como funções em nivel de pacotes. porém estas estão no mesmo nivel de seu arquivo ".lIa", é o caso da função globattraceO que não precisa ser importada para que seja utilizada. l/arquivo de nome author.as, repare que o package está vazio package ( public function author() :String return "Leandro Ama no"; Para usar: trace (author ()); ;, ,,; EI\.IG FUNÇÕES ANINHADAS Conceituai mente é Lima função dentro de uma outra função, permitindo a criação de cód igo reutilizável exclusivo para uma determinada função. Eunction a(valor : Number) :String return b(valor) .toString(); function b('_"alor:Number) :Number retur n valor / 2; a var resulta do:S tring trac e(resultado) (25) ; i FUNÇÕES EM NíVEL DE ARQUIVO Quando criamos uma função fora do corpo do package. disponibilizamos uma função somente para aquele especifico arquivo, Neste tipo de uso não podemos atribuir afun çao nenhum acesso modificador. package public class So urc eFile { public function SourceFile() teste () i Eunct ion teste () : void . trace("Tes te!") • > ". ... , .;. •• ." I ....... ':::. \. . No arquivo de teste. var sourc eFile :SourceFile new SourceFi le() i FUNÇÕES RECURSIVAS É uma função Que chama ela mesma, Uma função recursiva deve sempre ter um fim, caso contrário o script é chamado infinitamente, gerando erro no com pi lador. Onúmero máximo pad rão de repetições de uma recu r:t5 é 1000. O .d/· .....-Wj ENG o exemplo abaixo é o clássico cálculo malemático fatorial de um número. f unction Eactorial(valor:Number ) :Number iE (valor < O) { return NaN; }else if (valor 1) ( return l}else{ return valo r * factoriallvalor-l); /1 3 * 2 * 1 var resultado:Numbe r factoria l trace (re s ultado) ; II 5 * 4 * 3 * 2 * 1 r esu ltado factorial(S); trace (r es ultado) ; (3) ; .., ENG www.eng.com.br , .ACT'ON SCR'PT <I - LEVEL <I Ad ob. MóduloS DISPARANDO UM EVENTO - Acessando o objeto via propri edade target Acessand o o objelo via propri edade currenlTargel . Custom Evenl Estendendo ullla classe de evento iii EI\.IG DISPARANDO UM EVENTO Eventos ocorrem o tempo todo em AclionScript. como vimos ao longo de todos os módulos, estes ocorrem em resposta a um clique de usuário, ao adicionar um objeto em uma display list. ao mover o mouse, ao fina lizar um ,Ore/oader de arquivo externo, etc. Esses evenlos são categorizados como buill-in evenls porque já foram definidos pelo próprio Flash Player. Nós como programadores também possuimo s a capacidade de criar novos eventos. bem como disparar eventos já construídos no FlaSh Player para que possamos estender as funcionalidades de nossa ap li cação, para assi m ulitizar de maneira apropriada os conceitos da orientação a objeto em ActionScript 3.0. Todos os eventos nesta linguagem são definidos de modo padrão ob j .addEvent Lis tener(Cl asse DoSvento.EVENTO , l is tener) ; A arquitetura de eventos no Ac1ionScripl 3 é baseada no W3C Documenl Objecl Mode/ (DOM) Leve/ 3 Events Speci/icauon. di sponível na url hltp:/! ,vwW. w3. org/TR/DOM -Level-3- Evenls. Não esqueça Que sem pre que desejar remover um evento. você deve utilizar ob j .remove EventListene r (ClasseDoEvento.EV ENTO, listener) ; ACESSANDO OOBJETO VIA PROPRIEDADE TARGET Dentro de um /istener, afunção Que é determinada a ser executada quando o evento acontece. existem propriedades Que o evento trás consigo como. por exemp lo, a propriedade type , que indica o tipo do evento, a constante MouseEvenl.CLlCK retorna a string '·click". existe uma outra propriedade a propriedade target. esta retorna o objeto Que está executando a ação, que nem sempre é o objeto Que tem o /istener cadast rado. No exemplo abaixo quando clicamos no objeto azul. esle é rolacionado em 45 grau s, independente do /istener eslar cadastrado ao ob jeto intei ro. no caso o quadro negro que contém o quadro azul: import flash.display.Sprite; import fla s h .event s. Mo u seEvent; var quadro:Sprite = new Sprite(); quadro.graphics.beginFill(OxOOOOOO) ; ... _. :'.'"' ","c., • ENG quadro.graphics.drawRect(O, o, 100, 30); quadro.graphics.endFill() ; var quadrolnterno:S prite = new Sprite(); quadrolnterno.graphics.beginFill(OxOOOOFF) ; quadrolnterno . graphics . drawRectIO, O, 50, 30); quadro lnterno. graphics . endFill() ; addChild(quadro) ; quadro. addChild (quadrolnterno) ; quadro . x quadro.y 200; quadro.add EventListener(Mous e Eve nt.CLI CK , onC li ek; ; runeti o n onC liek (e:MouseEvent) :void e target.rotation = 45; ACESSANDO OOBJETO VIA PROPRIEDADE CURRENTIARGET Para acessar o objeto que estamos registrando ao lislener devemos usar oulra propriedade. a propriedade currentTarget, o mesmo exemplo anterior seguirá abaixo. mas repare que agora. independentemente de se clicar no objelo azu t, sempre será disparado o evento para o objeto inteiro. no caso o quadro import Elash.display.Sprite; import flash.events.MouseEvent; var quadro:Sprite = new Sprite(); quadro.graphics.beginFill (OxOOOOOO); quadro.graphies.drawRect(O, o, 100,30) ; quadr o.g raphies.endFill() ; 'lar quadrolnterno:Sprite = new Sprite(); quadrolnterno.graphics.beginFill(OxOOOOFF) ; quadrolnterno.graphics.drawRectIO, O, quadrolnt e rno.graphics.endFill() ; addChild(quadro) ; quadro. a'dclChi ld (quadrolnterno) ; 50, 30); ENG quadro.y quadro.x 200; quadr o.addEvent Listener(MouseEve nt. CLICK, onClickl; fun ction onCl i ck( e:MouseEvent) : vo id e .curr ent Target .rota ti o n = 45; CUSTOM EVENT Para disparar um evenlo personalizado. precisamos que nossa classe len ha herança com a classe Ev enIDispalcher de alguma forma. No exem plo abaixo vamos fazer com que a classe Boião lenha doi s evento s personalizados. Botão.CLlCADO e Bolão.ADICIONADO NO STAGE l/Classe Botao package com.l eandroama no. l ayout ( impor t f l ash.disp la y.Sprite ; import Elash.display.GradientType; impo rt Elash.events.2vent ; import flash.events.MouseEvent; public c l ass Bo tao ext e nds Sprite{ publi c s t at ic cons t CL I CADO = "clicado"; public static const ADICIONADO NO STAGE " adicionado na display list"; public Euncticn Botao () { graphics.beginGradientFill(GradientType.LINEAR, [O xFFOOOO, Ox OOOOFF), [1 00 , 10 01 , [O xOO , Ox FF] ); graphics.drawRect( - 50, O, 100,30); gra phi cs . e ndFill () ; bu tt o nMod e tru e; addEventListener (MouseEvent . CLICK, clickHandler) ; ENG add EventListe n e r{Event.ADDED TO STAG E , addHand Ier ); private function cl ickHandIer (e: : void dispatchEvent(new Mo us eEventIBotao.CLICADO» ; private Eunction addHandler(e:Event) :void dispatch Event(new Event(Botao.AD I CI ONADO_ NO STAGE»; arq uivo de teste: import com .l eandroamanc.layout .30tao; Import tlash.Events.Event; va r meuBo tdo:Botao meu30tao.x new Botdol); meuBotao .y =200; doClicar}; meuBotao.addEventListener(Botao ADICl ONADO_NO_STAGE , aoAd.lc ionar) ; addChild(meuBotao) ; function doClicar(e:Event) :vo i d ( trace("tipo:", e.type);//tipo: c li cado trace("al vo: ", e . curren t Target , "\n") ii /a l vo: [ob )ect Botao) functian aoAdicianarle:Event) :void trace("tipo:", e.type) i i/ tipo: a dicionado na disp la y li st trace("dlvo:", e.currentTarg e t, BOtdO) "\n");//aIvo: E 1\.16 ESTENDENDO UMA CLASSE DE EVENTO Neste exemplo entenderemos de maneira simplóna como fazer com que os eventos fiquem separados da classe Botão. IIClasse BotaoEvent package com.leandroamano.events { import flash.events.Event; public class BotaoEvent extends Event { punlic static const ADICICNADO NO ST,ll.GE "adIcionado na display listO; public function bubbles:Boolean = false, (type:String, cancelable:3001ean = false) super(type, bubbles, cancelable); i/Classe BotaoMouseEvent package com.leandroamano.events { import flash.events.MouseEvent; public class BotaoMouseEvent extends t'louseEvent { public static const CLICADO "clicado"; public functioo 30taoi'1ouseEveot (type: Str iog, bubbles: Boolean true, cancelable:Boolean = false) super (type, bubbles, cancelable); ENG l/Classe Bo taoSep a rad o package com .leandroa mano. la yo ut ( import fla s h .d i sp l ay .Sprite; import Elash . di s play.GradientType; import Elash.e ven ts.Event ; impor t Elash. events .HouseEvent; impot:t com. le androamano.events .BotaoEvent ; i mport com .leandroa man o . events. Botaot'louseSvent ; pubJic clas s BotaoSepat:ado extends Sprl t e{ pubIle sLatlc con st CLI CADO "c llcado". publlC stati c const ADICIONADO NO STAGE "adicionado na display 1 ist "; pUOllC EuncLlcn BotaoSeparado() [OxFFOOOO, OxOOOO FF1, [100, 100J, [OxOO, graphics.drawRect(-50, 0, Ox FFll; 100,30); graph i cs.endFill (); but ton.."'1ode true; add EventListener{MouseEvent .CLI CK, cl i ckHa ndl e r) ; addEve ntL istener(Event.ADDED_TO_ STAGE, addHa ndler); priva t e f un ct ion c li c kHandl er (e: MouseEvent) :vo id dispatchEvent(new BotaoMouseEve nt .CLICADO» ; private f un ction addHandler(e:Event) :vo id dispa t chEvent(new BotaoEve nt( BotaoEven t . ADlCIONADO NO_STAGE»; ENG No arquivo de teste: import com.leandroamano.layout.BotaoSeparado; import com.leandroamano.events.BotaoEvent; import com.leandroama no.e vents.BotaoMouse Event; var meuBotao:BotaoSeparado = new BotaoSeparado(); meu3 0tao.x = meuBotao.y =200; meuBotao. addEventListener CLICADO, aoClicar) ; meuBotao. adck'VentLi stener (BotaoEvent. . ADICIONACO_NO_ STAGE, aoAdicionarl; addChild(meuBotao) function :void { trace("tipo:", e.type); /It.ipo: clicado tl·C'. c e("alvo:", e. cu rren tTal·get, [obj ec t "\n");//alvo: BotaoSe parado) function aoAdiciona r (e:30taoE'/ent.) :'v'oid ( trace("tipo:", e.type); //tipo: ad icionado na display li s t. t.r ace l."alvo:", e.currentTarget, "\n") ;/la1vo: [ob ject BotaoSeparadol Um dispatchEvent não precisa estar necessariamente dentro de uma função utilizada como lislener , podemos também (ê o que fazemos na maioria das vezes) dispará-Ias dentro de uma função qualquer. . 'i-· · ENG www.eng.com.br ACT'ON SCR'PT 3 - LEVEL 3 Adobe Módulo 6 . CLASSE SHAPE - Objeto Triângulo ObJeto Círculo III ENG CLASSE SHAPE Elash.di s play.Shape; Essa classe permite Que criemos objetos visuais muito leves. Esses desenhos (contornos. preenchimentos) são criados através da classe Graphics. repre sentados pela propriedade graphi cs A classe Shape não suporta clique de Mouse como a classe Sprite e MovieC lip, por exemp lo, por este motivo ela ocupa muito menos memória que um objeto do tipo Sprite. A classe Shape não pode conter objetos dentro. já que não deriva da classe abstrata Di splayObjeclContainer. . impor t El as h . displa y .Shape ; var d ese nho:Shape = new S hape(); desenho.graphics.beginFill!Ox44FFFF) ; 90 , 50); desenho .g raphics.endFill () i a dd Child(de se nho) ; Éde boa utilidade deixar objetos derivados do tipo Shape para posterior uti lização: OBJETO TRIÂNGULO import Elash . display .S hape; function triangulo(x:Number, y:Nu mber, w:Number, h:Numbe r, cor:uint) :Shape ( var obj :Shape = new Shape(); ob j .graphics . beginFill( cor ) i obj .g raphi cs.moveTo(w/2, O) i obj .graphics. li neTo(w, h); ; • .. obj.graphi cs.l ine To(Q, h); obj.graphics.endFill() ; obj.x X i obj.y y; return obj; = var t:Shape OxFFOOOO) ; addChild(t) i tri a ngulo(lOO, 200 , 200, 2 00, . I Er\J6 triangulo{40 0, var t2:Shape 200, 200,100 , OxOOFFOO) ; addChild{t2) ; OBJETO CÍRCULO import flash.display.Shape; function circulo{x:Number, y:Number, raio:Number, cor:uint) :Shape { var ob j:Shape = new Shape{); obj . graphics.beginFill{cor); obj . graphics. dra."Circle (O, O, raio); obj . graphics . endFill () ; obj . graphics. endFi 11 () ; obj .x X; obj.y y; return obj; var c:S h ape = c irculo( 300, 300, 50, Ox990000) ; addChi ld (c); var c2:Shape = circulo(300, 100, 100, Ox000099); addChild (c2) ; Posteriormen te colocaremos esses códigos dentro de suas sugeridas classes. ENG www.e ng.com .br , ACT'ON SCR'PT :3 - LEVEL:3 Adobe .( .... •.• v- __ _ _.,.;_ ...... ......>;o. Módulo7 CLASSE ARGUMENTS - arguments.length - arguments.callee III ENG A classe arguments é usada para armazenar os argumentos de uma função, a propriedade caller do ActionScripl 2 foi removido nesta versão. ARGUMENTS.LENGTH l. .. Retorna o número de argumentos da função. . : ":':.. var no me:String; Eunc tion setValor(nome :Stringl :S tring r e turn arg umentsfarguments.length- lJ; n ome setVa lor("Leandro Amano"); trace(nome); i/Leandro Amano ARGUMENTS .GALlER Retorna a lunção que está atua tmente sendo executada. import Elash.disp l ay.Sprite; impor t Elash.events.MouseEvent; var guadro : Spri te = new Spritell; quadro.gr a phics.beginFi ll (Math . r an dom()*OxFFFFFFI; guad r o . graphics.drawRec t( O, O, 100, IDO!; quadro.graphics.endFill() ; quadro.addEvent Listener( Mou seEvent.CLI CK, o n Cl i c k) ; guadro.buttonMode t rue ; addChild(quadro) ; f unct i o n onC li ck(e:Mouse Event) :vo id e. currentTarget.x += 20; //Re move mos o list e ner dinami ca me nte a pós o primei ro c li que e.c u rrentTarget.removeEventListener(argument s [O] .type, a rguments.callee) ; Em ActionScript 3 é recomendado que se utilize o operador .. resl classe arguments. da O . ,l''''r---'''-J ENG Módulo 8 CONSTRUINDO UMA CLASSE ABSTRATA - Classes abstraias e co ncrelas - Conceito - Ex.empl o ENG CONSTRUINDO UMA CLASSE ABSTRATA CLASSES ABSTRATAS ECONCRETAS Uma classe abslrala é desenvolvida para representar entidades e conceilos abslralos. A classe abslrala é sempre uma superclasse que não possui inslâncias. Ela define um modelo (lempla/e) para uma lun cionalidade e fomece uma implementação incompleta - a parte genérica dessa funcionalidade - Que é compartil hada por um gru po de classes derivadas Cada uma das classes derivadas complela a luncionalidade da classe abslrata adi cionand o um comportamenlo específico . Uma classe abstraia normalmente pOSSUI mélodo s,ªbstratos Esses métodos são Imp lementados nas suas classes denvadas concrelas com o objetivo de delinír o comportamento específico. O mélodo abstraio define apenas a assinalura do mél odo e. portanto. não co ntém código Por outro lado. as classes concrelas Implementam todo s os seus mélodos e permitem a criação de instâncias. Uma classe concreta não possui métodos abstratos e. geralmente. quando utilizadas neste contexto, são classes derivadas de uma classe abstraia. CONCEITO Classes abstraias não exislem em AclionScripl 3D, o lermo correio seria classes de estilo abslrato. por convenção iremos chamá-Ias de classes abslratas. Um classe abslrala é uma classe Que não pode ser inslanciada direlamenle. nem conlém em seus mélodos a sua própria implemenlação. apenas nome. acesso modificador. parâmelros e lipo de retorno. essa classe abst rata Que contém mélodos abslrato s pode ler zero ou mais mélodos abstratos. Sua diferença para as interfaces é Que os métodos não precisam ser públicos e não precisam necessariamente ser sobrescrilo s em suas classes derivadas. Uma classe abslrata é sempre a classe super. de generalização. que pode derivar para n classes. Caso o usuário tente instanciar uma classe abslrala diretamente ou Qualquer um de seus métodos sem sobrescreve -los. devemos jogar um erro ao usuário. Esse tipo de classe é importantíssimo para o uso de pol imorfismo 0° ' : . t ENG No core display classes temos três classes de estilo abstrata, DisplayObjecl , InteracliveOb ject e Di splayObjeclConlainer A palavra-chave override será utilizada para so brescrevermos os métodos, e a palavra-chave final será usada quando quisermos que classes derivadas de uma classe abslrala não sobrescrevam seus método s Dois exemplos clássicos de Design Pallerns são o Faclory e o Template Method pallerns. EXEMPLO pack age { impOl·t. Elash. erl·ors. I llega lOpera t ionError ; public class AbstractPess oa { protected var y rof is sao : Stri ng; protected var public function AbstractPessoa ( ... args) if (args [01 ! this:' { throw ne\,; IllegalOperat i onErro r ("Error #2012: !'.bst ractPessoa$ class can n ot oe instantiated."); public function a nd ar ( ) :void { .: public function get profissao!) :String { throw nev' IllegalOpe rationError("Method mu s t be overrided. H ) ; return null; public function se t profissao(valor:String) :void thro ..., nev, Illega lOp era tionError("Method mu st b e overrided. return void; H ) ; .', EI\JG public Euncticn get hobby() :String ( throw new IllegalOperationError("Method must be overrided."); return null; public functicn set hobby(valor:String) :vo id ( throw ne" IllegaIOperationError("Method must be override d."); return void; packag e { public class Amano extends AbstractPessoa { public f u n ct i cn Bruno() ( super{t.hisi; ove rri de p ub lic function get profissao() :Strlng return _prof issao; override public function set profissa o(valor:Str ing) :void ( _ protissao = valor; return void; var amano:Ab stractPessca var proEissao:String "Instrutor Adobe"; trace(profissa o) ; = = ne w Amano(); amano.profissao = ENG POLIMORFISMO Conceito - Exem plo ENG ________________ A_CT_I_O_N __ ____ S C_RIPT ________ 3 -_L __ E_V __ E_L__ 3__ __ 1iI , ,.. I Adob. POLIMORFISMO CONCEITO Este conceito é baseado na idéia de que diferentes classes podem implementar o mesmo nome nos métodos, porém. com funcionalidades diferentes. Também poderíamos utilizar interfaces e suas implem entações utilizando recursos de casting para fazer uso do polimorfismo, Para aproveitamento dos assuntos aprendidos até aqui utitizaremos a herança eabstração para isso. EXEMPLO Segundo a id éia do ca pitulo anterior (Capítulo 8- Con struindo uma Classe Abst raIa) criaremos mai s dois objetos que estendem a classe AbstractPessoa. package { publi c c l ass ControlaPe ssoas ( publi c Eunction Cont ro l aPessoas() var pessoa s:Array - new Arraylnew Ama no() . new Politol) . new Venegas() I ; f or each (var i:* in pessoasl ( exe cuta li); pub li c fun ct ion : void pessoa . a nd ar() ; No frame de um arquivo .Ita: var contr ol:Contro laPessoas ne w Con trolaPessoas() ; o resu ltado no output é o chamado dos três diferentes métodos andar() de cada objeto. Não esqueça que para este uso necessitamos sobrescrever cada um dos métodos da classe super AbstractPessoa. Ficou fácil imptementar oO polimorfismo em AclionScript 3.0. O ENG Módulo 10 CLASSE XML EXMLDOCUMENT - Objelo XML - Lendo um XML externo ENG CLASSE XMl EXMLDOCUMENT OBJETOXML Desde o ActiollScrípt 1 (Flash Player 5) o Flash possui a capacidade de ler objetos XML externos, baseados no DOM (W3C Document Object Model) o padrão para interação com documentos XML Em AclionScript 10 a classe XML foi tolalmente modílicada, XM L é um tipo nativo do Flash. antigos métodos e propriedades para aleitura desses dados externos (firstChild chitdNodes. etc) se encontram agora na classe XMLDocument. localizada no pacote flash.xml . AAclionScript 10 implementa o padrão ECMAScript lar XML (E4X) que será di scutido po steriormente. I/Top Le v e I cIass XML va r xml : XML = c doe > ec ur so> Ac tionScript 3.0c/curso> cc ur so>Adobe Flex 3c/curso> ec ur so>Adobe Dreamweaver CS3</c u rso> <curso>Adobe Co l dFusion 8e/curso> </àoc>; LENDO UM XML EXTERNO Para a leitura de um XML externo utilizaremos uma leitura que arquivo externo comum como vimos no módulo ActionScript 3 nível 2. Dentro do evento Event.COMPLETE. trataremos o objeto lido como um XML Documenl. flash.ne t.URLLoader; import flash.net.URLRequest; import Elash.xml.XMLDocument; import fIash.events.Event; var l oader:URLLoader = new URLLo a der(); l oade r. add Ev entLi s t enerIEvent.COMPLETE. o n Co mpl e t e ) ; loader.Ioadlnew uRLRequest("xml_ex terno.xml")); f unct ion o nC omplete Ie: Event) : voi d var xm l:XML = ( XML(e. c urr e ntTarge t.data ); ENG CLASSE XMl EXMlDOCUMENT OBJETO XMl Desde o ActiollScript 1 (Flash Player 5) o Flash po ssui a capacidade de ler obj etos XML externos, baseados no DOM (W3C Document Object Model) o padrão para interação com docum entos XML. Em AclionScript 3. 0 a classe XML foi tota lmente modificada. XML é um tipo nativo do Flash. anti gos métodos e propriedad es para a leilura desses dados externos (firstC hild, chi ld Nodes, etc) se enco ntram ag ora na classe XMLDocument. lo calizada no pacote flash.xml. A ActionScript 3.0 imp lementa o pad rão ECMAScri pt for XML (E4X) que será di scutido po steri ormente. l/ T ap Le v eI c I ass XML va r xml:X ML = edoe > ec u rso>Ae ti o n Se r i pt 3.0e/curso> ec u rso>Adobe F Iex 3e/cu rso> <c u rso>Ad o b e Drea mweave r CS3e/c u rso> ce u rso>Ado b e Co l dFusi o n 8e/curso> </doc> ; LENDO UM XMl EXTERNO Para a leitura de um XM L externo utilizaremo s uma leitura que arq uivo externo comum como vimos no módulo ActionScript 3 nível 2. Dentro do evento EvenI.COMPLETE. tralaremos o objeto lido co mo um XMLDocumenl. i mp o rt f I as h.ne t . UR LLo ade r; import fI as h . net . URLReques t; impor t f la s h.xml .XMLDoe ument; impo rt fI as h . events . Event; var loader : UR LLo ad er = new URLLoader(); l oader.ad d EventL i s t e n e r (Eve n t . COM PLETE, o n Compl e te) ; l oad e r.l oad( ne w URLR e qu es t(" x ml externo . x ml-); f un c ti o n onComp l ete (e : Eve n t ) : vo id ( va r x ml: XML = XM L (e. e u rre n t Ta rg et . da t a ) ; ENG var xmlDoc:XMLDocument xmlDoc.ignoreWh ite = new XMLDocument(); true; = xm lDoc.parseXML(xml) ; var tamanho:uint = xm lDoc.firstChild.childNodes.lengt h; for(var i:uint = o· i<tamanho; i++) { Ií ActionScript 3.0 II Adobe Flex 3 I I p.d o be Dre a mweaver CS3 1/ Adobe ColdFusion 8 i xmlC<:x:. tü s tCl"lild .childNodes [i) . firstChild nodeValue ) ; l/Teste completo com disparo de evento packag e { impo rt fla s h . n e t.URLLoader; import fla s h . net.URLRequest; i mport fla s h.xml XML Document; import flash.events.Event ; import flash.event s .EventDispatcher; p u blic c l ass XMLExterno exte n ds EventDi s patcher{ public static c onst COMPLETO "comp l eto" ; private var loader:URLLoader; private var dados : Array; public fun c ti o n XMLExterno() loader = { n e w UR LLoad e r(); loader.addEventListener(Eve nt.COMPLETE, onComplet e ) ; dados ne"J Arra y () ; public function o ., . ENG loader.load(new URLRequestlurl)); private function onComplete(e:Event ) :void var xml: Xt'IL XMLle . c ur re ntTarget .da la) ; var xmlDoc·XMLDo cume nt new Xt-1LDocument () ; xmlDoc.ignoreWhJte - true; xmlDoc.parseXMLlxml) ; var tarnanhO:Ulnt ' xm 1 Doe. firstChild.ehilcL.'lcdes length; for(var i Ulnt. 0; l<Lamanho; _dados. push (xmlD:x:: . f irstChild. chilclNc:des [i) . f irstChi ld. ncdeValue) ; dispatchEvent . n ew Sve nt (XM LE xterno.COMPLSTO) I; publie functian get dados() :Array ( return _ dados; publie function set dados (v alor:Array) :void valor; IINO arquivo de teste impor t Elash.events.Event; var xm l :XMLExterno new ENG xml.addEventListener(XMLExterno.COMPLETO, onCompleto) ; xml.load("xml externo.xml"); functlon onCompleto(e:Event) :void { var dados:Array = e.currentTarget.dados as ,lI.rray; for(var i :uint trace( i, } } = O; iedados.length; i++} { ":", dados(i]); ENG '"a:i ACTION SCRIPT :3 - LEVEL:3 www.eng.com.br r.. . AUTHORI,Z ED Adobe Módulo '11 CLASSE ANIMATOR - Convertendo animação de timeline para XML - Classe Anlmator e Classe rvlotlonEvent iii ENG CLASSE ANIMATOR CONVERTENDO ANIMAÇÃO TIMELlNE PARA XML Para converter uma animação produzida em Timeline para XML devemos inicialmente selecionar lodos os frames que desejamos capturar. em seguida. vá até o mellu > commands > copy motion as xml. Também é possível exportar esse motion como um arquivo do tipo xml. neste caso devemos tralar a leitura dele como visto no capítulo anterior (Capítulo 10 - Classe XML e XMLDocument) . ., -!. ' Devemos saber Que esse tipo de comando funciona para lima única layer de cada vez. Help Get r','lore Commandr, ... P.lJn Cornm.3nd ... Export r'lotion xrvlL Imp,)rt rvlotion xr··1L Te$t in Apollo I i:J 'ta (.; 34 30.0 fps 1.1 s f.<I. Copie o objeto usado (MovieClip). Agora peça um novo arquivo, e cole-o no stage crie um novo layer de ActionScript, volte ao arquivo anterior, o qual contém aanimação peça o copy molion as XML, selecione novamente o novo arquivo lia. peça o painel de Aclions e cole o XML oobjeto XML não está armazenado em variável alguma. precisà[TIos fazer isso manualmenle. vamos pegar como exemplo. o código abaixo eassocia-lo a uma variável do Ilpo XML de nome moveShape xml var mo v eS h a pe_xml:XML = <Motion d u ra t i o n ="30" xmlns="fl.moti on.·" xmlns:geom="f l a s h. geom.·" xmlns:Eilt ers =HEl a sh . filters.·" > <so UL'ce > cSo urce frameRate="30" x =" 9 3" 1' ="157.5" scaleX ="l" s c a leY ="l" rotation="O" elementTyp e= "mo vie cl ip" instanceName ,·, " moveShape" symbolName="Symbol 1"> e dimensions> >, " ENG cgeom:Rectangle left="O" t op =" O" width="7S" height="47"/> c /dimensions> c transformationPoint> e geom:point x="0.5" y="0.5"/> c/t ransformationPoint> c /Source> c/sou rce > c Keyfr a me inde x=HO" rotateDirection="cw" r otateTimes= Hl" tw ee nSnap=Htrue H tweenSync=Htrue"> cS i mp l eEase ease =Hl" /> </ t\o,leens> e/Keyframe> c/ Ho t ion> CLASSE ANIMATOR ECLASSE MonONEVENT Precisamos agora dar vida a essa animação. a classe ulilizada será a Animator. que eslá no pacole fI. motion. o conslrulor desseobjeto nos pec1irá o objelo XM L e a inslância a ser animada. Que deve ser do tipo display objecL A classe Animator aplica um XML descritivo de um tween motion a um display object. As propriedades de métodos da classe Animator controlam como é executado o filme. e o Flash Player dispara eventos em resposta a alterações no status da animação, como. por exemplo. ele pausa, inicia. finaliza. A classe Animator é principalmente usada pelo Copy Motion como um comando ActionScript no Flash CS3. Você pode editá-lo usando a application programming interface (APl) ou construir sua própria animação customizada. Se você planeja chamar métodos da classe Animator com uma fun ção. declare a inslância do objeto Animator fora da função do escopo do objeto. Se você declarar a inslância com uma função. o Flash Player apagará a instância Animator assim que a animação acabar, isso é parte da 'rotina do "garbage collection" e o alvo não será animado. ENG Esle lópico aborda apenas o básico sobre o assunlo, para saber mais, por favor. consulle a referência. ;íf.<" Devemos agora importar a classe Animalor e a classe MolionEvent que verifica o status da animação: import El.motion,Animator; import El,motion ,Mot ionEvent; /' \lar moveshape_animator:Animator = new . Animator(moveShape_xm l, moveShape); moveShape animator,play(); lTOveShape_anill'ator ,add...,"VentListener (MotionEvent, HJTION_ END, afterl'lotion) ; function afterMotion(e:MotionSvent) Oulros eventos devem ser consultados na referência como o MOTlON START eo UPOATE, o código linal segue abaixo import El,motion,Animator; import El ,motion,MotionEvent; var moveShape_xml :XI1L = <Motion duration= " 30" xmlns=Mfl.motion,·M xmlns:geom="Elash,geom,·" <source> <Source frameRate="30" x="93" y="lS7,S" elementType=Mmovie clip" in stance Na me=MmoveShape" symbolName="Symbol 1" > edimensions> egeom:Rectang l e left=MO" top="O" width="78" height="47"/> </dimensions> etransformationPoint> egeom :Poin t x="O,S" < / transforma t ionp'oint > </So urce > </source> ENG c Keyframe index."O" rotateDirection."cw" rotateTime s="l" tweenSnap."true" tw ee nSync="true"> c tweens> cSimpleEase ease="l" /> c.l t \-:eens > c/ Keyframe> <Keyframe index="29" x="5 77.95" y="-99 11 /> c/Moti o n > va r moveS hape anl mator:Anlmator • new Animator(moveShape_xml, move Shape); moveShape _animato r.play () ; nc;eShape-_ anim=.tor . addEventListene r i onEvent . END, arter-r·: o t ion) ; fcn ction ; ENG Módulo 12 ANIMAÇÃO COM ACTlONSCRIPT - Programando uma Animação - Animação baseada na frame rate - Alterando a frame rate - Animação baseada em tempo - Conclusão . ENG ANIMAÇÃO COM ACTlONSCRIPT PROGRAMANDO UMA ANIMAÇÃO Esle capítu to abordará apenas técnicas básicas para criação de animação com ActionScript. não veremos programação baseada em fí sica ou tran stonnaço es de bitmaps e cores. Para animar no Flash devemos entender como ele executa esse tipo de instrução Uma animação em ActionScript é criada da seguinte maneira. nós mudamos o conteúdo visuat repetidamente através da Irame rate ou através do tempo. criando a sensação de movimento. Existem então duas maneiras de se animar. at ravés da Irame rate. o quattodas animaçoes de ti meline nao baseadas e outra. que é através do tempo. podem os pensar como o setlnterva l() do javascripl. ANIMAÇÃO BASEADA NA FRAME RATE Para animar baseado na trame rate do Flash. precisamos do evento Event.ENTERJ RAME. ele atualiza a tela constantemente baseado na trame rate associada ao arquivo. Conseqüentemente avetocidade da anima ção é dependente deta. Se a trame rate é de 10 trames por segundo e pedimos a um objeto que se mova a 1Opx por Irame. ele percorrerá 100 pixels por segundo. assim como se o registrarmos com lima trame rate de 30 o objeto percorrerá 300 pixels por segundo. 10 pixels x 30 trames por segundo = 100 pixels por segundo. Devemos lembrar que este tipo de animação varia muito de máquina para máquina. a an imação dependerá do pro cessamento de renderização no Flash Player no monitor. outros programas abertos ao mesmo tempo podem também atrapal har sua performance. import flash.display.Sprite; import flash .events .Event ; var quadro:Sp rit e new Sprite(); var xAngle:Number var yAngle:Numbe r o; o; var xSpeed:Number .13 ; var ySpeed:Number .09; ENG var xRadius:Number 100; var yRadills:NlIrnber 50; quadro.graphics.beginFill(Ox9 90000) ; quadro.graphics.drawCircle(O, O, 25); quadro.gr aphics .endFill() ; quadro.x O; quadro.y 100; addChild(quadro) ; addEventListener (Event. ENTER FRAJ'lE, o nEnterFrame); Eunction onEnterFrame(e :Svent) :void { quadro.x quadro.)! xAngle += 200 + r.1ath. sin (xJ..ngle) * xRadius; 200 + r-lath. cos\yF-11g1e ) • yRaciius; xSpeed; yl\.ng 1 e + = ySpeed; ALTERANDO A FRAME RATE Em ActionScript 30 podemos alterar a frame rale a qualquer momento. podemos lazer isso através da propriedade frameRate. contida l1a propriedade slage. stage.ErameRate valor; import flash.events.MouseEvent; import Elash .even ts.E ve nt; fpsIO.addEventListener(MouseEvent.CLICK, onClick); Eps50.addE vent Listener(MouseSvent .CLICK , onClickl; fpsI00. addEve ntListener(Mouse Even t.CLICK, onClick) ; function onClick(e :MouseEvent) :void { iE(e . curren tTarget . name stage. frameRate = == "fpsIO·) ( 10; }else iE(e.currentTarg et.name stage. frameRate = 50; }else if(e .currentTarget.name stage .frameRate quadro.x 20; = "Eps50·) { 100; "fpSIOO") { ENG addEventListener (Event. ENTER_FRAl'1E, anima); function anima(e:Event) :void { quadro.x += (680 - quadro.x)/lO; campo.visible !campo.vis ible ; = if(quadro.x >= 670){ campo.visible = true; removeEventListener(e.type, arguments.callee) ; ANIMAÇÃO BASEADA EM TEMPO Para criar uma animação baseada em tempo. criaremos instâncias da ctasse Ti mer. do pacote flash. uti Is. Essa animação é baseada em intervalos de tempo, para jogos olerece maior estabilidade que o enter Irame, porém. consome muito mais memória. o uso descentralizado deste objeto pode causar enormes danos ao seu objelivo. o evento responsável pela anrmàção em si é o TimerEventTlMER, criaremos um simples código abaixo. import flash.utils.Timer; import flash.events.TimerEvent; impo rt flash .d isplay.Sprit e; var quadro:Sprite = new Sprite(); quadro.graphics.beginFill(O) ; quadro.graphics.drawRect(O, 0, 70 , 70); quadro .graphics.endFill() ; quadro.x O; quadro.y 200; add Child(quadro) ; var timer:Timer = new Time r(50, O); timer.addEventListener(TimerEvent.TIMER, onTimer); time r. start () ; function onT imer(e:TimerEvent ) :void quadro.x += 10; e.updateAfterEvent() ; ENG ir (quad ro .x >= 300) ( e.curre ntTarg e t .s t op() ; Dentro do construtor o objeto timer nos pediu delay e repeatCount. onde delay é o tempo em que ele executa cada chamado e repeatCount o número de vezes que ele executará esse timer. Também poderíamo s usar da seguinte maneira: timer.delay : 50; timer . repeat:Co unt o; Para iniciar o limer utilizamos o método startO o updateAflerEvent() foi usado para que o Flash Player 10rçasse a renderi zação do quadro mais rápido na leia. Quando o quadro cheg a na posição de 300 pixe ls no eixo horizontal. o objeto timer chama o método stop(). import fl a sh. c e xt. TextFi e ld; import flasil . texc.Te xtFieldAu toSize; import Elash.utils. Timer; import flash.Eve nt s .TimerEve nt; va r ca mpo:TextFie ld = new Te x tFi eld(); campo.autoSize = TextFieldAutoSize.LEFT; campo.x = campo.y = 200 ; addChi ld (campo) ; var timer :Timer = new Timer(50, O); timer.addEventListener(TimerEvent.TIMER, onTimer); timer.start() ; var palavra:String " Act i onScript Fla s h CS3."; var coun t:int o· fun c ti on onTimer(e:TimerEvent) :vo id if(count == palavra.length1 l e . currentTarge t.stop() ; .0, Adobe EI\J6 campo.text pa Lavr a . subs tr (O , c oun t ); count+-+ ; CONCLUSÃO Ao criar animaçõesvia AclionScript, tente sempre cenlralizar sua programação numa única classe, para que assim você use menos memoria da máquina do usuáno. lornando assim uma experi ência mais gralili cante Exisle uma sé rie de classes pronlas na inlernel que prove m essa lacllidade ao programador. " •. to· ... " ,. . 1'< ENG ACT'ON SCR'PT :3 - LEVEL:3 www.e ny.com .br , Adobe .. Módulo 13 DETECÇÃO DE COLISÃO Detecçao de co lisão baseada num ponlo Detecção de co li são baseada num objeto iii ENG DETECÇÃO DE COLISÃO Para verificar uma co li são simp les. temos dois métodos: DETECÇÃO OE COLISÃO BASEADA NUM PONTO pubIi e funetion hitTestPoint (x:Number, y:Number, s h apeFlag:30o l ean = false) : Boolean Ava lia-se um display objecl intersecta um ponto especificado pelos paràmelros x e y Os parâmetros x e y especificam um ponto no espaço de coorDenada no Stage. não ao display object container que contém o display object (a menos que o display objecl conlainer seja o Stage) import fla s h.di s play.McvieClip; imp ort fl?sh.geom .CclorTransform; impo r t El as h .events .MouseEvent; var quadro_mc: Movi e Cli p getChildByName("quadro·) as t/lo'·/ieClip ; colis a o! i var meu Co l orTransform:ColorTransform new ColorTranstorm() ; meuColorTra nsform.color Ox990000; var old:ColorTransform = quadro_me.tr a nsform.eolorTransform; var subltem:Quadro ne l'l Quadro(); subltemeuttonMode true; subltem.addEventListener(MouseEvent.MOUSE OVER, over) ; subltem. addE ventListener(MouseEvent.MOUSE_OU'T, out; ; funetion co lisao (e:i'louseEvent) :void ( if(quadro_ mc.hitTes tPoint(mouseX, mouseY, true)) ( quadro_me.getChildAt(O) .transform.eolorTrans\5rm meuColorTr ans form; O _III ENG ACTION SCRI·PT ;9 - LEVEL ;9 www.eng.c om.br , Adobe i f(!qu adro_me .eont a i ns(su bltem» ) { qu adro_me.addCht l dls ubltem ) ; suo lt e m .y sub lt em.helg ht ; e ls e { quadr o_mc.ge tChildA t(O) .transform.eolorTrans f orm old ; iE(quadro_me . eon t a in s(s u bl tem) { quad ro _ me .remove Child(subltem) ; funetlon over (e:Mou seEve nt) :vol d e .currentTa rge t alpha .S; fu oetion out(e :fvlous e Ev ent ) :void e.cu rrent Target. alpha 1; DETECÇÃO DE COLISÃO BASEADA NUM OBJETO pub lic function hitTes t Ob j ect (obj:Di spl ayObject) :Boo l ea n Avali a-se o display objecl intersecta com o display object obj. i mpor t El as h. disp l ay.MovieClip; import flash.di sp lay Di sp l ayOb ject; import fla sh.events .Mou seEvent; var quadro_m c: Mov ieClip getChildByName("quadro H ) as t'lovieClip; va r qua droArrastavel me:Mov leCll p getChil dByName("qua droArra stave l") as MovieCli p; quadrOArTas t avel_me. adcL"'ventListener (MouseEvent .t'DUSE_ COWN, down ) ; quadroArrastavel_me. addEvent Lis.tener up) ; f unction down(e:i'louseE v ent) :void { . fvlOUSE_UP, . . . , :. ENG ACT'ON SCR'PT <I - LEVEL <I www.ell9-com.br rli ·m AU1HORIZED Adobe e.currentTarget.startDrag() ; setChildlndex(e.eurrentTarget as DisplayObject, numChildren - 1); e.currentTarget.addEventListener(MouseSvent.MOUSE_MOVE, move); function up(e:Mous eEvent) :void { e .curr e ntTarget.stopDrag() ; e. currentTarge t . removeSventListener (MouseEvent . t·lOUSE_1'10VE, move) ; if (e. currentTarget .hitTestObject (quadro_me) ) { e .eurrentTarget.x quadro mc.x + 10; e.currentTarget.y quadro_m c.y + 10; funet ion move (e: !VlouseEvent) : void { e.updateAEterEvent() ; ENG Módulo 14 MANIPULANDO OTECLADO - Cla sse Keyboard - Cla sse KeyboardEvent - Detectando tec las pressionadas simullâneamenie ENG MANIPULANDO OTECLADO o AclíonScripl 3.0 vem com a classe de teclado reformulada, utilizávamos anteriormente o objelo Key, agora atualizado para tlash.ui.Keyboard. Quando o usuário do Flash pressiona uma tecla. o ActionScript dispara dois eventos, KeyboardEvenl.KEY_DOWN (release) e KeyboardEvenl.KEY_UP (press). É muito comum num sistema adicionarmos teclas de atalho para que o usuário que se sente mais à vontade possa uti lizar desses recursos para acelerar sua tarefa. os objetos citados acima nos permitem saber se atecla Caps Lock ou Num Lock está ativada assim como saber se qualquer outra tecla 10i pressionada ou eslá ativa. CLASSE KEYBOARD capsLock : Boole an [ static] [read -onlyl Retorna se a tecla Caps Lock está a tiva (true) ou não ífalse). numLock : Boolean [staticl [re ad -onl y l Retorna se a tec l a Num Loc k está ativa (true) ou não (fa l sel. CLASSE KEYBOARDEVENT charCode : uint Contém ovalor do código do caractere Que foi pressionado no teclado. ctrlKey : Boolean Indica se a lecla Contrai está sendo pressionada nesse momento (true) ou não (Ialse). shiEtKey : Boolean Indica se a tecla Shift está sendo pressionad a nesse momento (true) ou não (lalse). Exemp lo import Elash.ui.Keyboard; import flash.events.KeyboardSvent; stage.addEventList81er(KeyboardEvent.KEY_DOWN, keyDown) ; ENG ACTION SCR.PT li - LEVEL li V1ww.eng.com.1n ·111 AUTHORIZED function keyDown (e: KeyboardEvent) :void tracei "Tecla pressionada:", String.frornCharCode(e.charCodel, " (codigo do caractere:", e. charCode , "I"); (Keyboard.nurnLock && Keyboard.capsLock) ii trace("numlock e capslock ativos"); r et urn; if (Keyboard.capsLock) { trace("capslock ativa"); else if (Keyboard.num Lock) trace ("numlock at i va" ) ; DETECTANDO TECLAS PRESSIONADAS SIMULTANEAMENTE Primeiramente. no painel de Test Movie, desabilite os atal hos para que possamos testar este exemp lo: file ."'""'" COo'".tr'<i\-. Debug F'I.ly Enter Ctrl+AA +R .::t FOrv.,.,:,rd One: Fr ãffie 9.-:p &.::.d:,wdrd One frbroe , Agora. no seguinte código. criaremos uma constante que representará a letra ··s". criaremos uma cond ição verificando se o usuário pressionou conlrol + s. import fla sh .events.KeyboardEvent; trace("S" .charCodeAt(01)//83 con st S KEY = 83; stage.addEventListener(KeyboardEvent KEY_DOWN, multiplasTeclas) ; tunction multip l asTeclas(e:KeyboardEvent) :void if (e.ctrlKey && e.keyCode trace ("contro l + s "); S_KEY) { ENG . .... .... Módulo 15 EXIBINDO DATA EHORA - Trazendo data e hora do servidor - Retornando dados do objeto Date separadamente . Recebendo o nome do mês e do dia da semana . Convertendo en tre ..1e Epoch Milliseconds EI\JG EXIBINDO DATA EHORA Saber como Iratar data e hora é fundamental para quem quer oferecer serviços ao usuário. Não somente com o propósito de exibir um relógio no site. mas para saber o tempo em que detenninado usuário executou uma ope ração. a hora em que efefuou uma transação earmazenagem de dados. A ActionScript armazena datas e horas internamente como epoch milliseconds, o tempo de rni lisegundos que passaram desde - meia noite, 1 de Janeiro de 1970 no Tempo de Coordenada Universal (UTC - Coordinated Universal Time) . para nossos propósitos é equivalente ao GMT (Tempo do Meridiano de Greewich). Para exibir adala e a hora, utilizamos o objelo Date. ele nada mais faz que retornar adata e hora do usuário. var data:Date new DateI); trace (data) ; TRAZENDO DATA EHORA DO SERVIDOR Porém nemsemp re o usuário está com seu relógio em dia. para isso podemos trazer os dados de script de uma linguagem de servidor. como por exemplo o PHP <?php ec ho time() i?> Após isso podemos trazer os dados num obj eto flash.neLURLLoader a fim de tratar o objelo como um tipo de dado Date do próprio AclionScript. import flash.net.URLLoader; import flash.net.URLRequest; import flash.events.Event; var loade r:URLLoader = new URLLoader(); loader.addEventListener(Event.COMPLETE. ,'. . onComp let e) ; loader.load(new URLRequest("data. php")); Eunctio n onComplete (e: Event) : void { var l oader:URLLoader = e.currentTarget as URLLoader; var dataPHP:uint = var temp o:Da te new Dat e (dataPH P = par selnt (loader.data)Ó * 10));. '/.J « Õ ::> ::;; ENG ________________A_C _ _T_I_O_N_ _S__ C_R_I_P _T _ _3 __-__L_E_V _ _E_L__3__ III trace(tempo) ; Multiplicamos o objelo dataPHP por 1000 por causa do formato em milisegundos, RETORNANDO DADOS DO OBJETO DATE SEPARADAMENTE Hora Apropriedade hours retorna um valor entre Oe 23. Minuto A propriedade minutes retorna um valor entre Oe 59. Segundo A prepriedad e secends retorna um valor entre Oe 59. Dia A propried ade dale relorna um valor enlre Oe 23. Mês A propriedade monlh reloma um valor entre Oe 11 Ano Apropriedade lullYear retorna um valor de qualro digites como 2008. Dia da semana A propriedade day retorna um valor entre O6. var tempo:Date new Date(); var horas:uint tempo.hours; var minutos:uint tempo.m inutes; var segundos:uint tempo. seconds; var dia:uint tempo .date; var mes :uint tempo month; var ano:uint tempo. fuI I Yea r; var d i aSemana:uint trace(horas + H:" (dia + "I" ,+ trace (diaSemana) ; = tempo.day; + minuto s t H:" + mes + "I" + ano); segundos); ENG RECEBENDO ONOME DO MÊS EDO DIA DA SEMANA Para associar valores numéricos avalores lextuai s corno segunda-feira, criamos um array etrocamos o chamado do índ ice fixo pelo chamado do valor da data aluai : val' tempo:Date new Date(); var horas :uint tempo.hou rs ; var minlltos:u int tempo.mi nut es; va r tempo. secon ds; segundos:uint var dia:uint temp o . date; 'lar mes:lIint tempo.mo!lth ; var ano :u int tempc.fullYear ; var diaSemana:uint t empo. d a)' ; 'lar ar rDiasSemana:Array "Terç a ", "Qu arta ", "Quinta", var arri'leses :Array "r'.arço", "Abril" , "!'-.gosto", "Sext a" , "Sabado"); ["Janeiro", "I'laio", "Setembro" , "Dezembro"] ["Domingo" , "Segunda", "Junho", "Outubro" , + l/Quarta, "Julho", "Novembro ", i trace (arrDiasSe mana [diaSeméma l " "Fever·eiro", [mes l + " de + ", " + dia + " de " + ano .. "."); 6 de Fevereiro de 2008. Um exemplo completo com atualização constante na tela pode ser observado abaixo: p ackage { import flash. t ext.TextFi e l d; imp o rt flash.text.TextFieldAutoSize; import Elash.utils.Timer; import Elash.events.TimerEvent; i mpo rt Elash.d i splay.Sprit e ; p ublic class Da t aHora e xten ds Spr it e { private va r co ntad cr :Timer ; private va r tempc:Date; private va r data:TextField; EI\.IG private var hor a:TextF i eld; private var meses:Array; pub li c function DataHor a() meses "Abril", [" Janeiro " , "Fever-eiro" , = "r'laio", "Junho", "Julho", "Set embro", "Outubro", "Novembro", "Agos to", "Dezembro" 1 data getChildByName("data_txt") hora getCh i 1 dByName ("ho-ra _ txt" ) as Tex tFi eld; as Te xtFie l d; da ta.auloSi ze hora.autoSize TextFieldAut oSlz e.LEFT; new Timer {l OOO); contador contador addEventLis tener(TimerEvent . TIMER, onTimer) ; contaàor.start(j; onTi mer() ; private function onTimer(e:TimerEvent null) :void { new Date () tempo hora.text ":" + zeroFil l (tempo.hours) = zero Fillltempo.minutes) + + " ." zeroFillltempo.seconds) ; data.text mese s [ tempo.month) + " tempo.date + " de " de " + private function zeroFi l llvalor:Number) :String if Ivalor > 9) { retu rn valor.toStri ngl);O else { + tempo.fu l lYear + " " . O ENG return "O" + valor. toString () ; CONVERTENDO ENTRE DMYHMSM EEPOCH MllllSECONDS Éimportante saber converte r o formato date em diferentes formatos de apresentação, poi s nem sempre o sistema nos traz de forma aprazível estes valores, no exemplo abaixo a propriedade time nos retorna a data em formato DMYHMSM (dia, mês. ano, hora, minuto, segundo. milisegundo) Ena linha abaixo passamos no construtor um valor de tempo ao invés do ano. pedind o em seguida seu valor. o qual retornará a data como form ato usual (epoch milli seco nd s) l/ar data : Date ne\·, Date{2008, 0 , 6 ) ; / / 11 99588400000 (t imeVa l ue) trace(data.time) ; var data2:Date new Date(1199588400000) ; /ISun Jan 6 OO:CO:OO GMT - 0300 20GB trace (daca2) ; EI\JG __ _______C__T_'_O_N___!;_CR ____________ IPT - L_E_"E_L __ _____ 3 1JD1 Módulo16 ,...... -. CRIANDO UM CURSOR DE MOUSE - Aplicando máscara a um objelo - Exibindo e esco ndendo o cursor de mou se - Criando um cursor personalizado ENG CRIANDO UM CURSOR OE MOUSE APLICANDO MÁSCARA AUM OBJETO Para aplicar máscara a um objeto utilizamos a propri edade mask, essa propriedade é aplicável a qualquer objeto visual (Oi sp layObjecl). Éimportanle ficar atento que a propriedade mask é aplicável somente a um . ,,' ". ;-(. objeto , diferente do seu uso na timeline durante a criação, momenlo em que podemos aplicar um amáscara a n objeto s. Para remover a máscara de um objelo aplique ao valor da propriedade mask o valor nul!. impore Elash .d isplay .MovieClip; import flash.events .Mo useEvent; var a mc : MovleCllp getChildByName( " a") as NovieClip; var b_mc :Mov i eCl ip getC hildBy Na me("b") as !'-lovieClip; var c_mc : Mov i eClip get ChildByName("c") as MovieClip ; IIAplicando mascara ao objeto a mc a mC.mas k D me; stage.addEve nt Listener(MouseEvent.CLICK , setMaskl; fun ction setMask(e:Mouse Event) : void { l/sobrescrevendo a mascara do obj eto a mc a mC.mask c _mc; EXIBINDO EESCONDENDO OCURSOR OE MOUSE Para esconder o cursor cio mouse, chame o mélodo esláti co hide() da classe flash. ui .Mouse. Para exibir o cursor do mouse. chame o método estático show() da classe lIash.ui .Mouse. import flash.ui .Mous e; Mouse.hide() ; ENG CRIANDO UM CURSOR PERSONALIZADO Para criar um cursor basicamente precisamosesconder o mouse eaplicar a um ob jeto visual o stariOrag() para que ele se torne o nosso ponteiro customizado. No exemplo abaixo faremos isso de maneira um pouco mais complexa, arrastaremo s dois objetos ao mesmo tempo 110 stage. sendo que um deles aplicará máscara aimagem de fundo. Um detalhe importante nesse exemplo éque o método startOrag é ap licável aapenas um ob jeto por vez, o segredo será associar o x e o y do seg undo objeto arrastável a posição x e y do mouse (mouseX e mouseY). Uma outra tarefa Que realizaremos será esconder o cursor quando o usuário lentar pressionar o clique direito do mouse import flash.display.McvieClip; impo rt flash.ui.Mouse; import flash.events.MouseEvent; import flash.events.Event; var image:MovieClip var mouseCursor :MovieClip getChil d3yName("curs or") as Novi eCl i p; var mascara:S prite = new Sprit e (); mascara.graphics.beginFillIOl; mas ca r a. graphi cs . drawRcundRect ( - 1 00, 200, -100, 50); mascara.graphics.endFill (); addCh ild(mascara) ; image.mask = mascara; mas ca r a .startDrag(true) ; stag e.addEventLlstenerIMous eEvent.MOUSE move) ; Mouse .hide () ; stage.addEventListener(Event.MOUSS_ LSAVS, apaga Cursor) ; function apagaCursor( e:Event) :vo id 200, as ENG f"1 ouse. hide () function move (e:MouseEvent) :void ( mous e Cursor.x mouse X - moUSeCU 1"SOr . y mouseY; mou seCursor .·.-,idth /2 ; - mouseCursor.height/2 e. upd ateAfte rEvent () ; move (ne ... MouseEvent (Mous eEven t . MOUSE_fvIOVE)) ; ENG Módulo17 UTILIZANDO FILTROS - Criando e Aplicando Filtros - Aplicando Filtro a um DisplayObject - Removendo um Filtro de um Di splayObject - Classe BlurFilter - Classe DropShadowFi lter - Classe Co lorMatrixFi lter ENG UTILIZANDO FILTROS Filtros são parte importante para aplicação de efeitos visuais. afim de proporcionar ao usuário uma maior riqueza vi sual. Aaplicação de fillros é originalmente feita por softwares especializados em edição de imagens como o Adobe Photoshop S: e o Adobe Fireworks? o ActionScript 3. 0 pOSSUI diversas classes para aplicação de filtros. contidos no pacote flash.filters. onde uma séne de filtros podem ser encont rados. permi tindo ao desenvolvedor ap licar filtros em tempo de execução. esses flttros podem ser apticados a disptay objects e bitmaps. Um dos caminhos de adicionar riqueza visual ao projeto é aplicar simples efeitos gráficos a objetos. como um drop shadow por Irás de uma foto criando uma Ilusão de 3-D. glow em volta de um botão quando ele está alivo o ActionScript 3.0 possui nove filtros que você pode aplicar em uma instânCia dlsplay object ou uma instância BitmapData Alguns dos filtros são básicos. como drop shadow e o blur. que permitem criar efeitos padronizados em suas funções. porém. existem fillros complexos que permitem a criação de diversos efei to s como embossing. edging e sharpness como o fillro displacement map e o filtro convolulion. Bevel fi lter (BevelFiller class) Blurfi lter (B lurFiller class) Drop shadow filter (DropShadowFil ter class) Glow filler (GlowFilter class) . Gradient bevel filler (GradientBevelFilter class) Gradient glow filler (GradientGtowFilter class) Calor matrix filler (ColorMatnxFilter class) Convolution filler (ConvolutionFiller class) Displacement map filler (DisplacementMapFiller class) CRIANDO EAPLICANDO FILTROS Cada filtro é definido como uma classe. então aplicar liltros envolve a criação de instâncias de objetos de filtros. isso não é diferente de qualquer constnução de outro tipo de objeto. Uma vez criada a instância de um filtro. você pode facitmente aplicá-lo usando a propriedade fil.t ers no caso de um display objecl. No caso de um BilmapData. use o método applyFilter(). ' . ';.:.. ENG www.enq.c om .br ACTION SCRIPT 3 - LEVEL 3 ""1 Adobe import flash.filters.DropShadowFilter; var filtro:DropShadowFilter = new DropShadowFilter() ; APLICANDO FILTRO AUM DlSPLAYOBJECT import flash.filters.DropShadowFilter; var filtro:DropShadowFilter = new DropShadowFilter() ; meuDisplayObject. filters [filtro]; REMOVENDO UM FILTRO DE UM DISPLAYOBJECT lmport flash . filters.DropShadowFilter; var filtro:DropShadowFllter = n ew DropShadowFilter() ; [filtro] ; meuDisplayObject.filters //Removendo em seguida null; meuDi splayObject . filters CLASSE BLURFILTER Aclasse BlurFilter mancha. ou embaça. um disp lay objecl e seu conleúdo. Efeitos de Blur são úteis para ter a impressão que um objeto está fora de toco ou para simu lar movimento rápido, como em um motion blur. Configurando a propriedade quality do filtro blur para baixa, você pode sim ular um efeito de lentes fora de foco suavemente. Configurando a propriedadequalily para alto o resultado é um suave efeito blur similar a um Gaussian blur. oseguinte exemp lo cria um círculo usando o método drawCircle() da classe Graphics e ap lica um filtro blur a ele: import Elash.display.Sprite; impor t fl as h.filters.BitmapFilterQua lit y; import flash . filters.BlurFilter; II Desenhamos um círculo, var redDotCutout:Sprite = new Sprite() ; redD otCutout . graphics.lineStyle () ; redDotCutout,graphics.beginFill(OxFFOOOO) ; .. 0°,,..___ EI\JG redDotCutout.graphics.drawCircle(145, 90, 25); redDotCutout . graphics. endFi 1] ( ) ; /1 Adiciona o circulo na display list addChiId(redDotCutout) ; /1 Aplica o filtro blur ao círculo var new BlurFilter(); bIu!". b lurX blur.blurY 10; 10; blur.quality = BltmapFllterQuality.MEDIUM; redDo tCutout (ilters tblurJ; CLASSE DROPSHADOWFILTER Drop shadows dão a impressão que há uma fonte de luz separada situada aClnla do obleto alvo A posição e a intensidade dessa lonte de luz podem ser modrlicadas para produzir uma variedade de diferentes efeitos drop shadow o fi Itro drop shadow usa um algorítimo que é similar ao algorítimo do filtro blur. A principal diferença é que o liltro drop shadow filler tem um pouco mais de propíiedades que vocé pode modificar para simular diferentes atributos de fontes de luz (assim como transparência. cor. balanceamento e brilho) o liltro drop shadow também permite aplicar customizadas opções de tran sformações no estilo do drop shadow. incluindo sombras dentro ou fora e modo knockout (também conhecido como tirar lora) o seguinte código cria um quadrado eaplica um filtro drop shadow a ele import Elash.display.Sprite; import Elash.filters.DropShadowFilter; II Desenha um Quadrado. var boxShadow:Spri te = new Sprite(); boxShadow.graphics.lineStyle(l) ; boxShadow.graphics.beginFill(OxFF3300) ; boxShadow.graphics.drawRect(O, boxShadow . graphics.endF ill() ; addChild(ooxShadow) ; o, 100, 100); EI\.IG www.eng.com.br ACTlON SCRIPT r,,"1 3- LEVEL 3·11. Adobe 1/ Aplica o filtro drop shadow ao quadrado, var shadow:DropShadowFilter new DropShadowFilter() ; shadow,distance = 10; shadow.angle = 25; II Você também pode aplicar outras propriedades, assim como cor da sombra, II alpha. quantidade de blur, slrenglh, qualily, eopções para II inner shadows e efeitos knockouL boxShadow,filters = [shadow]; CLASSE COlORMATRIXFILTER A classe ColorMalrixFi Iter é usada para manipular valores de cor e Iransparência de objetos. Isso pemnite criar mudanças de saturação, rotação de cor (mudar um alcance de uma pai ela de cores a outro) alterações de luminosidade, e outros efeitos de manipulação de cores usando valores a partir de um canal de cor e potencialmente aplicando então a outros canais, Conceitualrnente, o filtro vai através dos pixels na imagem fonte uma por uma e separa cada pixel para dentro de seus componentes vermelho, verde, azul e alpha, Ele entao multiplica valores providos na cor matriz por um cada desses valores, adicionando os resultados juntos para determinar o valor da cor resultante que será mostrada na tela para aquele pixel, A propriedade matrix do filtro está numa lista de 20 números que são usados para calcular a cor final, Para detalhes do algorílimo especifico usado para calcular os valores de cor. consulte no help a propriedade matrix da classe ColorMatrixFilter em AclionScripl JO Language and Components Reference. Oulras informaçôes e exemplos do fillro colar malrix podem ser enconlrados no artigo "Using Malrices for Transformalions, Colar Adjuslments and Convolution Effecls in Flash" no web sile Adobe Developer Cenler. ENG www.eng.com.br ACTION SCRIPT Adobe Módulo 18 APLICANDO FULLSCREEN - Alinhando o conteúdo do stage - Alterando aexibição do slage - Definindo aqualidade de exibição do SWF - Retomando o tamanho do stage - Aplicando FullScreen ao s!age a - LEVEL:3 II ENG APLICANDO FULLSCREEN ALINHANDO OCONTEÚDO 00 STAGE Para alinhar o conteúdo do palco. utilize a propriedade align ligada a propriedade slage. que represenla a classe Stage no AclionScripl 3.0. BOTTOM : Stri ng = "B" [slalic] Espec ifica que o Stage é alinhado ao rodapé BOTTOM _ LEFT : Str ing "BL" = [static] Especifica Que o Slage é alinhado no canlo inferior esquerdo. BOTTOM_PIGHT : String "3R" [slatlcl Especillca que o Stage é almhado no canto 11!er lO r direito LEFT . Str ing IstatJc] "L" Especif icaque o Stage é almhado a esquerd,L RIGHT S tring = "R" [slalí c] Especifica que o Slage é alinhado a direita TOP String = "TU [stalic] Especifica que o Stage é alinhado ao topo TOP_LEFT : String "TL" = [sla tic] Especifi ca que o Stage é alinhado no canlo su perior esquerdo. TOP RIGHT : String = "TR" [slalic] Especifica que o Stage é alinhado no canlo superior direilo. import flash.display.StageAlign; stage.align = StageAlign TOP_L EFT; ALTERANDO AEXIBiÇÃO DO STAGE Especifica como usar o modo de escala do slage. EXACT FIT : String = "exactFit" [stalic] Especifica que a aplicação Adobe E Flash R inleira será visível na área especificada sem tentar preservar a relação de aspeclo original. ENG NO_BORDE R : Stri ng = "noBorder" [static] Especifica Que aaplicação em Flash inteira ira preencher aárea especificada, sem di storção, mas possivelmente com algum corte. enquanto mantém a relação de aspecto original da aplicação. NO_SCALE : Str ing = "noScale " [static] Especifi ca que o tamanho da aplicação em Flash será fixada. então ela permane ce imutável mesmo conforme o tamanho da tela de player mudar. S HOW_ALL : String = "showAll" [stalic] Especifi ca Que aaplicação em Flash inteira será visível na área especificada sem dislorção enquanto mantém a relação de aspecto original da aplicação. import f l ash.dis play.StageScaleMode; stage. sca leMode = StageSc alei'lode. NO_ SCA LE; DEFININDO AQUALIDADE DE EXIBiÇÃO DO SWF o valor que especifi ca como renderizar (interpretar) a qualidade do Flash Player para o usuário final BEST : String = "best" [static] Espec ifi ca qualidade de interpretação como muito alta gráficos são suavizados usando uma grade de 4 x 4 pixe l e bitrnaps sempre serão suavizados. HI GH : String = "high" [static] Especifi ca qualidade de interpretação como alta gráfico s são suavizado s usando uma grade de 4 x 4 pixel e bitmaps são suavizados se o film e é estático. LOW : S trin g = "Iow" [static] Especifi ca qualidade de interpreta ção como baixa: gráficos nao são suavizados. e bitmaps não são suavizados. : String = " medium" [static] Especifica Qualidade de interpretação como media: gráficos são suavizados usando uma grade 2 x 2 pixel . mas bitmaps não são suavizados. import fla s h.display.StageQuality; stage.quality StageQuaIity.BEST; ENG RETORNANDO OTAMANHO DO STAGE Para retornar a largura do stage. utilize a propried ade stageWidth. Para retomar aaltura do stage. utilize a propriedade stageHeight. import flash.events.Event; stage.addEventListener(Event.RESIZE. onResize); cnResize() ; fun ction onResize(e:Event - null) :vcid trace (stage. 5 tageWidth ) ; trace(stage.stageHeighi; APLICANDO FULLSCREEN AO STAGE A. propriedade displayState define como exibir o s\\1 para os usuários. silo duas possibilidades, NORMAL e FULLSCREEN. Um detalhe importante é que textos do Upa input text não recebem entradas de texto Quando no modo fullscreen. FULL_SCREEN : String - "EullScreen- [sta licl Especifica Que o Stage deve estar em modo fullscreen. NORMAL : String - "norma l- [slaticl Especifica Que o Slage deve eslar em modo normal. import Ela s h.display.StageDisplayState; import flash . events.MouseBvent; stage.addEventListener {Mou seSvent.CL ICK . onClickl; function onC lick(e:MouseSve n t) :void I stage.displayState = (st age.displa yState StageD ispl ayS tat e. NORMAL) ? St ageDisplayState.FULL_SCREEN StageDi splayState.NORMAL; Para que o código acima funcione. é necessário que o hlm l também seja alterado em Irês partes, ambas permitindo o uso do full screen para Irue. ENG <htm l xmlns=" http://w,,,'w . w3 . org/ 1 9 9 9 /xht ml" xml:lang="en" l a ng="en" > <h ead> <meta http- eq uiv="Content - Type" conte n t=" text/ html; charset=iso-8859-l " /> <titl e> fulls creen c/ ti tle> <sc ript l a nguag e="j avascript">AC_FL RunCon tent O; e/sc ript > escri pt SlT=" AC_RunAct i veContent . j s" l a ngu age=" j avascr ip t " >c/scr ipt > e/hea d > ebody bgcolor="#EEfEEE"> e !- url's used in the mcvie - > e ! - t ext used in the movie-> C ,- saved Erom url= (00 13) about: internet > cscr i pt l anguage= "javascr i pt" > if (AC FL RunContent == O) alert (" Th is page requires AC Run.'''ctiveContent. j s "); e l se { AC FL RunCc nt ent( 'codebase', 'htt p:// downl oad.macrome dia.com/pub/ shock wave! c ab s!flash! s wEl as h .cab #ve rs ion=9,O,O,O' , 'width', '100 %' 'height', 'src', '100%', 'Eull screen' 'qualit y', 'h ig h ' , 'pIuginspage' , 'http: // www.macromedia . com/ go/getEla s h player· , 'align', 'middl e ' 'play', 'tru e', 'Ioop ', 't r u e' , \ scale', \ nos ca l e ' ' vlTnode', 'V\l indu '.tJ ', 'dev i ce tont ', 'id', . Ea 1 se ' , ' fullscr een ' , 'bgcolor', 'Uf ffEff', 'name', 'ful lscreen ', 'me nu ' , 'tru e ', \ true' , ' a llowS cr iptAccess ', ' sa meDo ma in ' , 'mov ie', 'salign' , 'full sc r ee n', ENG ACTION SCRIPT 3 - LEVEL 3 www.el1g.com.br AUTHORIZED ); Ilend AC code c/script> c noscript> cobject c l ass id7"clsid:d27cdb6 e - ae6d -ll cf· 96b8 -4445 53540000 " codebase="http:// download.macromedia.com/pubjshockwave/cabs/flashl swf la sh.cab#version =9,O,O,O" width="lOO%" height:"lOO%" <param value="sameDomain" I> <param name="allowFullScreen" value","true" I> <param name="movie" value="fullscre en.swf" / ><param value="high" !><param value ="nosca le" I>cparam name="bgcol o l·" valuE'="tltffEEf" I> <embed src 7 "Eullscreen. sw [" qu a lit y="h igh" scale="nosca l e" bgcolor="NffffEf" width=" l OO%" height="lO O%" name="Eu l l scr een" a li gn="m iddle" a ll owScriptAccess="sameDoma in" allowFullScreen="true" type="app lication /xshockwave-flash" plugihspage= "http:// 'ti h"" . macromedia . com/go/get flashplayer" / > c/object > </noscript > cjbody> </html> Um exemplo complelo seg ue abaixo. crie num arquivo .lIa dois MovieClips de nomes quadro e círculo. em seguida crie a seguinte classe para ser associada ao Documenl Class. package { import Elash.display.StageAlign; import flash.display.StageScaleMode; import flash.display.StageQuality; import flash.d isplay.StageDisplayState; import flash.di sp l ay.Sprite; import flash.di sp l ay.MovieC lip; import flash.eve nts .Event; import Elash.events.MouseEvent; public class FullScr e en ext ends ENG priva te var circ:Sprit e; pri v ate var quad:Sprite; public function Ful1S cree n() stage.align StageJl.l i gn. _LEFT; stage. sca StageScaleMode.NO_SCALE; s tage. quaU t y StageQuallty.BEST; stage.addSventListener(Event .RESTZE, onRes ize ) ; Clrc gelChildByNamel" c irculo H quad gelCIH ldByName ( "quadro") as ) as j·1C\"l eCl.l p, q u ad . out tru e i o nCl ickl ; onResize () ; pr iva t e function o nRe s i zele:Eve nt null}:void { circ.x stage . stageWidth I 2 - circ.y stage.stageHe ight I 2 - circ.width I 2; circ.height I 2; quad.x stage . s t age Width - quad.y stage.stageHeight - quaà.heigh t; private f unction o nClick(e:MouseEvent) :void stage.displ ayState (stage.àisplayState ==.StageD isP.l aySta t e .NORMAL) StageDi sp l a yState.FULL_SCREEN StageDi sp layState.NORMAL; '"c 5:::> .. ::; ::; E 1\.16 '"ti www.eng.com.br ACT'ON SCR'PT :3 - LEVEL:3 ,""-1 iii Adobe "';' . ";(.,- OO ":,;( . ENG Módulo 19 ACESSANDO AIMPRESSORA - Imprimindo como um Vetor ou Bitmap - Escolhendo entre impressão Horizontal ou Vertical - Deleclando a possibilidade de Impressão - Imprimindo uma página ENG ACESSANDO A IMPRESSORA A classe PrintJob nos dá a funcionalidade necessária para imprimir no Flash. PrintJob.startO Moslra a caixa de diálogo de impressão do sislema operacional e inicia o spooling PrintJob.addPageO Adiciona uma página à fila de impressão PrintJob.send() Envia as páginas carregadas na fila de impressão para a Impressora. Com esta Classe podemos imprimir páginas de confmração. recibos. I!ckets. lolos. ou qualquer oui ra coisa que necessite ser colocada no papel IMPRIMINDO COMO UM VETOR OU BITMAP Uma das possibilidades de melhorar a impressão no AclionScripl com imagens é passar o parâmetro lrue dentro do construtor da classe PrintJobOpiions o default é false. imp ort Elash.printing.PrintJobOptions; v a r options:Pr intJobOpti o ns n ew Prin t J obOp t io n s( ) ; ESCOLHENDO ENTRE IMPRESSÃO HORIZONTAL OU VERTICAL Para escolher como será a posição da impressão no papel. ulilize a classe Pri ntJo bO rienlat ion. import fla s h.printing.Print JobO ri e ntation PrinlJobOrientalion.LANDSCAPE Imprime horizontatmente. PrintJobOrientation.PORTRAIT Imprime verticalmenle. ,.;" ENG DETECTANDO APOSSIBILIDADE DE IMPRESSÃO Muitas das vezes o usuário não possui a capacidade de imprimir em seu ambiente de trabalho, ou seja. não possui impressora instalada nem em sua máquina nem conectada a sua rede de trabalho. Para verificar isso utilize a classe Capabilities. import flash.system.Capabilities; if{Capabilities.hasPrinting) { l/Código para impressão IMPRIMINDO UMA PÁGINA No código abaixo veremos como imprimir realmenle um objelo Sprile ou uma de suas classes de especialização como o MovieClip A ordem dos métodos da classe PrintJob devem ser respeitados. import flash.printing.PrintJob; import flash.printing.FrintJobCptions; import flash.printing PrintJobCrientation; import flash.system.Capabilities; import flash.geom.Rectangle; import var quadro:Sprite new Sprite(); = quadro.graphics.beginFill{Math.random{)*OxFFFFFF) ; quadro.graphics.drawRect(O, o, 100, 100); quadro.graphics.endFill() ; quadro.x quadro.y = = stage.stageWidth / 2 - quadro.width / 2; stage.stageHeight / 2 - quadro.height I 2· addChild(quadro) ; var rect:Rectangle stage.stageWidth, = new Rectangle(O, stage.stageHeight); var imprime:PrintJob o new PrintJob{); var options:PrintJobOptions = PrintJobOptions() ; if(Capabilities.hasPrinting) { new o, EI\JG ,. ACTION SCRIPT :3 - LEVEL :3 . www.eng.com.br DI -I' :1:f'; imprime.start() ; .0: imprime.addPage(quadro, rect, op tions , O) imprime . o rientati a n PrintJ obOr i e nt a tion.LAND SCAPE; impr ime.se nd() ; o mélodo addPage aceila os seguinles parâmelros: largel. onde largel é o caminho do objelo a ser impresso. Ex: formularia. ficha prinlArea (Opcional): Coordenadas Que identificam a área de impressão no seguinle formalo: var rect : Rec t ang le n ew Rect a ngle(x, y , width. height) ; opoons (Opcional): Esla opção define se o Que será impresso será ou não transformado em bitmap antes. Éaconsefhável Que esta opção seja alivada em casos em Que o filme a ser im presso lem eteitos. imagen s e transparências: senão pode manler o padrão Formato : var options:Pr intJobOptions n ew PrintJobOptions ( ) ; lrameNumber (Opcional): Oframe do ri lme. especificado no parâmelro largel, a ser impresso. . .....; ..