Skocz do zawartości

Featured Replies

Napisano

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
  • Wyświetleń 2,3k
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Powiadomienie o plikach cookie

Wykorzystujemy cookies. Przeczytaj więcej Polityka prywatności