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:
- Box2DFlashAS3
- WOW-Engine
- foam-as3
- Motor Physics
- Revive
- Flade (Flash Dynamics Engine)
- Fisix Engine
- glaze
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:
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:
- Iniciando APE
- Criando Objetos
- Criando Grupos
- Adicionando Objetos ao Grupo
- Adicionando Grupo a APE
- 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:
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:
Baixe aqui todos os experimentos
Por enquanto é isso! Assim que possivel, postarei um aplicativo que estou trabalhando, melhor feito com essa engine!!!







Muito bacana os exemplos. Na sua opinião o APE é a melhor engine pra quem quer começar?
@Cláudio
Sem duvidas! Se estiver procurando uma engine simples, e robusta para física em AS3 APE é sem duvidas a mais indicada!
Nice site.
Thanks, webmaster.