Posts Tagged ‘source’

Dynamic Sound – Part 2

Wednesday, 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{
}

(more…)

CustomCursor advanced

Wednesday, 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{
	}
}

(more…)

Stage.quality vs performance

Friday, 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).
(more…)

Matrix3D 101

Thursday, 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:

cubo
(more…)

Papervision3D – Max3DS Parser bug

Friday, 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

objects

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

objects_fliped

Depois de rodar meu script

objects_normalized

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

PaperPlane Test

Tuesday, March 24th, 2009

Primeiros exprerimentos de nada que pode ser tornar algo

Use as setas para controlar o avião
Aumente a velociade pressionando espaço

Demo

plane

Source