Skocz do zawartości

[Action Script 3] Box2DSimply - nakladka na biblioteke Box2D


Rekomendowane odpowiedzi

Napisano (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 przez bolitic
  • Odpowiedzi 1
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

Top Posters In This Topic

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ę



×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Wykorzystujemy cookies. Przeczytaj więcej Polityka prywatności