November 25th, 2009
DataLib é uma classe de loading que controla todos os requests da sua aplicação e armazena todos os arquivos carregados para futuras solicitações. Eu venho usando sua versão anterior a mais ou menos um ano e meio e até agora ela vem trabalhando bem, mas eu decidi lançar uma nova versão com mais recursos e melhor usabilidade.
O conceito é simples. Cada instância da DataLib tem uma fila de carregamento, e cada instância é colocada numa fila de carregamento geral. Por padrão, 3 itens podem ser carregados por vez, mas você pode mudar o número de arquivos que podem ser carregados simultaneamente. Dessa forma um arquivo gigante não segura a sua aplicação até ser carregado, você pode usar outros slots para carregar o resto dos arquivos que sua aplicação precisa.
Outra vantagem é que você pode carregar arquivos de url’s dinâmica, por exemplo um php que retorna um xml ou imagem dependendo dos parâmetros enviados.
Você pode também acessaro qualquer dado carregado a partir de qualquer lugar de sua aplicação mesmo que não tenha acesso a instância que solicitou o carregamento. Isso porque todos os arquivos são armazenados na classe estática. Outra coisa é que se você fizer um request de arquivo que ja foi carregado, o DataLib pega os dados da biblioteca, economizando algum (ou muito) tempo de carregamento. Caso você se preocupe com o uso de memória, é possivel excluir arquivos da biblioteca a qualquer momento.
Read the rest of this entry »
Posted in as3 | 2 Comments »
July 24th, 2009
Estou honrado em anunciar que o meu TCC foi selecionado para o FILE 2009 São Paulo. Foram 6 meses pesquisando o trabalho de Alexander Calder e 6 meses construindo uma experiencia interativa de web art. Na época eu estava começando com PaperVision e WOWEngine, mas no final todo trabalho valeu a pena. Depois de 1 ano, eu preciso fazer alguns ajustes e corrigir muitos bugs para esse festival. Se eu tiver algum tempo, provavelmente refazer tudo.
http://www.espacoemovimento.com.br
Tags: award
Posted in as3, works | 1 Comment »
May 6th, 2009
No ultimo post eu comecei a falar sobre som dinâmico no flash. Agora nos vamos fazer algo mais prático com o que vimos. Vamos criar um piano que toca notas clicando ou apertando as teclas.
Não vamos perder tempo criando o piano, então você pode baixar esse modelo aqui.
This movie requires Flash Player 9
Começando desse ponto, nós precisamos criar uma instância de som, uma instância de SoundChannel, adicionar o listeners e executar o som.
private var sound:Sound;
private var channel:SoundChannel;
public function Main():void{
init();
sound = new Sound();
sound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData);
channel = sound.play();
}
private function onSampleData(e:SampleDataEvent):void{
}
Read the rest of this entry »
Tags: as3, audio, dynamic, sound, source
Posted in as3 | 7 Comments »
April 27th, 2009
Eu passei as duas ultimas semanas trabalhando num projeto envolvendo som. Infelizmente não posso mostra-lo ainda, mas meu objetivo era tocar um monte de notas musicais em um intervalo especifico. A primeira coisa que eu tentei fazer foi carregar um monte de samples e toca-los quando precisasse, mas o desempenho ficou muito baixo com isso. Então minha solução foi procurar no Google e no lab do Andre Michelle para entender como trabalhar com sons dinamicos.
Bom, ainda estou aprendendo, mas eu acho que muitas pessoas gostariam de trabalhar com isso e não tem a menor ideia por onde começar, por isso espero que esse post seja util para essas pessoas.
A primeira coisa que precisamos entender é que o som é uma onda, e essa onde pode ter diferentes formatos dependendo do som que você está ouvindo.

Read the rest of this entry »
Tags: as3, audio, sound, tip
Posted in as3 | 10 Comments »
April 15th, 2009
OK, let’s begin talking about Design Patterns.
The best thing of OOP, is the capability to create something in way to reuse it in another situation by defining some patterns to follow. Basicly this is Design Patterns. There are several kinds of Patterns and one of them is the Singleton Pattern. It consists in create only one instance of a class and control it by global functions and properties. Unless you are using a multi-touch device, a good example of usage is a CustomCursor class. There is no need to create more than one instance of a custom cursor, because you can point to only one thing at time. However you can change your cursor behavior from anywhere in your application.
The Basics
Let’s create our Singleton class
package {
import flash.display.Sprite;
public class CustomCursor extends Sprite {
private static var _instance:CustomCursor;
public function CustomCursor(singleton:SingletonEnforcer):void{
}
public static function getInstance():CustomCursor{
if(CustomCursor._instance == null){
CustomCursor._instance = new CustomCursor(new SingletonEnforcer());
}
return CustomCursor._instance;
}
}
}
class SingletonEnforcer {
public function SingletonEnforcer():void{
}
}
Read the rest of this entry »
Tags: as3, cursor, mouse, pattern, source, tip
Posted in as3 | No Comments »
April 6th, 2009
Alguns dias atráz eu postei um experimento de um PaperPlane que eu fiz para testar um controle de vôo, mas durante o teste eu me lembrei do filme Tron pelo visual e tive a idéia de transformar aquilo em um jogo. Foi essa a razão de colocar aquele rastro no avião.
Bom, esse é o primeiro teste do que pode ser tornar um jogo multiplayer baseado no Tron. Provavelmente eu vou mudar o visual, mas o trabalho estará na
construção da AI, detecção de colisão e comunicação entre os jogadores. Espero não desistir desse projeto, mas por enquanto divirta-se dirigindo sua moto.

Tags: 3d, as3, game, lab, papervision
Posted in as3 | 5 Comments »
April 3rd, 2009
Uma dos piores problemas que um desenvolvedor tem de enfrentar é o desempenhos de suas aplicações. Existem diversos fatores contribuindo para um mau desempenho, um deles é a renderização dos gráficos.
Dependendo de como você está fazendo, existe uma linha de código que resolve esse problema.
stage.quality = StageQuality.LOW
Quando você define a qualidade do stage como low, você diz para o flash renderizar todos os vetores sem suavização. Isso melhora drásticamente a performance. Contudo, isso pode fazer com que sua aplicação fique horrível dependendo da maneira que você a constroi. Existem algumas coisas que você pode fazer para balancear a performance e a qualidade visual.
A primeira delas é definir o alias mode ddo seus textos como ADVANCED ou se for um texto estático como Anti-alias for readability.
This movie requires Flash Player 9
Outra dica é usar bitmaps em vez de vetores. Claro que você precisa escolher direito quais graficos precisam ter uma boa qualidade e o tamanho deles. Você podem também mudar a qualidade da sua imagem através do painel de propriedades para obter um arquivo menor. Entretanto você precisa tomar cuidado com isso, pois os seus bitmaps não vão suavizar caso você rotacione ou mude sua escala.
Eu não pesquisei porque os bitmaps não distorcem quando a qualidade está como low, mas eu acho que o flash não precisa calcular qual cor cada pixel vai ter quando é exibido, todas as cores já estão definidas pelo bitmapData.
Com isso em mente, eu criei uma classe de conteiner com alta qualidade, chamada HQContainer, que renderiza todos os seus filhos com a qualidade que você quiser (low, medium, high, best).
Read the rest of this entry »
Tags: as3, performace, source, tip
Posted in as3 | 3 Comments »
April 2nd, 2009
Atualmente as engines 3D estão muito presentes em aplicações web. Com o ActionScript3 foi possível desenvolver bibliotecas 3D velozes e com isso a tecnologia se difundiu rapidamente pela web. Hoje em dia temos engines 3D muito bem elaboradas como Papervision3D, Away3D, Sandy3D, Alternativa e muitas outras.
O uso é relativamente simples, uma vez que o cálculo por traz de qualquer biblioteca é automatizado e independe do entendimento do desenvolvedor. Porém eu acredito que é extremamente importante entender ao máximo o funcionamento de qualquer aplicação, biblioteca ou classe, seja pelo conhecimento ou para aprimorar algo que ja foi criado, implementando uma nova funcionalidade ou melhorando as existentes.
Independente da maneira como é construída, qualquer engine 3D, independente da liguagem de programação utilizada, compartilham de alguns elementos em comum, um deles é o que chamamos de Matrix de Transformação. Sim matrizes, aquilo que aprendemos no colégio e que não servia para nada até o dia que resolvemos virar desenvolvedores de aplicações gráficas. Mas antes de entender o que é uma matriz de transformação, precisamos entender o que ela faz. Para isso vamos pensar numa engine 3D de uma forma mais simplificada.
Por exemplo, vamos imaginar um cubo como um conjunto de 8 pontos conectados entre si:

Read the rest of this entry »
Tags: as3, matrix3d, source
Posted in as3 | 4 Comments »
March 31st, 2009
Custom Events se tornaram muito práticos no desenvolvimento de aplicações mais complexas.
Você pode cria-los para casos específicos e geralmente eles vêm acompanhados de parametros específicos.
Vamos dizer que você cria uma evento customizável para uma classe de vídeo player e você utiliza ele para checar eventos de carregamento e execução do vídeo, como play, pause, progresso da execução e quando ela termina. Então quando você cria esse evento, é precisso passar esses parametros de alguma forma. Diretamente como parametros opcionais, através de um object, array ou da forma que você achar mais adequada.
Entretanto, durante o carregamento de um vídeo, você precisa dos bytesLoaded e bytestotal, mas não precisa da tempo de execução atual. Outro caso é quando você dispara um evento dizendo que o stream foi pausado ou quando a execução termina, você não precisa de nenhum parâmetro além do tipo de evento. O problema (problema não, mais como uma encheção de saco) é que, para cada parâmetro, você precisa criar uma variável na sua classe para armazenar o valor passado, caso contrário você não conseguira passsar nenhum deles atravéz do evento.
Para evitar isso, você pode definir seu evento como dynamic class. Para aqueles que não sabem, classes dinamicas permitem que você crie propriedades nelas em tempo de execução, como movie clips. Assim você consegue passar qualquer parâmetro atravéz de um objeto como parâmetro opcional do evento e armazena-lo na classe, dessa forma:
package app.events {
import flash.events.Event;
dynamic public class CustomEvent extends Event {
public function CustomEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false, param:Object = null):void{
super(type, bubbles, cancelable);
if(param){
for(var i:String in param){
this[i] = param[i];
}
}
}
}
}
Então quando você precisar passar qualquer valor, você adiciona ele em um objeto:
dispatchEvent(new CustomEvent(CustomEvent.LOAD_PROGRESS, false, false, {bytesLoaded:135817, bytesTotal:521387}));
dispatchEvent(new CustomEvent(CustomEvent.VIDEO_PROGRESS, false, false, {currentTime:8.65}));
dispatchEvent(new CustomEvent(CustomEvent.PAUSE));
E recebe ele dessa forma:
function onLoadProgress(event:CustomEvent):void{
trace(Math.floor(event.bytesLoaded*100/event.bytesTotal)+"% loaded");
}
function onVideoProgress(event:CustomEvent):void{
trace("Current time:", event.currentTime);
}
function onPause(event:CustomEvent):void{
trace("Video paused");
}
Tags: as3, tip
Posted in as3 | 1 Comment »
March 27th, 2009
Desde que o papervision adicionou o Max3DS parser, eu venho usando ele invés de trabalhar com DAE. Entretanto existe um bug que eu notei quando importei um modelo assimétrico na minha cena. Ele estava espelhado no eixo X. Como estava correndo eu tomei o cmainho mais fácil, espelhei meu modelo antes de exportar o arquivo 3ds.
Depois disso eu tentei mudar o parser para importar o arquivo corretamente mas estava me tomando mais tempo do que eu tinha, então escrevi esse método para concertar o mesh depois do parsionamento.
Aqui está minha cena no 3D Max

Note que o cubo está atrás da chaleira e o cilindro na frente dela.
Aqui está uma imagem da cena no PPV quando eu importo eles usando o Max3DS

Depois de rodar meu script

Eu não testei ele para modelos mais complexos, mas ele vai funcionar em 90% dos casos.
Aqui está o script:
normalize(object3ds);
function normalize(max3ds:Max3DS):void{
max3ds.rotationX = 0;
max3ds.rotationY = 0;
max3ds.rotationZ = 0;
for each(var mesh:DisplayObject3D in max3ds.children){
mesh.scaleZ *= -1;
mesh.rotationX *= -1;
mesh.rotationY *= -1;
mesh.rotationZ *= -1;
var m:Matrix3D = new Matrix3D();
m.calculateMultiply(m, Matrix3D.rotationX(mesh.rotationX*Math.PI/180));
m.calculateMultiply(m, Matrix3D.rotationY(mesh.rotationY*Math.PI/180));
m.calculateMultiply(m, Matrix3D.rotationZ(mesh.rotationZ*Math.PI/180));
m.calculateMultiply(m, Matrix3D.scaleMatrix(mesh.scaleX, mesh.scaleY, mesh.scaleZ));
for(var i:Number = 0; i<mesh.geometry.vertices.length; i++){
var vertex:* = mesh.geometry.vertices[i];
var vx :Number = vertex.x;
var vy :Number = vertex.y;
var vz :Number = vertex.z;
var tx :Number = vx * m.n11 + vy * m.n12 + vz * m.n13 + m.n14;
var ty :Number = vx * m.n21 + vy * m.n22 + vz * m.n23 + m.n24;
var tz :Number = vx * m.n31 + vy * m.n32 + vz * m.n33 + m.n34;
vertex.x = tx;
vertex.y = ty;
vertex.z = tz;
}
mesh.rotationX = 0;
mesh.rotationY = 0;
mesh.rotationZ = 0;
mesh.scaleZ *= -1;
mesh.geometry.flipFaces();
}
}
Demo
Source
Tags: 3d, as3, demo, papervision, source, tip
Posted in as3 | 4 Comments »