`
wgcode
  • 浏览: 591480 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

BOX2D物理引擎基础中文说明

阅读更多
package
 
{
 
        import flash.display.MovieClip;
 
        import Box2D.Dynamics.*;
 
        import Box2D.Collision.*;
 
        import Box2D.Collision.Shapes.*;
 
        import Box2D.Common.Math.*;
 
        import flash.events.Event;
 
        import flash.display.Sprite;
 
        import flash.events.MouseEvent;
 
 
 
        /**
 
         * date:2009.3.18
 
         * BOX2D测试
 
         * @author cwin5
 
         * 
 
         * 
 
         * 全局的对象的构造函数作了三件事情:
 
         * 1、一个在b2AABB类中的实例构建的坐标系统
 
         * 2、一个定义重力的向量,这是一个b2Vec2类构建的实例。
 
         * 3、一个布尔变量来定义对象是否"沉迷"。(如果你设置为true,对象将会沉迷)。
 
         * 
 
         * 执行Step()函数,每一帧都会更新所有的Body在world中的位置。
 
         * 
 
         * 
 
         * 虽然现在的world中是空的,但是你可以往里面添加任何的球体或者盒子,以及你想到的任何形状的东西,我们需要定义一个Body。
 
         * 一个body体大概需要做2-4件事情:
 
         * * * 1、定义一个形状。
 
         * 2、一个(x,y)的位置
 
         * 下面的定义可选:
 
         * 3、角度
 
         * 4、一个预制的Sprite对象。
 
         * 
 
         * 在Box2DFlash的例子中,你可能注意到所有的形状都是简单的。这是因为所有的东西在每一帧都是被线条重绘。
 
         * 如果你想在你的游戏或者其他的什么中具有一些有特色的东西,你可以通过综合形状定义Body来制作一个Sprite
 
         * 
 
         * 形状的定义,我们有3种类型的形状定义,他们都是扩展的b2ShapeDef基类。
 
         * 
 
         * 我们先来说b2BoxDef类,这个具有4个重要的属性:
 
         * 1、SetAsBox(设定边框):这是一个向量,本质上说他就是一个形状的中心坐标
 
         * 2、Density(密度):在碰撞的等式中我们使用密度*面积=质量,密度如果是0或者null,将会是一个静止的对象。
 
         * 3、Friction(摩擦力):这用来计算两个对象之间的摩擦,你可以在0.0-1.0之间调整它们。
 
         * 4、Restitution(弹性):这是调整对象弹性程度的属性,你可以在0.0-1.0之间调整它们。
 
         * b2CircleDef类中有一个不同的属性,代替SetAsBox是他的Radius(半径)。
 
         * b2PolyDef类具有一个顶点数组(最大是8)来代替SetAsBox和Radius。这些顶点都是b2Vec2类型的对象。
 
         * 
 
         * AS3/FMS/Flex交流 QQ高级群:26150196
 
         * Blog:http://cwin5.cnblogs.com/
 
         */
 
        public class Main extends MovieClip
 
        {
 
                public var m_world:b2World;//世界对象
 
                public var m_iterations:int = 10;//跌代
                public var m_timeStep:Number = 1.0/24.0;//时间步
 
 
                public function Main() 
 
                {
 
 
 
                        //创建世界边界
 
                        var worldAABB:b2AABB = new b2AABB();
 
                        worldAABB.lowerBound.Set( -100.0, -100.0);//上限
 
                        worldAABB.upperBound.Set(100.0, 100.0);//下限
 
 
 
                        //确定重力
 
                        var gravity:b2Vec2 = new b2Vec2(0.0, 10.0);
 
 
 
                        //允许引擎睡眠
 
                        var doSleep:Boolean = true;
 
 
 
                        //构建一个世界对象
 
                        m_world = new b2World(worldAABB, gravity, doSleep);        //边界,重力,睡眠开关                
 
 
 
                        //创建变量
                        var body:b2Body;
 
                        var bodyDef:b2BodyDef;
 
                        var boxDef:b2PolygonDef;
 
                        var circleDef:b2CircleDef;
 
 
 
 
 
                        //添加地表
 
                        bodyDef = new b2BodyDef();//物体
 
                        bodyDef.position.Set(10, 12);//位置
 
 
 
                        boxDef = new b2PolygonDef();//多边形写义
 
                        boxDef.SetAsBox(30, 3);//设定边框
 
                        boxDef.friction = 0.3;//摩擦力
 
                        boxDef.density = 0;//密度,静态物体需要0密度
 
 
 
                        bodyDef.userData = new PhysGround();//用户数据,可为显示对象,或为自己的对象
 
                        bodyDef.userData.width = 30 * 2 * 30;//宽
 
                        bodyDef.userData.height = 30 * 2 * 3;//高
 
                        addChild(bodyDef.userData);//添加至舞台
 
 
 
 
 
                        body = m_world.CreateBody(bodyDef);//创建刚体
                        body.CreateShape(boxDef);//创建图形
 
                        body.SetMassFromShapes();//从图形创建质量
 
 
 
 
 
                        //添加一些对象
 
                        for (var i:int = 1; i < 10; i++) {
 
 
 
                                bodyDef = new b2BodyDef();//刚体定义
 
                                bodyDef.position.x = Math.random() * 15 + 5;//位置:X
 
                                bodyDef.position.y = Math.random() * 10;//位置:Y
 
 
 
                                //取随机边框参数
 
                                var rX:Number = Math.random() + 0.5;
 
                                var rY:Number = Math.random() + 0.5;
 
 
 
 
 
                                //盒(方块)
 
                                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);//创建BOX2D里的图形
 
 
 
                                } 
 
                                //圆
 
                                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);//添加至舞台
 
                        }
 
 
 
                        //添加循环事件
 
                        addEventListener(Event.ENTER_FRAME, Update, false, 0, true);
 
                }
 
 
 
 
 
                public function Update(e:Event):void{
 
 
 
                        m_world.Step(m_timeStep, m_iterations);//刷新物理世界
 
 
                        // 通过刚体列表更新Sprite的位置/角度
 
                        for (var bb:b2Body = m_world.m_bodyList; bb; bb = bb.m_next) {//声明bb = 世界对象的刚体列表;
 
                                                                                                                                                        //bb(如果为空值, 即null, 0, underfind), 则不运行,
 
                                                                                                                                                        //bb = bb.m_next(下一个值为它的m_next)
 
                                if (bb.m_userData is Sprite){//如果数据是一个sprite
 
                                        bb.m_userData.x = bb.GetPosition().x * 30;//设置X
 
                                        bb.m_userData.y = bb.GetPosition().y * 30;//设置Y
 
                                        bb.m_userData.rotation = bb.GetAngle() * (180/Math.PI); //设置角度
 
                                }
 
                        }
 
                }
 
        }
 
 
 
}

 说明:Box2D会自动管理各个物体的碰撞,弹跳等物理状态,我们只需要创建各种刚体。创建刚体可以通过b2BodyDef.userData来创建。b2Shape.SetAsBox(width,height)指的是物体的半宽和半高,所以在计算时都要乘以2。由于Box2D本身的限制,运算时要进行长度换算。
 
创建步骤:
 
 
 
 
Code
1 创建一个世界(边界,重力,休眠开关)
 
 
 
*********************************************************
 
//创建世界边界
 
var worldAABB:b2AABB = new b2AABB();
 
worldAABB.lowerBound.Set( -100.0, -100.0);//上限
 
worldAABB.upperBound.Set(100.0, 100.0);//下限
 
 
 
worldAABB 应该永远比物体所在的区域要大,让 worldAABB 更大总比太小要好.如果一
 
个物体到达了 worldAABB 的边界,它就会被冻结并停止模拟.
 
*********************************************************
 
//确定重力
 
var gravity:b2Vec2 = new b2Vec2(0.0, 10.0);
 
//允许引擎睡眠
 
var doSleep:Boolean = true;
 
 
 
接下来我们定义重力矢量.是的,你可以使重力朝向侧面(或者你只好转动你的显示器).并且,我们
 
告诉世界(world)当物体停止移动时允许物体休眠.一个休眠中的物体不需要任何模拟.
 
*********************************************************
 
//构建一个世界对象
 
m_world = new b2World(worldAABB, gravity, doSleep);//边界,重力,睡眠开关
 
 
 
那么现在我们有了自己的物理世界,让我们再加些东西进
 
*********************************************************
 
 
 
 
 
 
 
 
 
2 创建一个地面盒或者物体
 
*********************************************************
 
1.使用位置(position),阻尼(damping)等定义一个物体
 
2.使用世界对象创建物体
 
3.使用几何结构,摩擦,密度等定义形状
 
4.在物体上创建形状
 
5.可选地调整物体的质量以和附加的形状相匹配
 
*********************************************************
 
bodyDef = new b2BodyDef();//刚体定义
 
bodyDef.position.Set(10, 12);//位置                       
 
 
 
设定位置
 
*********************************************************
 
boxDef = new b2PolygonDef();//多边形定义
 
boxDef.SetAsBox(30, 3);//设定边框
 
boxDef.friction = 0.3;//摩擦力
 
boxDef.density = 0;//密度,静态物体需要0密度               
 
 
 
设定虚拟属性,密度为0即是静态物体(障碍物)
 
*********************************************************                       
 
bodyDef.userData = new PhysGround();//用户数据
 
bodyDef.userData.width = 30 * 2 * 30;//宽
 
bodyDef.userData.height = 30 * 2 * 3;//高
 
addChild(bodyDef.userData);//添加至舞台       
 
 
 
创建显示对象
 
*********************************************************                       
 
body = m_world.CreateBody(bodyDef);//创建物体                       
 
body.CreateShape(boxDef);//创建图形
 
body.SetMassFromShapes();//从图形创建质量
 
 
 
把显示对象写入世界坐标,再把虚拟属性写入显示对象,最后从图形创建质量
 
*********************************************************

分享到:
评论

相关推荐

    box2d物理引擎cocos2d

    在本案例中,我们看到的"box2d物理引擎cocos2d"是Cocos2d集成了Box2D物理引擎的一个实例,它涵盖了Cocos2d的2.x和3.x两个版本。 Box2D引擎的核心概念包括刚体(Bodies)、形状(Shapes)、关节(Joints)和力...

    as3.0 box2d物理引擎 包括引擎代码和教程和一个例子

    这个压缩包包含的资源是关于AS3.0版本的Box2D物理引擎,其中包括了引擎的源代码、教程以及一个示例项目,可以帮助开发者更好地理解和应用Box2D。 首先,Box2D物理引擎是一个强大的工具,它允许开发者创建具有真实...

    Box 2D 物理引擎

    Box2D物理引擎源码及中文文档;Box2d有C++,flash和Java等版本。android可以直接使用java版本的Jbox2d,但因为Jbox2d的图形渲染是使用processing库来实现的,所以,在android中使用Jbox2d的时候,图形渲染的工作就...

    cocos2d-x box2d 物理引擎

    通过以上步骤,你可以在cocos2d-x项目中构建起一个基础的Box2D物理引擎,为你的游戏带来生动有趣的物理效果。然而,这只是冰山一角,Box2D提供的功能远不止这些,包括关节、传感器、动力学等高级特性,等待着开发者...

    第07章 游戏开发的核心——Box2D物理引擎.zip

    Box2D是一款强大的开源2D物理引擎,广泛应用于游戏开发,为游戏中的物体运动提供真实感的物理模拟。本章将深入探讨Box2D在游戏开发中的应用和核心概念。 首先,Box2D的设计目标是简化2D物理模拟,使开发者能够轻松...

    box2d物理引擎和资料

    以下是关于Box2D物理引擎的一些关键知识点: 1. **基本概念**: - **刚体(Rigid Bodies)**:Box2D中的基本实体,可以是静态或动态。静态刚体不会受到力的影响,而动态刚体则会受力影响并改变运动状态。 - **...

    Box2D中文手册

    总的来说,Box2D中文手册是游戏开发者的宝贵资源,无论你是初学者还是有经验的开发者,都可以从中获得关于2D物理引擎的深入知识,提高你的游戏开发能力。通过学习和应用Box2D,你将能够创造出更加生动、真实的2D游戏...

    物理引擎Box2D 中文教程

    ### 物理引擎Box2D 中文教程 #### 1. 导言 **1.1 关于** Box2D 是一款专为游戏设计而打造的2D刚体仿真库。该库允许开发者在游戏中实现更加真实可信的物体运动效果,从而增加游戏的互动性和沉浸感。从游戏开发者的...

    Box2D:给你的Qt程序加上物理引擎(包含windows+linux版)

    Box2D是一个流行的开源2D物理引擎,常用于游戏开发和其他需要实时物理模拟的应用中。在本主题中,我们将探讨如何将Box2D集成到Qt应用程序中,为你的项目添加真实的物理效果。Qt是一个功能强大的C++框架,用于创建跨...

    box2d物理引擎使用情况

    总的来说,Box2D物理引擎提供了强大的2D物理模拟功能,通过深入理解和熟练运用上述知识点,开发者能够创造出更加逼真、动态的游戏体验。在实际项目中,不断实践和学习,掌握Box2D的高级特性和技巧,将有助于提升游戏...

    Box2D物理引擎使用 拆方块游戏 源代码|No8.rar

    本项目提供的“拆方块游戏”源代码是基于Box2D物理引擎实现的一个实例,旨在帮助开发者理解如何运用Box2D来创建具有真实感的物理效果的游戏。 Box2D引擎的核心在于模拟现实世界的物理现象,如重力、碰撞检测、摩擦...

    Box2D物理游戏编程基础

    Box2D 是一款开源的2D物理引擎,广泛应用于游戏开发中,用于模拟现实世界的物理行为。它的设计目标是为开发者提供一个简单、高效且功能强大的物理模拟平台。Box2Dweb是Box2D的JavaScript版本,允许在网页上进行物理...

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

    【瘸腿蛤蟆笔记42-cocos2d-x-3.2 Box2d物理引擎Motor Joint代码】 在游戏开发中,物理引擎是一个重要的组成部分,它能够帮助开发者模拟真实世界中的物理现象,使得游戏中的物体运动更加逼真。Cocos2d-x是一个广泛...

    Box2D 物理引擎 源代码

    Box2D是一款强大的开源2D物理引擎,由Ernesto Posse和Eric Haines共同创建,最初是为了他们的项目“Physics for Game Developers”而设计。它使用C++编写,旨在为游戏开发者提供简单、高效的2D物理模拟解决方案。Box...

    2D物理引擎 Box2d.js

    Box2DJS是Box2D物理引擎的JavaScript端口。如何引入laya 参考 https://blog.csdn.net/weixin_41316824/article/details/88965058

    flash一些3D和2D物理引擎

    这里我们将深入探讨几个在Flash平台上广泛使用的3D和2D物理引擎:BOX2D、FIVE3D、MOTOR2、FLADE以及APE。 首先,我们来看一下**BOX2D**。BOX2D是一款开源的2D物理引擎,由Erin Catto开发。它被广泛应用于Flash、C++...

    Box2D 2.3.0 for Delphi XE6 物理引擎

    Box2D 2.3.0 for Delphi XE6 物理引擎 BOX2D 對開發手機2D遊戲的朋友想必不陌生,隨著Delphi XE6發表後,也有有網友也將BOX2D 轉成Firemonkey元件了! 耽搁了好久才完成这个版本,春节在家窝了十几天集中弄完了。...

    box2D 物理引擎Delphi版

    最近将box2D(www.box2D.org)物理引擎的全部代码翻译成了Delphi版本,工作量很大,由于Delphi 2005以前不支持运算符重载,所以所有计算部分都写了两个版本。理论上支持Delphi所有版本,兼容性仅在Delphi7上测试。另外...

    Box2d 2.1.2 2D物理引擎源代码和Demo

    Box2D是一个开源的2D物理引擎,广泛用于游戏开发、模拟和教育领域。它的名称是"Box2D"的缩写,意为"二维物理盒",版本号2.1.2,意味着这是该引擎的某个特定稳定版本。Box2D由Erin Catto开发,它提供了一个强大的API...

    Box2D 最新引擎

    Box2D是一款非常知名的开源2D物理引擎,广泛应用于游戏开发和模拟系统中。它为开发者提供了实现真实感物理效果的工具,如碰撞检测、刚体动力学等,让游戏中的物体运动更加逼真,增加了游戏的趣味性和挑战性。 Box2D...

Global site tag (gtag.js) - Google Analytics