APE Physical Engine… Boinnnngggg!!!

Collision, gravité, force: sur le papier APE Engine est franchement alléchant. Malheureusement, Alec Cove qui a développé cette bibliothèque de classes a apparemment stopper son développement, le site web n’ayant plus été mis à jour depuis plus d’une année et demi. Il y aurait encore certaines personnes qui mettent à jour le repository, mais j’avoue qu’à ce niveau là c’est un peu le bordel. La dernière release dans le trunk n’a pas toutes les classes, ils faut aller les chercher dans branches et surtout prendre les versions qui va correspondre à la doc que vous avez. Bref une fois les bonnes classes installées, (j’exagère c’est pas si long, ne partez pas…), on peut voir un peu ce qu’il a dans le ventre.

J’ai donc rapidement réalisé une anim pour voir un peu les éléments qui m’intéressait.

Voici une partie du code:

public function BasketPhysics()
{
	displayText(); 
 
	addEventListener(Event.ENTER_FRAME, run); 
 
       APEngine.init(1/4);
       APEngine.container = this;
       APEngine.addMasslessForce(new Vector(0,20));
       var defaultGroup:Group = new Group();
       defaultGroup.collideInternal = true;
 
       basketBall = new Sprite();
       basketBall.graphics.beginFill(0xB5430B);
       basketBall.graphics.drawCircle(0, 0, 30);
 
       myBall = new BasketBallon();
       trace("myBall : " + myBall);
 
       var bridgeParticleLeft:RectangleParticle = new RectangleParticle(0, 0, 80, 20);
 
       basketBallParticle = new WheelParticle(500, 380, 30, true, 1);
       basketBallParticle.setDisplay(myBall, -30, -30);
       defaultGroup.addParticle(basketBallParticle);
 
       var panierGA:RectangleParticle = new RectangleParticle(50, 130, 90, 20, 45, true);
       defaultGroup.addParticle(panierGA);
 
       var panierDR:RectangleParticle = new RectangleParticle(180, 130, 90, 20, -45, true);
       defaultGroup.addParticle(panierDR);
 
       var anchor1:CircleParticle = new CircleParticle(30, 400, 10, true, 1);
 
       defaultGroup.addParticle(anchor1);
 
       var anchor2:CircleParticle = new CircleParticle(240, 400, 10, true, 1);
       defaultGroup.addParticle(anchor2);
 
       var joint:CircleParticle = new CircleParticle(135, 400, 10, false, 1, 1.2);
       defaultGroup.addParticle(joint);
 
       var constarintLeft:SpringConstraint = new SpringConstraint(anchor1, joint,0.5, true,  true, true, 10, 0.8, true);
       constarintLeft.alwaysRepaint = true;
       constarintLeft.setStyle(1, 0xFF0000, 1, 0x000000, 1);
       constarintLeft.fixedEndLimit = 0.25; 
 
       var constarintRight:SpringConstraint = new SpringConstraint(anchor2, joint,0.5, true, true, true, 10, 0.8, true);
       constarintRight.alwaysRepaint = true;
       defaultGroup.addConstraint(constarintLeft);
       defaultGroup.addConstraint(constarintRight);
 
       var boundaryBox:Boundary = new Boundary();
       defaultGroup.addCollidable(boundaryBox);
 
       APEngine.addGroup(boundaryBox);
       APEngine.addGroup(defaultGroup);
 
       stage.addEventListener(MouseEvent.MOUSE_DOWN, ballDownHandler);
       stage.addEventListener(MouseEvent.MOUSE_UP, ballUpHandler);
 
       stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
}
private function shootBall():void
{
     removeChild(vectorForceDisplay);
     basketBallParticle.fixedPosition = false;
     basketBallParticle.velocity = (new Vector((beginPointX-mouseX)/5, (beginPointY-mouseY)/5));
}

Quelques points intéressants:

- On crée des groupes de particles (cercle, rectangle, roue) qui peuvent se collisioner entre elles ou entre groupes.

- La methode setDisplay qui permet de remplacer une particle par n’importe quel DisplayObject( voir le ballon en dessus, c’est un wheel à la base).

- Le springConstraint qui permet de faire une sorte de lien entre 2 particles.

Sinon un des gros point noir comme vous pouvez le juger sur l’anim, c’est la gestion des collisions surtout avec des particles trop rapides, j’imagine que le rafraichissement est pas assez rapide(c’est enterFrame qui tourne pour gérer tout ça), et que la particle ne touche à aucun moment l’autre. On pourrait sans doute augmenter le frame rate(à 30 ici), mais ce bien sûr au détriment des performance, et si on l’intègre dans un projet conséquent, comme composant d’un jeu par exemple, cela pourrait s’avérer problématique.

Je vais tester encore un peu tout ça, et je vous en redonne des news dans un prochain article.

Tags: , , , ,

Leave a Reply