你知道我是否可以与as3isolib集成一些物理引擎如nape或box2d?

时间:2012-02-13 20:12:03

标签: actionscript-3 box2d

我只是在寻找任何解释或教导如何集成的资源,如果有可能as3isolib与某些物理引擎,如nape或box2d。有可能吗?

1 个答案:

答案 0 :(得分:1)

当然可以这样做。
例如,Box2D Body有成员userData,类型为*,因此您可以在那里分配任何数据 至于Box2D和nape是2D物理引擎,你可以在x和y轴上进行2d phys修改 这是一个例子:

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();
        }
    }
}