Napisano 13 Listopad 201113 l 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 201113 l przez bolitic
Napisano 15 Listopad 201113 l Autor 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
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto