<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>La Fabrick &#187; physique</title>
	<atom:link href="http://www.lafabrick.com/blog/tag/physique/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.lafabrick.com/blog</link>
	<description>Laboratoire d&#039;interfaces riches (Flex, Flash, Air ...)</description>
	<lastBuildDate>Mon, 28 Nov 2011 22:02:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
		<item>
		<title>Moteur physique : Box2DFlashAS3 , de la concurrence pour APE&#8230;</title>
		<link>http://www.lafabrick.com/blog/2007/11/17/267-box2dflashas3-de-la-concurrence-pour-ape/</link>
		<comments>http://www.lafabrick.com/blog/2007/11/17/267-box2dflashas3-de-la-concurrence-pour-ape/#comments</comments>
		<pubDate>Sat, 17 Nov 2007 03:51:48 +0000</pubDate>
		<dc:creator>Erick</dc:creator>
				<category><![CDATA[Logiciels / extensions / plugins...]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[physique]]></category>

		<guid isPermaLink="false">http://92.243.2.196/lafabrick/blog/?p=267</guid>
		<description><![CDATA[<p><img src="http://lafabrick.com/blog/images/erick/physics2DBox-20071117-034128.jpg" alt="" /></p>]]></description>
			<content:encoded><![CDATA[<p><img src="http://lafabrick.com/blog/images/erick/physics2DBox-20071117-034128.jpg" alt="" /></p>
<p><span id="more-267"></span></p>
<p><strong><a href="http://box2dflash.sourceforge.net/">Box2DFlashAS3</a></strong> est un portage AS3 <a hreflang="en" href="http://www.box2d.org/"> d&#8217;un __moteur physique__ développé en C++ par Erin Catto&#8217;s Box2D</a> ).</p>
<p> </p>
<p><img src="http://lafabrick.com/blog/images/erick/2DBox_2-20071117-034626.jpg" alt="" /></p>
<p> </p>
<p>Les exemples sont impressionnants !!!</p>
<p><img src="http://lafabrick.com/blog/images/erick/2dbox3-20071117-034909.jpg" alt="" />Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/08/22/204-les-frameworks-as3-qui-vont-bien/" rel="bookmark" title="22 août 2007">Les frameworks AS3 qui vont bien !</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/09/28/205-ape-mise-en-pratique/" rel="bookmark" title="28 septembre 2007">APE : mise en pratique</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/06/01/326-et-de-4/" rel="bookmark" title="1 juin 2008">Alternativa3D : un petit nouveau dans le monde de la 3D Flash</a></li>
<li><a href="http://www.lafabrick.com/blog/2011/01/11/2349-mdame-generateur-code-xsd-as3-flex/" rel="bookmark" title="11 janvier 2011">MdaME, ma résolution 2011 de génération de code AS3</a></li>
</ul>
<p><!-- Similar Posts took 13.651 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2007/11/17/267-box2dflashas3-de-la-concurrence-pour-ape/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>APE : mise en pratique</title>
		<link>http://www.lafabrick.com/blog/2007/09/28/205-ape-mise-en-pratique/</link>
		<comments>http://www.lafabrick.com/blog/2007/09/28/205-ape-mise-en-pratique/#comments</comments>
		<pubDate>Fri, 28 Sep 2007 18:18:56 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[Bientôt chez vous]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[physique]]></category>
		<category><![CDATA[Tutoriels]]></category>

		<guid isPermaLink="false">http://92.243.2.196/lafabrick/blog/?p=205</guid>
		<description><![CDATA[<p><img src="/blog/images/APE.jpg" alt="" /></p> <p>Cela fait longtemps qu'un petit test d'APE, le moteur physique AS3, traîne sur mon ordi&#160;: c’est le moment d’en faire un petit tuto. Depuis le temps que Erick me le demande&#160;!</p>]]></description>
			<content:encoded><![CDATA[<p><img src="/blog/images/APE.jpg" alt="" /></p>
<p>Cela fait longtemps qu&#8217;un petit test d&#8217;APE, le moteur physique AS3, traîne sur mon ordi : c’est le moment d’en faire un petit tuto. Depuis le temps que Erick me le demande !</p>
<p><span id="more-205"></span></p>
<h3>Récupération du framework et création du projet</h3>
<ul>
<li>Dans un premier temps, récupérez le framework APE. <a hreflang="en" href="http://www.cove.org/ape/">A cette adresse</a> vous pouvez le télécharger en version archive.</li>
</ul>
<p>Attention : le code source donné via le repository, et la doc associée ne correspondent pas. Le SVN sert uniquement de dépôt pour les futures versions. A récupérer via le SVN si vous êtes vraiment un foufou des frameworks !</p>
<ul>
<li>Créez un nouveau projet ActionScript, nommé APE.</li>
<li>Clic droit sur le projet, et dans les propriétés, allez dans « ActionScript Build Path », et ajoutez le chemin vers APE (pointez sur le répertoire « source »). APE est maintenant disponible.</li>
</ul>
<h3>Un peu de code !</h3>
<ul>
<li>Import des classes</li>
</ul>
<p>Nous allons donc commencer par importer les classes nécessaires. Nous aurons besoin de APE dans son ensemble, ainsi que la classe Event et KeyboardEvent :</p>
<pre class="brush: js">
package
{
     import org.cove.ape.*;
     import flash.display.Sprite;
     import flash.events.Event;
     import flash.events.KeyboardEvent;

     [SWF(width=&quot;1000&quot;, height=&quot;1000&quot;)]
     public class APE extends Sprite
     {
          public function APE()
         {
         }
     }
}
</pre>
<ul>
<li>Implémentation du moteur</li>
</ul>
<p>Placez vous dans le constructeur et déclarez le moteur comme suit (tout est dans le commentaire !) :</p>
<pre class="brush: js">
public function APE()
{
     // On boust un brin le framerate de l&#039;appli
     stage.frameRate = 60;
     // le paramètre donne la vitesse d&#039;execution du moteur.
     //    La classe APEngine préconise 1/3 ou 1/4...
     //    fesons ce qu&#039;on nous dis !
     APEngine.init(1/4);
     // Définition du conteneur du moteur : ici this
     APEngine.container = this;
     // Ajout du vecteur de gravité global au moteur.
     //    ici : force de 3 vers le bas.
     //    Vous pouvez aussi essayer d&#039;autre valeur de vecteur
     APEngine.addMasslessForce(new Vector(0,3));
}
</pre>
<ul>
<li>Création du monde</li>
</ul>
<p>Maintenant nous allons créer un « monde physique ». Toujours dans le constructeur, nous allons créer 3 objets avec des composantes d’élasticité, et 5 objets standards (toujours dans le constructeur) :</p>
<pre class="brush: js">
// Création du groupe référencant les particules et contrraintes
//    le paramètre true indique que ce groupe contient des particules et contraintes
//    dépendantes les une des autres
//    (en gros que les plaques seront le sol de la bébête)
var g:Group = new Group(true); 

// -OBJET ELASTIQUE ------------------------------------------
// Création de la plaque Elastique 1
//     les paramètres donnent la position x et y,
//     la taille width et height,
//     la rotation de l&#039;élément,
//     et si l&#039;objet est fixe ou non
var plElastic1:RectangleParticle = new RectangleParticle(720, 400, 50, 5, 0,true);
// Elasticité de la plaque
plElastic1.elasticity = 2;
// Style de la plaque
plElastic1.setStyle(0, 0x6699aa, 1, 0x996633);
// Ajout de la plaque dans le groupe
g.addParticle(plElastic1); 

// idem pour la plaque 2
var plElastic2:RectangleParticle = new RectangleParticle(745, 300, 5, 200, 0,true);
plElastic2.elasticity = 1;
plElastic2.setStyle(0, 0x6699aa, 1, 0x996633);
g.addParticle(plElastic2); 

// idem pour la plaque 3
var plElastic3:RectangleParticle = new RectangleParticle(80, 360, 100, 5, 45,true);
plElastic3.elasticity = 2;
plElastic3.setStyle(0, 0x6699aa, 1, 0x996633);
g.addParticle(plElastic3); 

// -OBJET STANDARD ------------------------------------------
// idem que précédent sans propriété particulière
var plStd1:RectangleParticle = new RectangleParticle(400, 400, 600, 5, 0,true);
g.addParticle(plStd1); 

var plStd2:RectangleParticle = new RectangleParticle(55, 220, 5, 200, 0,true);
g.addParticle(plStd2); 

var plStd3:RectangleParticle = new RectangleParticle(350, 200, 300, 5, 0,true);
g.addParticle(plStd3); 

var plStd4:RectangleParticle = new RectangleParticle(450, 300, 350, 5, 0,true);
g.addParticle(plStd4); 

var plStd5:RectangleParticle = new RectangleParticle(550, 100, 350, 5, 0,true);
g.addParticle(plStd5);
</pre>
<p>Vous pouvez jouer avec plein d’autres propriétés pour ces objets : mass, friction, … A vous de tester tout ça !</p>
<ul>
<li>Création de la bébête</li>
</ul>
<p>Bon le plus marrant ! La bébête à roulette. Alors là on peut se lâcher complet ! … bon pas trop quand même pour le tuto, je vous laisse le soin de vous amuser. On va créer une bestiole à 4 roues.</p>
<p>Dans un premier temps, on va déclarer les « roues » au niveau de la classe : elle devront être accessibles à l’ensemble des méthodes pour la suite du tuto :</p>
<pre class="brush: js">
[SWF(width=&quot;1000&quot;, height=&quot;1000&quot;)]
public class APE extends Sprite
{
     private var wheelParticleA:WheelParticle;
     private var wheelParticleB:WheelParticle;
     private var wheelParticleC:WheelParticle;
     private var wheelParticleD:WheelParticle;
     public function APE()
     {
          // …
</pre>
<p>La création en elle-même :</p>
<pre class="brush: js">
// Création de la particule Roue A
//     les paramètres donnent la position x et y,
//     le rayon,
//     et si l&#039;objet est fixe ou non,
//     et on peu lui ajouter des propriétés (ici une masse = 2)
wheelParticleA = new WheelParticle(140,10,14,false, 2);
g.addParticle(wheelParticleA); 

// idem pour la roue B
wheelParticleB = new WheelParticle(180,10,14,false, 2);
g.addParticle(wheelParticleB); 

// idem pour la roue C
wheelParticleC = new WheelParticle(180,50,14,false, 2);
g.addParticle(wheelParticleC); 

// idem pour la roue D
wheelParticleD = new WheelParticle(140,50,14,false, 2);
g.addParticle(wheelParticleD); 

// création des connecteurs entre les roues
//     les paramètres : les 2 objets à connecter,
//     le dureté de la connection,
//     et si l&#039;objet est coller ou non,
//     la taille de la connection
var wheelConnector1:SpringConstraint = new SpringConstraint(wheelParticleA,
     wheelParticleB, 0.5, true, 8);
var wheelConnector2:SpringConstraint = new SpringConstraint(wheelParticleB,
     wheelParticleC, 0.5, true, 8);
var wheelConnector3:SpringConstraint = new SpringConstraint(wheelParticleC,
     wheelParticleD, 0.5, true, 8);
var wheelConnector4:SpringConstraint = new SpringConstraint(wheelParticleD,
     wheelParticleA, 0.5, true, 8); 

// Ajout des connecteurs au groupe
g.addConstraint(wheelConnector1);
g.addConstraint(wheelConnector2);
g.addConstraint(wheelConnector3);
g.addConstraint(wheelConnector4); 

// Ajout du groupe au moteur de rendu
APEngine.addGroup(g);
</pre>
<p>Voila pour la bébête !</p>
<ul>
<li>La routine RUN</li>
</ul>
<p>Nous allons maintenant créer la routine EnterFrame qui va mettre à jour tout ça dans le temps :</p>
<pre class="brush: js">
private function run(evt:Event):void {
// on demande au moteur de faire son boulot ...
APEngine.step();
// ... et on affiche le résultat
APEngine.paint();
}
</pre>
<p>Il faut aussi ajouter dans le constructeur le lancement de l’évènement EnterFrame :</p>
<pre class="brush: js">
addEventListener(Event.ENTER_FRAME, run);
</pre>
<ul>
<li>Ajout de la couche  d&#8217;interactivité</li>
</ul>
<p>Plus qu’à faire bouger le biniou ! Pour cela, on ajoute 2 évènements Clavier KEY_DOWN et KEY_UP avec leurs méthodes associées :</p>
<pre class="brush: js">
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
</pre>
<p>Et les méthodes :</p>
<pre class="brush: js"> // Quand l&#039;utilisateur presse une touche ...
private function keyDownHandler(keyEvt:KeyboardEvent):void {
     var keySpeed:Number = 0.4;
     // Quand l&#039;utilisateur presse la touche gauche : on change la vitesse angulaire des roues
     if (keyEvt.keyCode == 37) {
          wheelParticleA.angularVelocity = -keySpeed;
          wheelParticleB.angularVelocity = -keySpeed;
          wheelParticleC.angularVelocity = -keySpeed;
          wheelParticleD.angularVelocity = -keySpeed;
     }
     // idem pour la touche droite
     else if (keyEvt.keyCode == 39) {
          wheelParticleA.angularVelocity = keySpeed;
          wheelParticleB.angularVelocity = keySpeed;
          wheelParticleC.angularVelocity = keySpeed;
          wheelParticleD.angularVelocity = keySpeed;
     }
} 

// Quand l&#039;utilisateur relâche une touche ...
private function keyUpHandler(keyEvt:KeyboardEvent):void {
     // On remet les vitesse angulaire des roue a 0
     wheelParticleA.angularVelocity = 0;
     wheelParticleB.angularVelocity = 0;
     wheelParticleC.angularVelocity = 0;
     wheelParticleD.angularVelocity = 0;
}
</pre>
<p>Et voilà !!!!</p>
<p><a hreflang="fr" href="http://lafabrick.free.fr/labo/ape/APE.as">Code source final</a></p>
<p><a hreflang="fr" href="http://lafabrick.free.fr/labo/ape/APE.swf">Aperçu</a></p>
<h3>Ressources</h3>
<ul>
<li><a hreflang="en" href="http://www.cove.org/ape/">Site web APE</a> (à voir les démos et exemples)</li>
<li><a hreflang="en" href="http://www.cove.org/ape/docs/api/">Documentation de l&#8217;API</a></li>
<li><a hreflang="en" href="http://ape.googlecode.com/svn/">repository SVN</a> pour les anciens !</li>
</ul>
<p>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2006/12/21/23-api-de-dessin-en-as3/" rel="bookmark" title="21 décembre 2006">API de dessin en AS3</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/08/22/204-les-frameworks-as3-qui-vont-bien/" rel="bookmark" title="22 août 2007">Les frameworks AS3 qui vont bien !</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/11/17/267-box2dflashas3-de-la-concurrence-pour-ape/" rel="bookmark" title="17 novembre 2007">Moteur physique : Box2DFlashAS3 , de la concurrence pour APE&#8230;</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/07/14/1920-flex-4-layouts-viewstack-pure-spark/" rel="bookmark" title="14 juillet 2010">Flex 4 et les layouts &#8211; Faire une ViewStack &laquo;&nbsp;pure&nbsp;&raquo; Spark</a></li>
</ul>
<p><!-- Similar Posts took 13.536 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2007/09/28/205-ape-mise-en-pratique/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

