`

Box2D物理引擎的使用方法

 
阅读更多

转:http://www.toswf.com/blog/blogview.asp?logID=103

众所周知的Box2DFlash是一款不错的物理引擎,如果我们了解了他的使用的技巧,我们也可以做出不错效果。
接下来,我会教大家如何使用它。为了能够使用这个物理引擎,我们首先必须全部的导入它的文件,如果在你的项目文件中有349K,你就可以导入了,如下所示:
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.*;
导入的方法很简单吧!现在,我们创建一个b2World的对象(类所在的源文件在Box2D/Dynamic/b2World.as中)。这个全局的对象是整个body的引擎,任何的功能都是在这里面完成。
注意:这个引擎的"大脑"是b2BroadPhase.as,核心是Step()函数绑定的全局对象。千万不要忘了他的"大脑":b2BroadPhase.as,否则你将会弄乱整个引擎。
全局的对象的构造函数作了三件事情:
1、一个在b2AABB类中的实例构建的坐标系统
2、一个定义重力的向量,这是一个b2Vec2类构建的实例。
3、一个布尔变量来定义对象是否"沉迷"。(如果你设置为true,对象将会沉迷)。
// create world AABB
var worldAABB:b2AABB = new b2AABB();
worldAABB.minVertex.Set(-1000.0, -1000.0);
worldAABB.maxVertex.Set(1000.0, 1000.0);
// Define the gravity vector
var gravity:b2Vec2 = new b2Vec2(0.0, 300.0);
// Allow bodies to sleep
var doSleep:Boolean = true;
// Construct a world object
m_world = new b2World(worldAABB, gravity, doSleep);
我的例子并不是我自己特有的,我所展示的代码从他们给引擎提供的"Hello World"代码中摘录下来的。
在创建了一个world的对象以后,你还要带给它生命,让的心脏跳动:
// Add event for main loop
addEventListener(Event.ENTER_FRAME, updating, false, 0, true);
public function updating(e:Event):void{
m_world.Step(m_timeStep, m_iterations);
}
执行Step()函数,每一帧都会更新所有的Body在world中的位置。
虽然现在的world中是空的,但是你可以往里面添加任何的球体或者盒子,以及你想到的任何形状的东西,我们需要定义一个Body。
一个body体大概需要做2-4件事情:
1、定义一个形状。
2、一个(x,y)的位置
下面的定义可选:
3、角度
4、一个预制的Sprite对象。
在Box2DFlash的例子中,你可能注意到所有的形状都是简单的。这是因为所有的东西在每一帧都是被线条重绘。
如果你想在你的游戏或者其他的什么中具有一些有特色的东西,你可以通过综合形状定义Body来制作一个Sprite。
在"HelloWorld"的例子中,他们使用Sprites来显示他们的对象。你也有可能把他们设置为不可见了,除非你真的想这么做,因为他们仍让会参与到计算当中。
有一些事情是很重要的,例如形状的定义,我们有3种类型的形状定义,他们都是扩展的b2ShapeDef基类。
我们先来说b2BoxDef类,这个具有4个重要的属性:
1、Extents:这是一个向量,本质上说他就是一个形状的中心坐标
2、Density:在碰撞的等式中我们使用密度*面积=质量,密度如果是0或者null,将会是一个静止的对象。
3、Friction:这用来计算两个对象之间的摩擦,你可以在0.0-1.0之间调整它们。
4、Restitution:这是调整对象弹性程度的属性,你可以在0.0-1.0之间调整它们。
b2CircleDef类中有一个不同的属性,代替Extents是他的半径。
b2PolyDef类具有一个顶点数组(最大是8)来代替Extents和Radius。这些顶点都是b2Vec2类型的对象。
现在,往world中添加一堆对象应该不是问题了:
var bodyDef:b2BodyDef;
var boxDef:b2BoxDef;
var circleDef:b2CircleDef;
// Add ground body
bodyDef = new b2BodyDef();
boxDef = new b2BoxDef();
boxDef.extents.Set(1000, 100);
boxDef.friction = 0.3;
/*Notice that the ground object has no density like the later
definitions. That's because it is static and we don't want it
effected by any forces.*/
bodyDef.position.Set(320, 400);
bodyDef.AddShape(boxDef);
// Add sprite to body userData
/*We have a Sprite object in the library called PhysGround. Here
we are associating that with our body definition.*/
bodyDef.userData = new PhysGround();
bodyDef.userData.width = boxDef.extents.x * 2;
bodyDef.userData.height = boxDef.extents.y * 2;
addChild(bodyDef.userData);
m_world.createBody(bodyDef);
// Add some objects
for (var i:int = 1; i < 20; i++){
/*We are going to re-use the same bodyDef from before.
It doesn't matter now, because it's already been copied and stored
in our world object.*/
bodyDef = new b2BodyDef();
// Box
if (Math.random() < 0.5){
boxDef = new b2BoxDef();
boxDef.extents.Set(Math.random() * 15 + 10, Math.random() * 15 + 10);
boxDef.density = 1.0;
boxDef.friction = 0.5;
boxDef.restitution = 0.2;
bodyDef.AddShape(boxDef);
/*We have a Sprite object in the library called PhysBox.*/
bodyDef.userData = new PhysBox();
bodyDef.userData.width = boxDef.extents.x * 2;
bodyDef.userData.height = boxDef.extents.y * 2;
}
// Circle
else {
circleDef = new b2CircleDef();
circleDef.radius = Math.random() * 15 + 10;
circleDef.density = 1.0;
circleDef.friction = 0.5;
circleDef.restitution = 0.2
bodyDef.AddShape(circleDef);
/*We have a Sprite object in the library called PhysCircle.*/
bodyDef.userData = new PhysCircle();
bodyDef.userData.width = circleDef.radius * 2;
bodyDef.userData.height = circleDef.radius * 2;
}
bodyDef.position.x = Math.random() * 400 + 120;
bodyDef.position.y = Math.random() * 100 + 50;
m_world.createBody(bodyDef);
addChild(bodyDef.userData);
}
很棒吧!的确是非常的简单。你应该了解的是Step()函数是只关心移动和旋转的,如果我们使用Sprites来定义的话,我们就需要手工的更新他们一下。我们只需要重写一下以前的updating函数:
public function updating(e:Event):void{
m_world.Step(m_timeStep, m_iterations);
// Go through body list and 更新 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.m_position.x;
bb.m_userData.y = bb.m_position.y;
bb.m_userData.rotation = bb.m_rotation * (180/Math.PI);
}
}/*This is an extreemly clever way to do this, and I suggest you copy it exactly in your own projects.*/
}
到目前为止,我们把对象放到一个world中,它们之间可以相互碰撞和具有重力的作用。但是仍然有很多的东西需要讨论的,但是这里我只带领你到达"HelloWorld"。我们仍然可以去实现一些铁链,画论、齿轮和混合形状,摩擦旋转(像轮胎)等等。
一些相关的链接:
http://www.clickpopmedia.com/2008/03/17/physics-in-actionscript-3/
http://gphysics.com/
http://box2dflash.sourceforge.net/
http://www.box2d.org/

 

http://www.cnblogs.com/cwin5/archive/2009/03/22/1418841.html

http://space.flash8.net/space/?628770/viewspace-432180.html

http://space.flash8.net/space/?628770/viewspace-432191.html

 

分享到:
评论

相关推荐

    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物理引擎。 1. **cocos2d-x简介** cocos2d-x是用C++编写的,基于cocos2d-x Objective-C版本的跨平台游戏开发框架。它支持iOS、Android、Windows、Mac等多个...

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

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

    box2d物理引擎使用情况

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

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

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

    box2d物理引擎和资料

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

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

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

    物理引擎Box2D 中文教程

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

    Box2D中文手册

    Box2D是一个强大的开源2D物理引擎,专为游戏开发者设计,使得在游戏场景中创建真实的物理效果变得简单易行。这个中文手册是为那些希望深入理解和应用Box2D的程序员准备的,提供了详尽的指导和实例,帮助开发者更好地...

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

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

    Box2D 物理引擎 源代码

    总的来说,Box2D是一款功能强大、易于使用的2D物理引擎,它的源代码为开发者提供了深入学习和定制的机会,是游戏开发不可或缺的工具。无论是初学者还是经验丰富的程序员,都能从中受益,构建出更加真实、有趣的2D...

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

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

    Box2D 最新引擎

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

    box2D 物理引擎Delphi版

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

    2D物理引擎 Box2d.js

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

    Box2D 2.3.0 for Delphi XE6 物理引擎

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

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

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

    Box2D物理引擎实例工具类和文档

    Box2D是一个开源的2D物理引擎,广泛用于游戏开发、模拟和教育领域。它提供了精确的物理模拟,包括刚体动力学、碰撞检测、关节连接等,使得开发者能够创建出具有真实感的动态场景。Box2DFlashAS3+2.1a是Box2D的一个...

Global site tag (gtag.js) - Google Analytics