bolitic Napisano 13 Listopad 2011 Napisano 13 Listopad 2011 (edytowane) Box2D to niezwykle wydajny oraz potężny silnik fizyczny 2D. Doczekał się portu na Action Script. Od jakiegoś czasu bawię się nim i w trakcie tej zabawy powstał pomysł na stworzenie nakładki, ułatwiającej prace z nim. W zasadzie nie tylko ułatwiającej, ale również czyniącej Box2D bardziej zrozumiałym. Tak rozpocząłem pisanie Box2Dsimply. Projekt jest w fazie samego projektowania, ale już teraz w wersji 0.1 udostępnia parę ciekawych narzędzi. W tym wątku przedstawię te narzędzia jak również udostępnię skompilowaną bibliotekę (Box2Dsimply0.1.swc). Gdy projekt będzie już na wykończeniu, wówczas udostępnię pliki źródłowe. 1. Rozpoczęcie pracy z Box2Dsimply Po prostu ściągnij Box2Dsimply0.12.swc klikając tutaj. Następnie umieść te bibliotekę tam gdzie trzymasz zewnętrzne biblioteki, albo po prostu skopiuj plik do katalogu z plikami źródłowymi projektu i dodaj swc’eka do projektu. Nie potrzeba mieć już Box2D ani żadnej innej biblioteki - wszystko jest w środku. 2. Przykład: Camera joint. Jest to mój wymysł, który bardzo przyda mi się w przyszłych projektach pisanych w oparciu o Box2D. Polega ten joint (połączenie) na śledzeniu przez kamerę danego obiektu. Ten joint jest bardzo powiązany z Mouse joint – można wybrać opcję, aby kamera śledziła każdy obiekt, który akurat jest przeciągany myszką. zobacz tutaj Source: package { import com.greensock.easing.*; import flash.display.Sprite; import keraj37.box2DSimply.Box2DSimply; /** * ... * @author keraj37 */ public class Main extends Sprite { private var _box2dSimply:Box2DSimply; public function Main():void { _box2dSimply = new Box2DSimply(stage, null, { gravity:[0, 20], refreshRate:15, allowSleep:false } ); _box2dSimply.bodiesCreationClass.createBorders(800, 600, 400, 300); _box2dSimply.bodiesCreationClass.createBox({ width:40, height:40, x:300, y: 300, isStatic:false, fixtureDFR:[1.0, .9, .6] }); _box2dSimply.bodiesCreationClass.createCircle( { radius:40, x:300, y: 300, isStatic:false, fixtureDFR:[1.0, .9, .6] }); _box2dSimply.jointsCreationClass.createMouseJoint(); _box2dSimply.jointsCreationClass.createCameraJoint( { everyWithMouseJoint:true, easeMode:true, bodyId: -1, tweenSpeed:.6, tweenFrameRate:5, tweenType:null } ); _box2dSimply.startUpdatingScene(); } } } 3. Przykłady (lepiej pokazać przykład niż pisać 100 słów o kążdej metodzie) (zakładamy że mamy stworzony obiekt _box2dSimply) Rozpoczecie pracy z Box2DSimply (definicja) public function Box2DSimply(stage:Stage, worldSprite:Sprite = null, externalWorldVars:Object = null):void przykłady: _box2dSimply = new Box2DSimply(stage, null, { gravity:[0, 10], scale:30, box2DFrames:30, refreshRate:10, allowSleep:false }); _box2dSimply = new Box2DSimply(stage); _box2dSimply = new Box2DSimply(stage, mySprite); Jedyny wymagany parametr to stage. Możemy w drugim parametrze dać swój Sprite czy MovieClip w którym wszystko będzie animowane. Trzeci parametr to obiekt z takimi polami: { gravity:[0, 10], scale:30, box2DFrames:30, refreshRate:10, allowSleep:false } allowSleep jeśli jest true, wówczas obiekty, na które nie działa żadna siła będą mogły “zasnąć”. scale to ilość pikseli na metr (ten w silniku Box2D). tworzenie ramek świata: (definicja) public function createBorders(externalWidth:int = 800, externalHeight:int = 600, centerX:int = 400, centerY:int = 300):void przykłady: _box2dSimply.bodiesCreationClass.createBorders(800, 600, 400, 300); _box2dSimply.bodiesCreationClass.createBorders(); _box2dSimply.bodiesCreationClass.createBorders(6000, 3000); tworzenie kwadratów: (definicja) public function createBox(externalBoxVars:Object = null):void przykłady: _box2dSimply.bodiesCreationClass.createBox({ width:40, height:40, x:300, y: 300, isStatic:false, fixtureDFR:[1.0, .9, .6] }); _box2dSimply.bodiesCreationClass.createBox({ width:40, height:40 }); _box2dSimply.bodiesCreationClass.createBox({ isStatic:true }); pola parametru do tworzenia kwadratu: { width:_scale, height:_scale, x:Math.random() * _worldSprite.width * .85 + 50, y:Math.random() * _worldSprite.width * .85 + 50, isStatic:true, fixtureDFR:_TABGLOBALFIXTURE }; fixtureDFR to jest tablica zawierająca pola wykorzystane do określenia takich elementów kwadratu jak: tarcie, gęstość i “gumowatość” tworzenie kół: (definicja) public function createCircle(externalCircleVars:Object = null):void przykłady: _box2dSimply.bodiesCreationClass.createCircle( { radius:40, x:300, y: 300, isStatic:false, fixtureDFR:[1.0, .9, .6] }); _box2dSimply.bodiesCreationClass.createCircle( { radius:40 }); w sumie wszystko tak samo jak w przypadku kwadratu, tylko różnica jest taka, że nie ma width i height ale jest radius. tworzenie Camera joint: (definicja) public function createCameraJoint(externalCameraJointVars:Object = null):void przykłady: _box2dSimply.jointsCreationClass.createCameraJoint( { everyWithMouseJoint:true, easeMode:true, bodyId: -1, tweenSpeed:.6, tweenFrameRate:5, tweenType:null } ); _box2dSimply.jointsCreationClass.createCameraJoint( { easeMode:true, bodyId:5, tweenType:Elastic.easeOut } ); pola parametru do tworzenia Camera joint: { everyWithMouseJoint:true, easeMode:true, bodyId: -1, tweenSpeed:.6, tweenFrameRate:5, tweenType:null } everyWithMouseJoint – jeśli jest true, wówczas kamera podąża za każdym obiektów przenoszonym przez myszkę. easeMode: jeśli false, wówczas kamera sztywno ma w centrum obiekt śledzony. tweenSpeed to szybkość kamery: im większa wartość tym wolniejsza. tweenFrameRate to co ile klatek kamera ma się odświeżać. tweenType to obiekty z pakietu TweenLite. Jeśli jest null, wówczas zostanie użyty Quad.easeOut. tweenType służy do animowania kamery i jest bardzo ciekawym narzędziem – np. z odpowiednimi tweenSpeed i tweenFrameRate, oraz użytym tweenType:Elastic.easeOut można uzyskać bardzo realistyczny „camera shake” J tworzenie Mouse joint: (definicja) public function createMouseJoint(bodyId:int = -1):void przykłady: _box2dSimply.jointsCreationClass.createMouseJoint(); _box2dSimply.jointsCreationClass.createMouseJoint(5); _box2dSimply.jointsCreationClass.createMouseJoint(_box2dSimply.getNumberOfBodies() - 1); Parametrem jest po prostu id obiektu, który chcemy aby miał Mouse joint. Wartość –1 (domyślna) oznacza, że będzie to każdy obiekt, na który klikniesz. 0 oznacza ze będzie to pierwszy (trzeba wiedzieć, że jeśli stworzymy ramki świata, wówczas obiekty 0, 1, 2, 3 będą to kwadraty statyczne ramki). _box2dSimply.getNumberOfBodies() – 1 to ostatni obiekt. Ok :) to tyle na razie - ale nie długo zrobię update. Edytowane 15 Listopad 2011 przez bolitic
bolitic Napisano 15 Listopad 2011 Autor Napisano 15 Listopad 2011 Dodałem potrzebny mi do teraz robionej gry joint - RevoluteJoint. Bardzo szybko można teraz tworzyć takie elementy jak te flipery: http://keraj37.site88.net/Box2DSimply/download/0.1/example02.swf Tutaj updateowany Framework: http://keraj37.site88.net/Box2DSimply/download/0.1/Box2DSimply0.12.swc
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się