`

物理模拟引擎box2D-1

阅读更多
几个常用的概念
rigid body
shape 
constraint 
contact constraint
joint 
joint limit 
joint motor
world 
Hello Box2D
Creating a World

var worldAABB:b2AABB = new b2AABB();  
worldAABB.lowerBound.Set(-100.0, -100.0);  
worldAABB.upperBound.Set(100.0, 100.0);




Caution
The world AABB should always be bigger then the region where your bodies are located. It is better to make the world AABB too big than too small. If a body reaches the boundary of the world AABB it will be frozen and will stop simulating.
and b2 allow object to sleep.

var gravity:b2Vec2 = new b2Vec2 (0.0, -10.0);  
var doSleep:Boolean = true; 


now  we create world object.

var world:b2World = new b2World(worldAABB, gravity, doSleep);



we can following the steps as
Creating a World--Creating a Ground Box--Creating a Dynamic Body--
Simulating the World (of Box2D). the following is source code and the attacted is flash.

package{   
       
    import flash.display.Sprite;   
    import flash.events.Event;   
    // Classes used in this example   
    import Box2D.Dynamics.*;   
    import Box2D.Collision.*;   
    import Box2D.Collision.Shapes.*;   
    import Box2D.Common.Math.*;   
  
    [SWF(width="640", height="360", backgroundColor="#000000", frameRate="30")]    
           
    public class HelloWorld extends Sprite{   
           
        [Embed(source='assets/PhysBox.swf')]      
        public var PhysBox:Class;      
        //public var FGmc:MovieClip = new FG as MovieClip;    
           
        [Embed(source='assets/PhysCircle.swf')]      
        public var PhysCircle:Class;    
           
        [Embed(source='assets/PhysGround.swf')]      
        public var PhysGround:Class;    
           
        public function HelloWorld(){   
               
               
               
            // Add event for main loop   
            addEventListener(Event.ENTER_FRAME, Update, false, 0, true);   
               
               
               
            // Creat world AABB   
            var worldAABB:b2AABB = new b2AABB();   
            worldAABB.lowerBound.Set(-100.0, -100.0);   
            worldAABB.upperBound.Set(100.0, 100.0);   
               
            // Define the gravity vector   
            var gravity:b2Vec2 = new b2Vec2(0.0, 10.0);   
               
            // Allow bodies to sleep   
            var doSleep:Boolean = true;   
               
            // Construct a world object   
            m_world = new b2World(worldAABB, gravity, doSleep);   
               
            // set debug draw   
            /*var dbgDraw:b2DebugDraw = new b2DebugDraw();  
            var dbgSprite:Sprite = new Sprite();  
            addChild(dbgSprite);  
            dbgDraw.m_sprite = dbgSprite;  
            dbgDraw.m_drawScale = 30.0;  
            dbgDraw.m_fillAlpha = 0.0;  
            dbgDraw.m_lineThickness = 1.0;  
            dbgDraw.m_drawFlags = 0xFFFFFFFF;  
            m_world.SetDebugDraw(dbgDraw);*/  
               
               
               
            // Vars used to create bodies   
            var body:b2Body;   
            var bodyDef:b2BodyDef;   
            var boxDef:b2PolygonDef;   
            var circleDef:b2CircleDef;   
               
               
               
            // Add ground body   
            bodyDef = new b2BodyDef();   
            //bodyDef.position.Set(15, 19);   
            bodyDef.position.Set(10, 12);   
            //bodyDef.angle = 0.1;   
            boxDef = new b2PolygonDef();   
            boxDef.SetAsBox(30, 3);   
            boxDef.friction = 0.3;   
            boxDef.density = 0; // static bodies require zero density   
            /*circleDef = new b2CircleDef();  
            circleDef.radius = 10;  
            circleDef.restitution = 0.2*/  
            // Add sprite to body userData   
            bodyDef.userData = new PhysGround();   
            //bodyDef.userData = new PhysCircle();   
            bodyDef.userData.width = 30 * 2 * 30;    
            bodyDef.userData.height = 30 * 2 * 3;    
            addChild(bodyDef.userData);   
            body = m_world.CreateBody(bodyDef);   
            body.CreateShape(boxDef);   
            //body.CreateShape(circleDef);   
            body.SetMassFromShapes();   
               
            // Add some objects   
            for (var i:int = 1; i < 10; i++){   
                bodyDef = new b2BodyDef();   
                bodyDef.position.x = Math.random() * 15 + 5;   
                bodyDef.position.y = Math.random() * 10;   
                var rX:Number = Math.random() + 0.5;   
                var rY:Number = Math.random() + 0.5;   
                // Box   
                if (Math.random() < 0.5){   
                    boxDef = new b2PolygonDef();   
                    boxDef.SetAsBox(rX, rY);   
                    boxDef.density = 1.0;   
                    boxDef.friction = 0.5;   
                    boxDef.restitution = 0.2;   
                    bodyDef.userData = new PhysBox();   
                    bodyDef.userData.width = rX * 2 * 30;    
                    bodyDef.userData.height = rY * 2 * 30;    
                    body = m_world.CreateBody(bodyDef);   
                    body.CreateShape(boxDef);   
                }    
                // Circle   
                else {   
                    circleDef = new b2CircleDef();   
                    circleDef.radius = rX;   
                    circleDef.density = 1.0;   
                    circleDef.friction = 0.5;   
                    circleDef.restitution = 0.2  
                    bodyDef.userData = new PhysCircle();   
                    bodyDef.userData.width = rX * 2 * 30;    
                    bodyDef.userData.height = rX * 2 * 30;    
                    body = m_world.CreateBody(bodyDef);   
                    body.CreateShape(circleDef);   
                }   
                body.SetMassFromShapes();   
                addChild(bodyDef.userData);   
            }   
               
        }   
           
        public function Update(e:Event):void{   
               
            m_world.Step(m_timeStep, m_iterations);   
               
            // Go through body list and update sprite positions/rotations   
            for (var bb:b2Body = m_world.m_bodyList; bb; bb = bb.m_next){   
                if (bb.m_userData is Sprite){   
                    bb.m_userData.x = bb.GetPosition().x * 30;   
                    bb.m_userData.y = bb.GetPosition().y * 30;   
                    bb.m_userData.rotation = bb.GetAngle() * (180/Math.PI);   
                }   
            }   
               
        }   
           
        public var m_world:b2World;   
        public var m_iterations:int = 10;   
        public var m_timeStep:Number = 1.0/30.0;   
           
    }   
  
} 
分享到:
评论

相关推荐

    物理模拟引擎box2D-2

    NULL 博文链接:https://ottoliu.iteye.com/blog/1159979

    PhysicsEditor-Cocos2d-x-Box2d-master.zip_box2D_cocos2d_cocos2d x

    在"PhysicsEditor-Cocos2d-x-Box2d-master"这个项目中,包含了整合Cocos2d-x与Box2D的示例代码和资源,可以帮助开发者快速理解和实践两者之间的交互。项目中可能包括了如下的文件结构: 1. 示例场景文件(.cpp和.h...

    box2d--1.0.js很好的物理引擎

    Box2D是一个非常知名的开源2D物理引擎,它在JavaScript版本中被称为Box2D--1.0.js。这个引擎主要用于创建具有真实世界物理特性的2D游戏和模拟。它的强大功能使得开发者能够轻松地实现物体碰撞检测、重力、摩擦力、...

    cocos2d-x box2d 物理引擎

    在cocos2d-x中,你需要创建一个Box2D的世界实例,这是所有物理模拟的基础。通过设置重力向量和其他参数,你可以控制游戏环境的物理特性。 5. **定义物理对象** 使用Box2D,你可以创建各种形状的物理对象,如矩形...

    box2d_py-2.3.5-cp37-cp37m-win_amd64.whl.zip

    Box2D_Py是Python中的一个物理引擎库,它是一个基于Box2D C++库的Python绑定,用于在游戏开发、模拟和可视化中创建2D物理效果。Box2D库本身由Erin Catto开发,它广泛应用于各种2D游戏和教育软件中,因为它能够高效地...

    box2d-wasm:Box2D物理引擎已编译为WebAssembly。 支持TypeScript和ES模块

    box2d-wasm Box2D编译为WebAssembly。 展示柜 展示自定义重力 使用释放 高性能主回路 WebGL渲染 用法 安装 npm i box2d-wasm 然后查看。 替代发行 有关其他功能: 流体模拟 粒子模拟 软体碰撞 您可以从分支进行...

    cpp-Box2DLite是一个小型2D物理引擎Lite版本更适合学习游戏物理

    6. **固定时间步长(Fixed Time Steps)**:为了确保物理模拟的一致性,Box2D-Lite推荐使用固定时间步长来更新World。这有助于避免因帧率变化导致的不稳定性。 7. **传感器(Sensors)**:传感器形状允许物体进行非...

    generic-box2d-plist

    《cocos2d-x与Box2D物理引擎的适配:深入理解“generic-box2d-plist”》 在游戏开发领域,cocos2d-x是一个广泛应用的2D游戏引擎,而Box2D则是一个强大的物理模拟库。两者结合,为开发者提供了构建具有真实物理效果...

    box2d物理引擎cocos2d

    Box2D是一个开源的2D物理引擎,广泛用于游戏开发,尤其在Cocos2d这样的2D游戏引擎中。Cocos2d是一个流行的跨平台的游戏开发框架,它提供了丰富的功能和工具,使得开发者能够轻松创建各种2D游戏。在本案例中,我们...

    瘸腿蛤蟆笔记42-cocos2d-x-3.2 Box2d物理引擎Motor Joint代码

    总结来说,Cocos2d-x 3.2版本中的Box2d物理引擎为游戏开发者提供了强大的物理模拟能力,Motor Joint是其中一种实现特定物理效果的工具。通过理解和运用Motor Joint,开发者可以创造出更为丰富多样的游戏场景,提升...

    《Box2dDemo》(Cocos2d-js)

    《Box2dDemo》是基于Cocos2d-js...总之,《Box2dDemo》是一个很好的学习Box2d和Cocos2d-js结合的起点,通过这个示例,开发者可以深入理解如何在JavaScript游戏中实现物理模拟,为创建更多具有真实感的2D游戏打下基础。

    cocos2d-x box2d 弹球

    在这个"弹球"项目中,开发者利用了Cocos2d-x的图形功能和Box2D的物理模拟能力,创建了一个类似"打砖块"(Breakout)的游戏。"Breakout"是一款经典的街机游戏,玩家通过控制一个挡板反弹球来击碎屏幕上方的砖块。 **...

    IOS应用源码——YannickL-Box2D-Examples-63f9424.rar

    总之,YannickL-Box2D-Examples-63f9424是iOS开发者学习和实践2D物理模拟的宝贵资源。通过这个项目,不仅可以学习Box2D引擎的使用,还能提升对iOS应用开发的理解,为开发更丰富的互动体验打下坚实基础。

    瘸腿蛤蟆笔记38-cocos2d-x-3.2 Box2d物理引擎Ray-cast代码

    Box2D是一款广泛应用于2D游戏开发的开源物理引擎,它提供了强大的物理模拟功能,包括刚体动力学、碰撞检测等。在Cocos2d-x框架中,Box2D被用来实现游戏中的物理行为,让游戏物体的运动更加真实。 首先,我们需要...

    Box2D-2.3.0用户手册-中文版

    Box2D 是一种开放源代码的物理引擎,用于模拟2D刚体和碰撞检测。下面是根据 Box2D 2.3.0 用户手册-中文版生成的知识点总结: Chapter 1 导言 1.1 关于 Box2D * Box2D 是一种物理引擎,用于模拟2D刚体和碰撞检测...

    瘸腿蛤蟆笔记39-cocos2d-x-3.2 Box2d物理引擎自由落体代码

    通过研究这些笔记,开发者可以更好地理解和掌握在Cocos2d-x 3.2中使用Box2d进行物理模拟的方法。 总的来说,这个笔记提供了一个学习如何在Cocos2d-x游戏中利用Box2D实现自由落体效果的实例。通过实践这些技巧,...

    box2d物理引擎和资料

    Box2D是一个开源的2D物理引擎,广泛用于游戏开发,模拟和教育领域。它提供了现实世界的物理行为,如重力、碰撞检测、摩擦力和弹力,使得开发者能够创建出更加逼真的游戏环境和交互体验。以下是关于Box2D物理引擎的...

    box2d-as3版 中文教程

    ### Box2D-as3版中文教程相关知识点 #### 1. 导言 **1.1 关于** Box2D是一款强大的2D物理仿真库,主要用于游戏开发领域,旨在为游戏提供更为真实的物理效果和更加丰富的互动体验。通过Box2D,游戏开发者可以让...

    iOS游戏应用源代码——YannickL-Box2D-Examples-63f9424.zip

    YannickL-Box2D-Examples-63f9424.zip这个压缩包,包含的是iOS游戏应用的源代码,主要展示了如何使用Box2D进行游戏物理模拟。下面我们将深入探讨这些知识点。 1. **Box2D引擎**:Box2D是由Ernesto San Pablo和Erwin...

Global site tag (gtag.js) - Google Analytics