Curso AS3

Acessando biblioteca externa usando AS3

October 1st, 2010

Em alguns dos projetos que trabalhei precisei utilizar bibliotecas externas, o uso do mesmo era indispensável, o que facilitou muito o trabalho em equipe, principalmente com as atualizações.

Abaixo segue um script bem simples de como acessar a biblioteca externa. Lembrando que o acesso é feito pelo nome do linkage dado ao objeto.

loadLibrary();
 
function loadLibrary():void
{
	var ld:Loader = new Loader();
	ld.load( new URLRequest( 'biblioteca.swf' ) );
	ld.contentLoaderInfo.addEventListener( Event.COMPLETE, libraryLoaded );
}
 
function libraryLoaded( evt:Event ):void
{
	var ldinfo:LoaderInfo = evt.target as LoaderInfo;
 
	var bola:Class = ldinfo.applicationDomain.getDefinition( 'bola' ) as Class;
 
	var mcBola:MovieClip = new bola() as MovieClip;
	addChild( mcBola );
}

Curso Papervision3D

May 26th, 2010

Com o curso de AS3 que foi lançado em 2007 eu obtive um retorno muito bacana, ele foi enviado para todos os estados do Brasil, e devido a pedidos eu montei um novo material sobre Papervision3D baseados nos treinamentos que dei sobre ele, fiquei muito contente com o resultado final.

O site com informaçãoes é http://ericksouza.com/curso/papervision3d/.

Adobe Flash CS5 Trial disponível para download

April 30th, 2010

A versão trial de 30 dias do Flash CS5 está disponível para download. A versão Windows tem 858MB e a versão Mac 1.61GB.

Desenvolvimento Flash-iPhone enfrenta problemas

April 12th, 2010

Mudança nos termos de uso do iPhone Developer Program License Agreement proíbe o uso do Adobe Flash CS5 para o iPhone.

3.3.1 — Applications may only use Documented APIs in the manner prescribed by Apple and must not use or call any private APIs. Applications must be originally written in Objective-C, C, C++, or JavaScript as executed by the iPhone OS WebKit engine, and only code written in C, C++, and Objective-C may compile and directly link against the Documented APIs (e.g., Applications that link to Documented APIs through an intermediary translation or compatibility layer or tool are prohibited).

Entre todas as novidades da suite CS5, o desenvolvimento Flash-iPhone é uma das mais interessantes, eu realmente não esperava algo assim visto que até mesmo algumas apps desenvolvidas pela Adobe já estão no Apple Store há um tempo.

Sobre o Adobe Flash CS5

October 17th, 2009

O beta do Adobe Flash CS5 estará disponível no Adobe Labs antes do final de 2009 e já foram divulgadas novidades muito interessantes.

  • Integração ao Flash Builder, o editor de Actionscript atual do Flash comparado ao Flash Builder é muito inferior. A partir do Flash CS5 será possível editar as classes no Flash Builder.
  • Melhorias no Editor de Actionscript, code hinting e auto-completar para nossas próprias classes.
  • Code Snippets panel, podemos escrever códigos, como templates, e estes códigos ficam armazenados para podermos inseri-los nos projetos a qualquer momento.
  • XML based FLA files, novo formato de projetos baseado em XML visando facilitar o trabalho em equipe para gerenciamento e alterações.
  • Text Layout Framework (TLF), grandes melhorias para se trabalhar com textos; estilos e layouts avançados, textos em colunas, inline images, trabalho junto a moldes.
  • Aplicativos para iPhone, criar aplicativos para o iPhone a partir do Flash CS5.

Realmente muito animador saber que através do Flash CS5 será possível desenvolver em AS3 para o iPhone, e ainda mais interessante é que não serão swfs e sim apps nativas do iPhone.

A questão sobre swf não poder rodar no iPhone é pelo fato do Adobe Flash Player consumir muita memória e bateria do aparelho. A Adobe está trabalhando junto a Apple para solucionar isto no futuro.

Script Cube Sphere 3D no Flash CS4

October 13th, 2009

Retirei do Google Code os scripts que escrevi sobre objetos 3D usando os novos recursos do CS4.

Eu os escrevi no lançamento do CS4 para conhecer os novos recursos, na época achei divertido e escrevi mais do que eu “deveria”.

Vou deixar os scripts neste post.

[update] Apenas uma observação, estas classes não são o início de uma Engine 3D, são apenas para estudos dos novos recursos. Ambas as classes foram escritas muito rapidamente, não há otimização alguma. =) [/update]

Read the rest of this entry »

Resultados, APE, Box2DAS3 e Motor2

May 27th, 2009

Após trabalhar mais com cada uma das três, o Motor2 conseguiu me convencer a largar o Box2DAS3. Vou colocar em forma de lista as minhas impressões sobre cada uma delas.

  • APE - A mais simples das 3 Physics Engine, está na versão 0.45, não é atualizada desde 2007 e não é possível rendeniza-la no Flash Player 10, pois a engine apresenta conflitos com objetos do tipo Vector.. apesar de tudo é possível fazer muito coisa legal, é simples, a curva de aprendizado é curta.
  • Box2DAS3 - A mais popular entre as 3 Physics Engine, não possui uma documentação, porém tráz vários exemplos, o necessário para se familiarizar com a engine. Além disto, por ser muito popular existe muito material fornecido pela comunidade que a utiliza.
  • Motor2 - Um outro port do Box2D C++, está na versão 0.9, muito completa, trabalha com pixel, diferente do Box2DAS3 que usa metros, e a impressão que fiquei é que ela possui um script mais limpo. A curva de aprendizado pode ser um pouco mais longa, por ser menos popular existem menos materiais disponíveis. Para quem conhece o Box2D acredito que não haverá problemas.

Toda Physics Engine não trabalhar com a colisão do DisplayObject, existe um objeto virtual e nós associamos um DisplayObject para representa-lo. No Motor2 não existe algo como setDisplay ou userData, você deve posicionar seu DisplayObject a partir dos dados fornecidos pela engine, como é uma dúvida comum, penso que vale comentar.

Finalmente indico o Motor2 pois gostei mais de seu script, mas o Box2dAS3 não fica devendo em nada. Caso você prefira “sofrer” menos no sentido de suporte, o Box2DAS3 é mais indicado. Pra quem pretende desenvolver coisas muito simples e não quer “perder tempo”, o APE pode ser um caminho.

Vale conferir o blog do Michael do Motor2, a development mailing list também pode ser útil.

Flex Builder passará a ser Flash Builder

May 21st, 2009

Parece que os rumores foram confirmado, o Flex Builder passará a se chamar Flash Builder em sua próxima versão de número 4. Pessoamente eu adorei a decisão e penso que não há outro nome melhor, isso fortalece ainda mais a Flash Platform.

Lembrando que apenas o Flex Builder será renomeado, o Flex SDK continua com o mesmo nome.

Concerteza há quem fique triste, chateado com a mudança, lembro quando a Adobe comprou a Macromedia, na época creio que todos ficaram incomodados em ver os produtos receberem o Adobe no lugar do Macromedia.

Box2DFlashAS3, uma poderosa Physics Engine

April 28th, 2009

Na sequência do tour entre as Physics Engine Actionscript, segue o Box2DFlashAS3, uma versão AS3 pelo Matt Bush do Box2D, uma Physics Engine C++ por Erin Catto’s.

O Box2DFlashAS3 merece atenção, é uma entre duas (Motor2) Physics Engine que possui recursos suficiente para trabalhar em projetos profissionalmente.

Observações a respeito do Box2DFlashAS3: possui muitos métodos, propriedades, o que garante não nos deixar “na mão”; trabalha com metros, porém é facilmente contornado, a proporção entre pixel e metros é 1/30; a engine não possui uma documentação oficial, é um ponto chato, mas nada que atrapalhe; a primeira vista pode parecer complicado comparado ao APE, por exemplo, mas é apenas uma questão de entender a estrutura.

O Motor2 é mais uma Engine baseada no Box2D, entrará na sequência e devo finalizar nele, as outras engines existentes são muito básicas. Caso alguém conheça alguma outra engine além das três citadas que seja bacana, por favor, comente a respeito. =)

Segue um exemplo bem simples, tentei deixar o script mais compacto possível para tornar fácil a comparação entre as engines.

package
{
	import flash.events.*;
	import flash.display.*;
	import flash.utils.*;
 
	import Box2D.Dynamics.*;
	import Box2D.Collision.*;
	import Box2D.Collision.Shapes.*;
	import Box2D.Common.Math.*;
 
	public class baseBox2D extends Sprite
	{
		private var world:b2World;
 
		public function baseBox2D():void
		{
			btnStart.addEventListener(MouseEvent.CLICK, onClick);
		}
 
		private function onClick(evt:MouseEvent):void
		{
			removeChild(evt.currentTarget as DisplayObject);
			this.init();
		}
 
		private function init():void
		{
			var floorWidth:Number = (stage.stageWidth - 50), floorHeight:Number = 6;
 
			var worldAABB:b2AABB = new b2AABB();
			worldAABB.lowerBound.Set(-100.0, -100.0);
			worldAABB.upperBound.Set(100.0, 100.0);
 
			world = new b2World(worldAABB, new b2Vec2(0.0, 10.0), true);
 
			var bodyDef:b2BodyDef = new b2BodyDef();
			bodyDef.position.Set(((floorWidth + 50) / 30) * .5, (stage.stageHeight - 30) / 30);
			bodyDef.angle = .08;
 
			var boxDef:b2PolygonDef = new b2PolygonDef();
			boxDef.SetAsBox((floorWidth * .5) / 30, (floorHeight * .5) / 30);
			boxDef.friction = .3;
			boxDef.density = 0;
 
			bodyDef.userData = new objFloor();
			bodyDef.userData.width = floorWidth; 
			bodyDef.userData.height = floorHeight; 
			addChild(bodyDef.userData);
 
			var body:b2Body = world.CreateBody(bodyDef);
			body.CreateShape(boxDef);
			body.SetMassFromShapes();
 
			var t:Timer = new Timer(1000);
			t.addEventListener(TimerEvent.TIMER, function(){ addObject(); });
			t.start();
 
			addEventListener(Event.ENTER_FRAME, this.onLoop);
		}
 
		private function addObject():void
		{
			var objDef:*;
			var v:Number = Math.round(Math.random() * 2) + 1;
			var dWidth:Number = (Math.random() * 30) + 60, dHeight:Number = dWidth / 1.5;
			var box:Object = {w: (dWidth * .5) / 30, h: (dHeight * .5) / 30};
 
			var bodyDef:b2BodyDef = new b2BodyDef();
			bodyDef.position.Set((Math.random() * stage.stageWidth) / 30, 0);
			bodyDef.userData = (v == 1) ? new samara() : ((v == 2)) ? new regiane() : new axl();
 
			bodyDef.userData.width = dWidth;
			bodyDef.userData.height = (v == 3) ? dHeight : dWidth;
			bodyDef.userData.x = bodyDef.userData.y = -500;
 
			if(v != 2) { objDef = new b2PolygonDef(); objDef.SetAsBox(box.w, (v == 3) ? box.h : box.w); }
			else { objDef = new b2CircleDef(); objDef.radius = box.w; }
 
			objDef.density = 1;
			objDef.friction = .3;
			objDef.restitution = .3;
 
			addChild(bodyDef.userData);
 
			var body:b2Body = world.CreateBody(bodyDef);
			body.CreateShape(objDef);
			body.SetMassFromShapes();
		}
 
		private function onLoop(evt:Event):void
		{
			world.Step(1 / 30, 10);
 
			for (var bb:b2Body = world.m_bodyList; bb; bb = bb.m_next)
			{
				if (bb.m_userData is Sprite)
				{
					bb.m_userData.x = bb.GetPosition().x * 30;
					bb.m_userData.y = bb.GetPosition().y * 30;
					bb.m_userData.rotation = bb.GetAngle() * (180 / Math.PI);
				}
			}
		}
	}
}

Coloquei três formas diferentes, quadrado (samara), retângulo(axl) e elipse (regiane).

This movie requires Flash Player 8.

APE Actionscript Physics Engine

April 16th, 2009

Estou testando algumas engines physics para Flash/ Flex. A engine APE do Alec Cove eu já conhecia, é simples e funciona bem, porém ainda está na versão 0.45a e possui poucos métodos/propriedades além do projeto estar parado há um bom tempo.

O APE foi escrito em Actionscript 3, mas para quem trabalha com AS2, a versão antiga do APE em AS2 é o Flade.

Abaixo segue um exemplo bem simples do APE, coloquei um botão para mudar a força da massa, porém a API ainda não possui um método para isto, improvisei reaplicando valores, mas não ficou legal.

PS. o APE não suporta ser exportado para Flash Player 10, existem conflitos entre objetos Vector.

package
{
	import flash.events.*;
	import flash.display.*;
	import org.cove.ape.*;
 
	public class baseAPE extends Sprite
	{
		private var myGrp:Group;
		private var n:uint = 1;
 
		public function baseAPE():void
		{
			stage.addEventListener(MouseEvent.MOUSE_DOWN, mDown);
			btn.addEventListener(MouseEvent.CLICK, mClik);
 
			this.initAPE();
			this.mClik(null);
		}
 
		private function initAPE():void
		{
			var largFloor:Number = (stage.stageWidth - 50);
 
			APEngine.init(1/3);
			APEngine.container = this;
 
			myGrp = new Group();
			myGrp.collideInternal = true;
 
			myGrp.addParticle(new RectangleParticle(100, 200, 150, 2, 0.3, true));
			myGrp.addParticle(new RectangleParticle(380, 150, 200, 2, -0.3, true));
			myGrp.addParticle(new RectangleParticle((largFloor * .5) + 25, stage.stageHeight - 20, largFloor, 6, 0, true));
			myGrp.addParticle(new RectangleParticle((largFloor * .5) + 25, 20, largFloor, 6, 0, true));
 
			APEngine.addGroup(myGrp);
 
			addEventListener(Event.ENTER_FRAME, onLoop);
		}
 
		private function mDown(evt:MouseEvent):void
		{
			if(btn.hitTestPoint(mouseX, mouseY)) return;
 
			var ball:CircleParticle = new CircleParticle(mouseX, mouseY, Math.random() * 20 + 10);
			ball.setFill(Math.random() * 0xFFFFFF);
			ball.setLine(0, 0, 0);
			myGrp.addParticle(ball);
		}
 
		private function mClik(evt:MouseEvent):void
		{
			var b:Boolean = btn.label == "Negative";
			btn.label = b ? "Positive" : "Negative";
 
			if(b) APEngine.addMasslessForce(new Vector(0 , n * -5)); else APEngine.addMasslessForce(new Vector(0 , n * 5));
 
			n = n + 1;
		}
 
		private function onLoop(evt:Event):void
		{
			APEngine.step();
			APEngine.paint();
		}
	}
}

This movie requires Flash Player 8.