Arquivo

Arquivo da Categoria ‘Actionscript’

TextField! I said… DON’T SCROLL WITH ME!!

11, Outubro, 2009 yarcub Nenhum comentário

Já alguma vez se deparam com a seguinte situação?

Criam um TextField com o texto multi linha, seleccionável  e com autoSize. Tudo porreiro até que resolvem seleccionar o texto até o fim e por mania do flash player este faz scroll de uma linha. Argh! F******! :(
Ler mais…

as3ocalelibrary

14, Junho, 2009 yarcub Nenhum comentário

Desde ontem está disponível no Google Code o código fonte, documentação e um novo exemplo que melhor demonstra como utilizar a livraria.

Mais uma vez, feedback é sempre bem-vindo.

http://code.google.com/p/as3localelibrary/

Conteúdo Localizado em AS3

11, Abril, 2009 yarcub Nenhum comentário

O título deste post pode não ser o mais feliz, mas à falta de melhor tradução é que se pode arranjar. :)

O que quero eu dizer com localizar o conteúdo? Disponibilizar ao utilizador da aplicação/site informação no idioma que melhor se adeque, trocando por miúdos… multilíngua.

O Flash IDE de algumas versões para cá que incorpora uma ferramenta para o fazer, Strings Panel, mas nunca me predispus a perceber até que ponto era flexível para colocar a funcionar fora do ambiente Flash IDE.
Posto isto, há cerca de 6 meses resolvi tentar criar uma pequena livraria que simplifica o processo mas até há pouco tempo nunca tinha tido a oportunidade de a testar num ambiente de produção. Como fiquei satisfeito com o resultados resolvi abrir este projecto ao público para ter um maior feedback e conseguir evolui-lo.

A estrutura é a seguinte:

Estrutura de classes
  • A classe LocaleManager (Singleton) gere o carregamento dos diferentes ficheiros de linguagem, em xml, consoante a necessidade e informa todos as instâncias que estejam registadas.
  • A classe LocaleContainer é a base dos elementos visuais que contenham elementos que necessitem de localização. Classes que a estendam apenas estão registadas no manager enquanto pertencem à Display List, e apenas assim recebem notificação quando é mudado o idioma. Sempre que uma classe que implemente o interface ILocaleComponent é adicionada à Display List o LocaleContainer guarda a sua referência para notificar quando for notificado pelo manager, uma espécie de notificações em cadeia.
  • As classes que queiram ser notificadas quando ocorre uma mudança de idioma têm necessariamente de implementar o interface ILocaleComponent, garantido assim que dispõem de um método público através do qual podem ser notificadas e actualizarem o que necessitem.

Isto é a base e algo que é efectuado “under the hood“, o exemplo seguinte mostra a simplicidade em utilizar esta solução.

O plugin de syntax highlight da minha instalação do wordpress tirou o dia para me por fora do sério e parece-me mais saudável para o meu teclado que disponibilize o exemplo juntamente com a source e documentação. ;)

Gostava de receber algum feedback se experimentarem com exemplos/sugestões/correcções que ajudem a melhorar o projecto.

DOWNLOAD AS3LOCALELIBRARY

Criar templates no FlashDevelop.

4, Agosto, 2008 yarcub Nenhum comentário

Se nesta altura está a pensar o que será o FlashDevelop, aconselho a leitura de um post anterior (Flash em ambiente Open Source).

A utilização de templates pode aumentar bastante a produtividade ganhando tempo em tarefas repetitivas, e.g. ao utilizar uma framework regularmente.

Ao criar um projecto já existem alguns disponíveis (Class, Event, MXML, etc) que servem a maioria dos propósitos, mas podemos adaptar/criar templates às nossas preferências pessoais (ou equipa) e assim uniformizar o código.

Exemplo
Criar o um interface com um bloco de comentário com uma licença (MIT neste caso).

  • "Tools->Custom Arguments" inserir um par de valores, sendo assim possível adicionar qualquer argumento não disponível.
  • "Tools->Applications Files" abre a pasta onde estão os ficheiros que permitem personalizar a aplicação. Crie um ficheiro "Interface.as.fdt" na pasta "./Templates/ProjectFiles/AS3Project/" com o seguinte:
Actionscript:
$(LicenceMIT)
package $(Package)$(CSLB) {

public interface $(FileName)$(CSLB) {
$(EntryPoint)

}

}

Agora está disponível para adicionar a qualquer projecto AS3.

Template de um interface

O código gerado:

Actionscript:
/**
Copyright (c) 2008 Nuno Rosa, http://www.nunorosa.com

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
*/
package com.nunorosa.sample
{

public interface SampleInterface
{

}

}

Simples e eficaz, mais informações disponíveis na documentação do FlashDevelop.

42 69 6e e1 72 69 6f 73 20 65 6d 20 41 53 33 – PARTE I

10, Junho, 2008 yarcub Nenhum comentário

Mas que raio de título!!

Num post anterior mencionei a possibilidade de na nova versão do Flash Player (10) ser possivel ler um ficheiro localmente, mas com a limitação de apenas termos acesso aos dados do ficheiro; nunca temos acesso à sua localização física propriamente dita. Esta limitação deve-se sobretudo a preocupações de segurança por parte da Adobe.

Em certos casos, pode ser suficiente (ficheiros ASCII, imagens, swfs) mas para outros não. Desde a introdução da versão 9 do player (e consequentemente Actionscript 3.0) que é possível manipular informação binária através da classe ByteArray do package flash.utils. Não sei se já imaginaram as possibilidades que isto permite, mas para mim o mais óbvio é manipular quase qualquer tipo de dados desde que conhecida a organização do formato.
Exemplos:

* Gerar documentos pdf's simples
* Editar video/áudio
* Codificar imagens (jgp, png, etc)

Exemplo:

Um ficheiro WAV, é um formato simples de áudio e que normalmente não tem a informação "comprimida" o que faz com que seja simples ler as amostras PCM e injectar no buffer de som (ler post anterior). O objectivo é criar uma classe simples que possa ler os dados, fazer o parse dos dados e finalmente fazer o playback do áudio da maneira mais semelhante possível à API da classe Sound.

Primeiro passo, encontrar informação sobre o standard (se o for) ou o mais consensual possivel. Podem ver o que consultei no seguinte link.
A estrutura de um ficheiro Wav utiliza o standard RIFF (Resource Interchange File Format) que está organizado em blocos. Esses blocos têm sempre a mesma estrutura independetemente dos dados que contêm.

Bloco ID - 4bytes (ASCII)
Tamanho dos dados - 4bytes (unsigned int)
Dados - n bytes descritos no campo anterior

Apesar de um ficheiro poder conter mais blocos os únicos que nos interessam são o cabeçalho do ficheiro, o bloco "fmt" (informações sobre taxa de amostragem, codificação, etc) e o bloco "data" (amostras).

Podem ver o exemplo (LINK), o código fonte fica para um próximo post porque ainda queria acrescentar algumas funcionalidades e confesso que o tempo escasseia.
(Nota: De momento apenas ficheiros codificados a 16bits e com uma freq. de amostragem 44.1KHz)

UPDATE: Este post foi publicado quando o flash player 10 ainda estava em fase beta, algumas parte da API mudaram para a versão release o que faz com que o código deste exemplo não funcione.

AS3 Workshop slides, Grant Skinner

5, Junho, 2008 admin Nenhum comentário

Muitos dos oradores em conferências/eventos têm o excelente hábito de disponibilizar o seu material de apoio após as mesmas.

O  Grant Skinner disponibilizou hoje os slides (167!!) utilizados num workshop dado por ele ao longo do último ano que consistia num dia intensivo sobre as novidades em AS3, migração de AS2 e dicas.
Apesar de normalmente os slides apenas terem alguma informação para apoiar a audiência a seguir o orador "in-loco" posso dizer que estes slides são +/- fáceis de seguir e contêm exemplos que permitem ver em funcionamento o assunto que abordam.

Isto conjugado com um bom livro de referência em AS3, acho que se pode tirar um bom proveito. Boas experiências.

PS: Nos próximos dias vou postar um exemplo de como fazer o parse de um ficheiro wav local e injectar os dados no buffer de som.

Astro – FileReference + Sound API

24, Maio, 2008 yarcub Nenhum comentário

Sound API

Mais um post sobre as novas funcionalidades do Flash Player 10.

Depois de ter visto uma entrada no Coisas Interactivas sobre uma aplicação de scratching numa Nintendo DS, lembrei-me de procurar o que já havia sido feito pela comunidade com as potencialidades da nova Sound API que permite um acesso de baixo nível às amostras de áudio. Ainda não existe nada de tão elaborado, mas é expectável que assim que saia a release final do plugin aparecam frameworks à semelhança com o que aconteceu com o 3D.

As novidades são o evento flash.events.SamplesCallbackEvent que é disparado quando as amostras no buffer estão a acabar para que se possa injectar novas amostras. É por exemplo o ideal para ter um loop limpo, i.e., contínuo e sem atraso.
Associado a este evento existe uma propriedade da classe Sound que permite injectar amostras directamente no buffer, samplesCallbackData do tipo ByteArray.

Isto pode ser visto em acção:

A novidade mais interessante é quando conjugamos a funcionalidade anterior com um novo método da classe Sound que permite extrair informação do áudio, por exemplo um ficheiro carregado do servidor ou até mesmo um ficheiro carregado localmente (mais adiante). Como é fácil de imaginar as potencialidades são enormes: equalização, efeitos, edição, etc.

(...).extract(target:ByteArray, length:Number, startPosition:Number =-1):Number

O protótipo do método é intuitivo mas o que faz é copiar n amostras (length) para um instância ByteArray e como parâmetro adicional é possível definir a posição da primeira amostra (startPosition), por defeito o ponteiro não é alterado entre leituras. Ou seja; se lermos 1024Bytes numa primeira leitura, na segunda leitura o ponteiro vai apontar para o 1025º Byte. Por fim o método devolve o número de Bytes lidos.
Nota: O número de amostras tem de estar compreendido entre 512 e 8192.

Antes de injectar as amostras, estas podem ser manipulas. No exemplo de equalização, separar as diversas bandas com um banco de análise -> Amplificar/Atenuar cada banda -> obter as amostras alteradas com um banco de síntese.

Alguns exemplos em acção:

FileReference

Esta API já existia em versões anteriores do Flash Player e é utilizada para controlar a transferência de um ficheiro entre cliente e servidor. Até agora para manipular um ficheiro presente no cliente era necessário fazer o upload para o servidor e carregar de volta para o Flash Player presente no cliente. Como é fácil de ver se a operação implicar manipular e devolver um ficheiro do cliente o processo pode ser moroso.

No Astro foram introduzidos dois métodos para ler/salvar um ficheiro localmente mas necessitam de interacção com o utilizador prévia, i.e., não é possível antes de o utilizador indicar qual o ficheiro. Mais detalhes sobre estes novos métodos podem consultados na documentação oficial, indicada pelo Lee Brimelow (Platform Evangelist da Adobe) .

Exemplo

Para finalizar fiz um exemplo básico utilizando ambas API's.
Ler um ficheiro local e mudar a sua velocidade de reprodução apenas à custa de descartar amostras em intervalos regulares.( método pouco robusto)

Existe um problema que é o seguinte: as amostras a ser injectadas no buffer têm de ser em formato PCM mas os dados que temos acesso ao ler o ficheiro correspondem ao ficheiro mp3 que está codificado.
Por isso é necessário usar um workaround que se sustenta na capacidade do Flash Player criar um SWF em bytecode na memoria. O método não paece muito simples (1,2), mas felizmente hoje o (?)Christopher Martin-Sperry (FlexibleFactory) disponibilizou um biblioteca que faz o serviço por nós com a nuance de perder a informação relativa à ID3 tag no processo. No final obtem-se um objecto Sound com o qual já podemos utilizar o método extract() para ter acesso a amostra codificadas em PCM.
Ler mais...

Compilar para o Flash Player 10

20, Maio, 2008 yarcub Nenhum comentário

Enquanto a Adobe não disponibiliza um update para o Flash CS3 é necessário utilizar o compilador mxmlc presente nas Nightly Builds do Flex 3 SDK desde o dia 15 de Maio. Para quem usa o FlashDevelop, foi lançado um update com suporte para o Flash Player 10 e os passos de configuração podem ser vistos no seguinte LINK.

Apesar de ainda não existir documentação oficial (a API ainda pode mudar até à release final) já existem alguns tutoriais e artigos sobre as novas funcionalidades, deixo aqui uma lista do que encontrei até agora:

Tal como muitos estou expectante para ver as novas funcionalidades em acção, se souberem de outros que não estejam nesta lista deixem um comentário. ;)

Entretanto para testar a compilação a partir do FlashDevelop, criei um pequeno exemplo do clássico Coverflow com o suporte de 3D nativo.

Nota: Não tem qualquer preloader e o movimento é cíclico, basta clicar em cima de uma das imagens.