APE – fyzikální engine
2.11.2009· Autor: Ondřej Brichta·
Počet komentářů: 7
APE – ActionScript Physics Engine je jedním z řady enginů, které umožňují do určité míry simulovat reálné fyzikální prostředí v rámci flashových animací.
O fyzikálních enginech zde už jednou řeč byla(http://www.flash.cz/portal/clanek.aspx?id=1403), my se dnes podíváme na další z enginů, Které nám umožňují simulovat reálné prostředí ve flashových animacích. Tím enginem je APE(http://www.cove.org/ape/)
Tak jako celá řada dalších enginů, i APE pracuje s řadou základních primitivních vektorových objektů s jejichž pomocí lze vytvořit výslednou scénu. Těmi objekty může být čtverec, obdélník, kruh, kolo, čára. Na první pohled je se to může zdát málo, ovšem pro většinu reálných aplikací si s uvedenými prvky vystačíme. Kromě jednoduchých barev můžeme totiž využívat i jiné objekty (nejčastěji MovieClipy), kterými měníme vzhled objektů fyzikální scény.
Pojďme se podívat na jednoduchou scénu, která bude využívat fyzikální síly. Sestavení scény se odehrává převážně na straně ActionScriptu, jediné, kde budeme pracovat s grafikou „ručně", je tvorba MovieClipů pro skinování fyzikálních objektů scény.
Nejprve si tedy připravíme import potřebných tříd a sestavíme si pomocné proměnné velikosti scény:
import org.cove.ape.*;
var stgW:Number = this.stage.stageWidth;
var stgH:Number = this.stage.stageHeight;
Následuje inicializace samotného APE enginu:
// ape inicializace
APEngine.init();
APEngine.container = this;
APEngine.addForce(new VectorForce(false,0,1));
Za pomocí atributu container určíme objekt, do kterého se budou vykreslovat objekty APE enginu. Metoda „addForce" pak slouží k doplnění síly, která bude působit na všechny objekty scény. V našem případe jsme doplnily sílu působící pouze v y-ovém směru která nebude brát v úvahu virtuální hmotnost objektů.
Následuje sestavení skupiny objektů, které budou ovlivňovány APE enginem:
//tloušťka hranice
var borderH:Number = 10;
//skupina objektů
var defaultGroup:Group = new Group();
//objekty se vzájemně ovlivňují
defaultGroup.collideInternal = true;
//doplnění skupiny do enginu
APEngine.addGroup(defaultGroup);
//nastavení hranic scény
var rp1:RectangleParticle = new RectangleParticle(borderH/2,stgH/2,borderH,stgH,0,true);
defaultGroup.addParticle(rp1);
var rp2:RectangleParticle = new RectangleParticle(stgW-borderH/2,stgH/2,borderH,stgH,0,true);
defaultGroup.addParticle(rp2);
var rp3:RectangleParticle = new RectangleParticle(stgW/2,borderH/2,stgW,borderH,0,true);
defaultGroup.addParticle(rp3);
var rp4:RectangleParticle = new RectangleParticle(stgW/2,stgH-borderH/2,stgW,borderH,0,true);
defaultGroup.addParticle(rp4);
//obarvení hranic
rp1.setStyle(1, 0x000000, 1, 0xff0000,0.5);
rp2.setStyle(1, 0x000000, 1, 0xff0000,0.5);
rp3.setStyle(1, 0x000000, 1, 0xff0000,0.5);
rp4.setStyle(1, 0x000000, 1, 0xff0000,0.5);
Všimneme si objektu třídy Group, do kterého umisťujeme veškeré prvky scény u kterých chceme aby na sebe vzájemně silově působili. Celou scénu ohraničíme obdélníky-odrážeči, které rozmístíme po stranách scény. Jedná se o objekty RectangleParticle, které při nastavení posledního parametru v konstruktoru na hodnotu „true" budou stále na místě bez pohybu. Toho právě využijeme pro odrážení objektů uvnitř scény.
Abychom mohli vidět výslednou animaci fyzikálního působení objektů na sebe, musíme si připravit funkci, která neustále provádí překreslování APE scény:
//funkce pro vykreslení scény
function run(evt:Event):void {
//přepočet scény
APEngine.step();
//vykreslení nové scény
APEngine.paint();
}
Funkci pak připojíme k ENTER_FRAME události:
stage.addEventListener(Event.ENTER_FRAME, run);
Tímto bychom ale vytvořili pouze statickou scénu, bez jakéhokoliv dalšího pohybu. Do knihovny symbolů si proto připravíme MovieClip a nastavíme export pro ActionScript pod názvem „obj".
Funkce, která se bude starat o vkládání nových objektů na scénu bude mít následující podobu:
//funkce pro přidání objektu
function clickOn(evt:Event):void {
var pt:Point = new Point(mouseX,mouseY);
var MC:MovieClip=new obj();
var wp:WheelParticle = new WheelParticle(pt.x,pt.y,MC.width/2);
wp.setDisplay(MC);
defaultGroup.addParticle(wp);
}
Dalším z objektů APE enginu, který zde využíváme je WheelParticle, který představuje kruh, který při kolizi s jinými prvky scény kromě odrazu i rotuje. Nastavení vzhledu objektů můžeme upravit pomocí metody setStyle a nebo využít metody setDisplay, jejímž parametrem je pak objekt, kterým odminujeme objekt APE scény. Nakonec nezapomeneme připojit listener k CLICK události:
stage.addEventListener(MouseEvent.CLICK,clickOn);
Výsledná animace pak bude vypadat následovně:
Zdrojové soubory jsou k dispozici zde: data.zip
Příště si ukážeme další zajímavé možnosti APE enginu.
Ondřej Brichta Vývojář multimediálních aplikací, šéfredaktor Flash.cz, školitel produktů Flash, Flex, Flash Media Server
Web:
http://www.obria.cz
|
Motto: <°))))><