Вы знаете, могу ли я интегрировать с as3isolib какой-нибудь физический движок, такой как nape или box2d? - PullRequest
1 голос
/ 14 февраля 2012

Я просто ищу любой ресурс, который объясняет или учит, как интегрировать, если возможно, as3isolib с каким-то физическим движком, таким как nape или box2d. Это возможно?

1 Ответ

1 голос
/ 14 февраля 2012

Конечно, вы можете сделать это.
Например, в Box2D Body есть элемент userData, тип которого *, поэтому вы можете назначать любые данные там.
Поскольку Box2D и nape являются физическими движками 2D, вы можете сделать2d физические модификации по осям x и y.
Вот пример:

package 
{
    import as3isolib.display.primitive.IsoBox;
    import as3isolib.display.scene.IsoScene;

    import Box2D.Dynamics.Contacts.*;
    import Box2D.Dynamics.*;
    import Box2D.Collision.*;
    import Box2D.Collision.Shapes.*;
    import Box2D.Common.Math.*;
    import Box2D.Dynamics.Joints.*;


    import flash.events.Event;

    import flash.display.Sprite;

    public class Main extends Sprite
    {
        private var scene:IsoScene;
        private var world:b2World;
        private var gravity:b2Vec2;
        private var body:b2Body;
        private const worldScale:int = 30;
        private const doSleep:Boolean = true;
        private static const m_iterations:int = 10;
        private static const m_timeStep:Number = 1.0/30.0;


        public function Main ()
        {
            scene = new IsoScene();
            scene.hostContainer = this;

            var bodyDef:b2BodyDef;
            var fixtureDef:b2FixtureDef = new b2FixtureDef();

            gravity = new b2Vec2(0.0, 4.0);
            world = new b2World(gravity, doSleep);

            bodyDef = new b2BodyDef();
            bodyDef.type=b2Body.b2_dynamicBody;
            bodyDef.allowSleep = false;
            bodyDef.linearDamping = 1;
            bodyDef.angularDamping = 1;
            bodyDef.position.x = 200/worldScale; //position
            bodyDef.position.y = 100/worldScale; //position
            bodyDef.userData = new IsoBox();
            bodyDef.userData.setSize(25, 25, 25);
            bodyDef.fixedRotation = true;
            fixtureDef.restitution = 0.5;
            fixtureDef.shape = new b2CircleShape(0.3);
            fixtureDef.density = 1;
            fixtureDef.friction = 5;
            fixtureDef.restitution = 0.5;

            scene.addChild(bodyDef.userData);

            body = world.CreateBody(bodyDef);
            body.CreateFixture(fixtureDef);

            addEventListener(Event.ENTER_FRAME, Update);
        }

        private function Update(e:Event):void
        {
            world.Step(m_timeStep, m_iterations, m_iterations);
            world.ClearForces();
            body.GetUserData().moveTo(body.GetPosition().x * worldScale, body.GetPosition().y * worldScale, 0);

            scene.render();
        }
    }
}
...