Primeiros passos com o APE - Actionscript Physics Engine

Vou começar esse tutorial sobre APE explicando o que basicamente é ele :)

O APE é um engine feita em C++ e portada para actionscript 3.0 que facilita aplicativos envolvendo fisica no Flash :)

Existem muitas outras engines tais para o mesmo propósito tais como:

Entre algumas outras que eu devo ter esquecido! haha Porem por esta engine ser conhecida no C, e realmente ser EXTREMAMENTE simples de usar!

Vamos a um pequeno exemplo, bem simples, que ja mostra boa parte do que é necessário:

(Either JavaScript is not active or you are using an old version of Adobe Flash Player. Please install the newest Flash Player.)

Veja o código abaixo

stage.quality = "BEST";
import flash.events.Event;
import org.cove.ape.*;
//Iniciando Engine
APEngine.init(1/4);
APEngine.container = this;
APEngine.addForce(new VectorForce(false, 0, 4));
//Criando Grupo
var apeGroup:Group = new Group();
apeGroup.collideInternal = true;
//Adicionando Grupo para Engine
APEngine.addGroup(apeGroup);
//Criando step no enterFrame do Stage, para rodar a API
function run(e:Event):void
{
	APEngine.step();
	APEngine.paint();
 
}
function init(e:Event)
{
	startMc.visible = false;
	addEventListener(Event.ENTER_FRAME, run);
	var cParticle:CircleParticle = new CircleParticle(175, 0, 5);
	cParticle.setFill(0x444444 * Math.random() + 0xbbbbbb);
	cParticle.setLine(0, 0xff0000, 0);
	apeGroup.addParticle(cParticle);
}
startMc.addEventListener(MouseEvent.MOUSE_DOWN,init);

Basicamente ela funciona assim:

  1. Iniciando APE
  2. Criando Objetos
  3. Criando Grupos
  4. Adicionando Objetos ao Grupo
  5. Adicionando Grupo a APE
  6. Rodando a Engine em um ENTER_FRAME;

Iniciando ENGINE:

  • APEngine.init é o metodo que deve ser chamado para iniciar a ENGINE, passando o valor do delta para ela, este valor é basicamente a força das equações de sua aplicação, quanto menor o numero/mais cálculos serão feitos, e mais preciso será sua física, porem mais lenta, por default é utilizado 1/3 ou 1/4.
  • APEngine.addForce Isso aqui você define um valor padrão para a massa dos objetos que vai ter no seu aplicativo, você seta um valor default, ou seja, não precisa declarar em todos os objetos.
  • APEngine.container é aonde fica o o stage da mesma, você pode controlar fisicas separadas para varios objetos com isso.

Criando Objetos

  • var cParticle:CircleParticle = new CircleParticle(Math.random()*350, 0, 5); Criando um objeto da classe Circulo, em uma posição randomica entre 350~0, na posição y:0, e com raio 5.
    cParticle.setFill(0x444444 * Math.random() + 0xbbbbbb);
    Setando um preenchimento randomico.
    cParticle.setLine(1, 0xff0000, 0);
    Setando uma linha de 1 pixel.

Criando Grupos

  • var apeGroup:Group = new Group(); Criando um grupo
    apeGroup.collideInternal = true; passando a Colisão entre objetos interna do grupo como verdadeira.

Adicionando Objetos aos Grupos

  • apeGroup.addParticle(cParticle); Simplesmente dizendo que a bola criada a pouco, pertence ao grupo apeGroup

Adicionando o grupo a APE

  • APEngine.addGroup(apeGroup); Adicionando o grupo para a APE

Rodando a Engine em um ENTER_FRAME;

  • APEngine.step(); Realiza os cálculos necessários para a fisica
    APEngine.paint();
    Pinta os obejtos na tela!

É uma Engine muito simples e pratica de trabalhar, no exemplo abaixo, vou adicionar um retângulo para colisão do objeto:

(Either JavaScript is not active or you are using an old version of Adobe Flash Player. Please install the newest Flash Player.)

stage.quality = "BEST";
import flash.events.Event;
import org.cove.ape.*;
//Iniciando Engine
APEngine.init(1/4);
APEngine.container = this;
APEngine.addForce(new VectorForce(false, 0, 4));
//Criando Grupo
var apeGroup:Group = new Group();
apeGroup.collideInternal = true;
//Criando Chão
var rParticle:RectangleParticle = new RectangleParticle(150, 295, 300, 10, 0, true);
apeGroup.addParticle(rParticle);
//Adicionando Grupo para Engine
APEngine.addGroup(apeGroup);
//Criando TIMER para adicionar bolas
var timer:Timer = new Timer(100);
timer.addEventListener(TimerEvent.TIMER,addBall)
 
//Criando step no enterFrame do Stage, para rodar a API
function run(e:Event):void
{
	APEngine.step();
	APEngine.paint();
 
	for each(var p:AbstractParticle in apeGroup.particles)
	{
		if(p.py > 300)
		{
			apeGroup.removeParticle(p);
		}
	}
 
}
function init(e:Event)
{
	startMc.visible = false;
	stage.addEventListener(Event.ENTER_FRAME, run);
	timer.start();
}
function addBall(e:TimerEvent):void
{
	var cParticle:CircleParticle = new CircleParticle(Math.random()*350, -20, Math.random()*10+5);
	cParticle.setFill(0x444444 * Math.random() + 0xbbbbbb);
	cParticle.setLine(0, 0xff0000, 0);
	apeGroup.addParticle(cParticle);
}
startMc.addEventListener(MouseEvent.MOUSE_DOWN,init);
startMc.buttonMode = true;

No exemplo acima, eu simplesmente adicionei um objeto da classe RectangleParticle, na posição x:150 (tudo na APE é centralizado) y:295, largura: 300, altura: 10

var rParticle:RectangleParticle = new RectangleParticle(150, 295, 300, 10, 0, true);

E adicionei ela ao meu grupo:

apeGroup.addParticle(rParticle);

Outra coisa interessante nisso, é que eu removo as mesmas, quando elas passam de y>300, ou seja, saem do stage.
No função run, eu tenho a seguinte verificação:

for each(var p:AbstractParticle in apeGroup.particles)
{
	if(p.py > 300)
	{
		apeGroup.removeParticle(p);
	}
}

Ou seja, toda particula que eu tiver dentro do meu grupo, que exceder a posição y ou seja: py em 300 eu removo ela!

Matéria Primitivas

Na APE, temos basicamente 3 tipos de matérias primitivas, são elas:

  • Rectangle
  • Circle
  • Whell

E temos uma matéria somente para ligação das mesmas:

  • Spring Constrain

Aqui em baixo tem um exemplo bem tosco :S dos tipos de objetos:

(Either JavaScript is not active or you are using an old version of Adobe Flash Player. Please install the newest Flash Player.)

Baixe aqui todos os experimentos

Por enquanto é isso! Assim que possivel, postarei um aplicativo que estou trabalhando, melhor feito com essa engine!!!

Share and Enjoy:
  • Digg
  • del.icio.us
  • Netvouz
  • description
  • ThisNext
  • MisterWong
  • Wists

Tags: ,

3 Responses to “Primeiros passos com o APE - Actionscript Physics Engine”

  1. Cláudio says:

    Muito bacana os exemplos. Na sua opinião o APE é a melhor engine pra quem quer começar?

  2. admin says:

    @Cláudio

    Sem duvidas! Se estiver procurando uma engine simples, e robusta para física em AS3 APE é sem duvidas a mais indicada!

  3. Cialis says:

    Nice site.
    Thanks, webmaster.

Leave a Reply