- 浏览: 124860 次
- 性别:
- 来自: 深圳
最新评论
-
T_bag:
...
TabHost 中的Activity执行顺序 -
ihopethatwell:
楼主,你能否写一个 int类型的一维数组的结构体?
linux NDK实例 -
gf_crazy:
刚好找第二种,其他地方全是第一种。
TabHost -
gangbener:
我们是可以把不同分辨率的图片放到不同的图片文件夹中去,问题是: ...
android程序中屏幕问题解决方案 -
shusanzhan:
学习了,Mark
android应用收费渠道
本文基于JBox2d+canvas,后续提供NDK+openglEs版本;
本文的主要目的是给大家介绍如何使用创建一个物理世界,本文为基本入门教程.
一、主函数:
- 主函数包括了Box2D的基本流程
- 简单来说,一个Box2D程序的基本流程是由以下三个基本步骤构成的:
1 |
function box2dMain() {
|
2 |
|
3 |
setupWorld(); //1. 创建一个世界
|
4 |
addBodys(); //2. 为世界创建物体
|
5 |
setInterval(step, 1000/60); //3. 让世界动起来,反复计算和绘制世界
|
6 |
|
7 |
} |
二、创建世界:
- 设定世界有效区域的大小:超过有效区域的物体将不参与计算。
- 定义重力:重力是一个二维矢量,矢量在Box2D中用b2Vec2来定义。
- 设定是否允许物体休眠:当物体静止下来,它就会被判定为休眠,如果打开这个开关,对于休眠的物体将停止模拟。直到它被其它物体解除,它才会醒来。
01 |
function setupWorld(){
|
02 |
|
03 |
//1. 设置有效区域大小 - b2AABB 类 (左上角向量,右下角向量)
|
04 |
worldAABB = new b2AABB();
|
05 |
worldAABB.minVertex.Set(-1000, -1000); //左上角
|
06 |
worldAABB.maxVertex.Set(1000, 1000); //右下角
|
07 |
|
08 |
//2. 定义重力 - 2D向量 - b2Vec2 类 (x,y)
|
09 |
gravity = new b2Vec2(0, 300);
|
10 |
|
11 |
//3. 忽略休眠的物体
|
12 |
var doSleep = true ;
|
13 |
|
14 |
//4. 创建世界 - b2World
|
15 |
var world = new b2World(worldAABB, gravity, doSleep);
|
16 |
} |
三、创建物体:
- 形状定义:Box2D中有三种基本形状,圆形(Circle)、矩形(Box)、多边形(Poly)。每个形状可以单独定义摩擦力、弹性、密度、相对位置等参数。形状是组成物体的基本材料。(当物体的密度设定为0时,物体变为墙类物体,不可移动)
- 物体定义:物体可由多个形状组成。形状由其定义相对位置(localPosition)决定其在物体中的位置,形状添加到物体后,其相对位置始终保持不变。
- 物体:物体只有使用世界的CreateBody()来生成,物体是物体定义的实例。只有使用这个函数生成的物体,才会在世界中被模拟。
01 |
function addBodys(){
|
02 |
|
03 |
//1. 定义形状 b2CircleDef,b2BoxDef,b2PolyDef 类
|
04 |
var Shape1 = new b2CircleDef(); //Shape1:圆形
|
05 |
Shape1.radius = 20; //半径
|
06 |
Shape1.localPosition.Set(0, 0); //偏移量
|
07 |
Shape1.density = 1.0; //密度
|
08 |
Shape1.restitution = .3; //弹性
|
09 |
Shape1.friction = 1; //摩擦力
|
10 |
|
11 |
var Shape2 = new b2PolyDef(); //Shape2:多边形
|
12 |
Shape2.vertexCount = 3; //顶点数为5
|
13 |
Shape2.vertices[0] = new b2Vec2(0,-20); //顶点1
|
14 |
Shape2.vertices[1] = new b2Vec2(23.10,20); //顶点2
|
15 |
Shape2.vertices[2] = new b2Vec2(-23.10,20); //顶点3
|
16 |
Shape2.localPosition.Set(0, 30); //偏移量
|
17 |
Shape2.density = 1.0; //密度
|
18 |
Shape2.restitution = .3; //弹性
|
19 |
Shape2.friction = 1; //摩擦力
|
20 |
|
21 |
//2. 定义物体 b2BodyDef 类
|
22 |
var BodyDef1 = new b2BodyDef();
|
23 |
BodyDef1.position.Set(100, 100); //设置物体的初始位置
|
24 |
BodyDef1.AddShape(Shape1); //物体中加入Shape1
|
25 |
BodyDef1.AddShape(Shape2); //物体中加入Shape2
|
26 |
|
27 |
//3. 将物体添加至world
|
28 |
Body = World.CreateBody(BodyDef1); //在世界中创建物体
|
29 |
|
30 |
//...可用同样流程继续添加物体,再定义一块地板
|
31 |
var Shape3 = new b2BoxDef(); //Shape3:矩形
|
32 |
|
33 |
Shape3.extents.Set(200, 5); //定义矩形高、宽
|
34 |
Shape2.density = 0; //墙体密度为0
|
35 |
Shape2.restitution = .3; //弹性
|
36 |
Shape2.friction = 1; //摩擦力
|
37 |
var BodyDef2 = new b2BodyDef();
|
38 |
BodyDef2.position.Set(220, 500); //设置物体的初始位置
|
39 |
BodyDef2.AddShape(Shape3); //物体中加入Shape3
|
40 |
Body2 = World.CreateBody(BodyDef2); //在世界中创建物体
|
41 |
|
42 |
} |
四、让世界运动起来:
- step()函数的作用是计算某段时间后,世界中物体的位置和角度,并将其绘制到浏览器中。
- 计算机中的动画,是一帧一帧构成的,每一帧表现了动画中某一时刻的一个场景。所以我们使用定时器函数setInterval(step, 1000/60),来每1/60秒执行一次计算和重绘工作,也就是上述的step()函数。
- step()中的dt参数,告诉了计算机要计算当前时间多少秒以后的世界,Box2D官方推荐为1/60秒,当然,如果你的计算机足够快,缩小这个时间间隔。另外dt应该与setInterval()函数中的第二个参数对应起来,这样才不会导致物体看起来运动的比你想像的要快或者慢。还有一点,dt不宜过大,否则模拟会不太精确,可能出现物体穿过另一个物体之类的bug。
- step()中的iterations参数,是多个物体同时发生碰撞时的模拟精度,越高的值会使模拟越精确,但同时也会让运算速度大幅下降,推荐值为10。
- step()中的World.step()函数是用来计算世界中物体的位置,执行后,物体的位置、角度、速度等信息更新。;
- step()中的drawWorld()函数会将物体绘制在浏览器中。
01 |
function step(){
|
02 |
|
03 |
//计算多少秒之后的世界
|
04 |
var dt = 1/60;
|
05 |
|
06 |
//迭代次数,影响物体碰撞的计算精度,太高会导致速度过慢
|
07 |
var iterations = 10;
|
08 |
|
09 |
//计算dt秒之后世界中物体的位置
|
10 |
World.step(dt,iterations);
|
11 |
|
12 |
//绘制世界
|
13 |
drawWorld();
|
14 |
|
15 |
} |
五、绘制世界:
- 一般情况下我们只利用box2d提供物理模拟,具体世界的绘制工作自己实现。具体绘制方式opengl,canvas,etc。
01 |
//绘制世界 |
02 |
function drawWorld(){
|
03 |
|
04 |
//绘制之前将上一帧的内容清除
|
05 |
context.clearRect(0, 0, canvasWidth, canvasHeight);
|
06 |
//遍历世界中的物体
|
07 |
for ( var b = World.m_bodyList; b; b = b.m_next) {
|
08 |
//遍历物体中的形状
|
09 |
for ( var s = b.GetShapeList(); s != null ; s = s.GetNext())
|
10 |
{
|
11 |
this .drawShape(s); //绘制一个形状
|
12 |
}
|
13 |
}
|
14 |
|
15 |
} |
16 |
|
17 |
//绘制一个形状 |
18 |
function drawShape(shape){
|
19 |
|
20 |
context.strokeStyle = '#000' ; //线形
|
21 |
context.beginPath();
|
22 |
switch (shape.m_type) {
|
23 |
case b2Shape.e_circleShape:{ //如果是圆形,画圆
|
24 |
var circle = shape;
|
25 |
var r = circle.m_radius;
|
26 |
var pos = circle.m_position;
|
27 |
var pos2 = circle.m_R.col1.clone().scale(r).add(pos);
|
28 |
context.arc(pos.x, pos.y, r, 0, Math.PI * 2, false );
|
29 |
context.moveTo(pos.x, pos.y);
|
30 |
context.lineTo(pos2.x, pos2.y);
|
31 |
break ;
|
32 |
}
|
33 |
case b2Shape.e_polyShape:{ //如果是多边形,画多边形
|
34 |
var poly = shape;
|
35 |
var tV = b2Math.AddVV(poly.m_position,
|
36 |
b2Math.b2MulMV(poly.m_R, poly.m_vertices[0]));
|
37 |
context.moveTo(tV.x, tV.y);
|
38 |
for ( var i = 0; i < poly.m_vertexCount; i++) {
|
39 |
var v = b2Math.AddVV(poly.m_position,
|
40 |
b2Math.b2MulMV(poly.m_R, poly.m_vertices[i]));
|
41 |
context.lineTo(v.x, v.y);
|
42 |
}
|
43 |
context.lineTo(tV.x, tV.y);
|
44 |
break ;
|
45 |
}
|
46 |
}
|
47 |
context.stroke(); //绘制
|
48 |
|
49 |
} |
发表评论
-
android.os.NetworkOnMainThreadException
2011-12-24 13:14 1236不能在android的主线程中,执行一个网络操作 ... -
转载:为什么要对URI进行编码
2011-12-15 15:49 1079为什么需要Url编码,通常如果一样东西需要编码,说明这样东 ... -
multipart form-data boundary
2011-12-15 15:23 1023含义 ENCTYPE="multipart/ ... -
android http 附件
2011-12-15 14:17 1663一:服务器端: 1:struts-config.xml ... -
post 附件
2011-12-15 10:24 1007在做嘀咕客户端的时候,要实现拍照上传的功能。根据嘀咕api ... -
让Android应用获取系统权限
2011-12-08 18:46 1004在 android 的API中有提供 SystemCloc ... -
Android源码目录结构详解
2011-12-01 20:22 851Android 2.1 |-- Makefile |-- ... -
两个activity跳转
2011-11-25 16:06 1279Activity A跳转到 Activity B /**A. ... -
线程同步之wait()/notify()的使用
2011-11-21 11:24 1002wait()/notify() 通常,多 ... -
游戏中渲染线程与更新线程交替执行
2011-11-21 11:21 945private final State mThreadLock ... -
android colormatrix
2011-11-03 17:32 1498在编程中有时候需要 ... -
java栈,堆,池
2011-07-08 09:38 752今天复习了一下这些知识,顺便做了下笔记.1.寄存器:最快的存储 ... -
3D开发的境界
2011-06-04 20:12 706第一阶段:初学者阶 ... -
Http
2011-06-01 17:10 1312使用 HTTP 服务: 1. Apache HttpCline ... -
获取手机的Opengl的支持版本
2011-05-27 09:28 1464public int getGLVersion() { ... -
性能优化
2011-05-27 09:26 791如果你想写一个 Java 程序,观察某对象什么时候会被垃圾收集 ... -
Android游戏中其他语言数据类型之间的转换方法
2011-05-17 11:43 1236Java与其他语言数据类型之间的转换方法实例程序 /* ... -
android canvas.getClipBounds
2011-05-13 17:41 8439一种是传参数: Rect dstRect = new Re ... -
获取屏幕大小的方法
2011-05-13 17:38 604// one DisplayMetrics dm = n ... -
Android Lock 使用
2011-05-13 16:43 3211PowerManager 和PowerManager.Wa ...
相关推荐
Box2D是一个开源的2D物理引擎,广泛用于游戏开发,尤其在Cocos2d这样的2D游戏引擎中。Cocos2d是一个流行的跨平台的游戏开发框架,它提供了丰富的功能和工具,使得开发者能够轻松创建各种2D游戏。在本案例中,我们...
Box2D是一个开源的2D物理引擎,由Ernesto Pena开发,广泛应用于游戏开发,尤其是像"愤怒的小鸟"这样的休闲游戏中。这个引擎以其高效、精确的模拟物理效果而闻名,允许开发者轻松地创建出逼真的物体碰撞、重力和其他...
Box2D是一款强大的开源2D物理引擎,广泛应用于游戏开发,为游戏中的物体运动提供真实感的物理模拟。本章将深入探讨Box2D在游戏开发中的应用和核心概念。 首先,Box2D的设计目标是简化2D物理模拟,使开发者能够轻松...
### 在cocos2d中使用物理引擎Box2D:弹球应用详解 #### 一、简介 在cocos2d框架中集成Box2D物理引擎是游戏开发中常见且重要的技术之一,尤其对于那些需要真实物理效果的游戏而言更是如此。Box2D是一个开源的2D物理...
这是一个非常好的...这个版本是由开发flash游戏的Box2DFlashAS3 1.4.3.1物理引擎转换而来的。用这个引擎可以用html5的canvas开发出各种优秀的物理引擎类游戏,完全可以与flash开发的游戏相媲美。绝对是好东西。
Box2D是一个强大的开源2D物理引擎,专为游戏开发者设计,使得在游戏场景中创建真实的物理效果变得简单易行。这个中文手册是为那些希望深入理解和应用Box2D的程序员准备的,提供了详尽的指导和实例,帮助开发者更好地...
总的来说,"Delphi编写的2D物理引擎Box2D源代码"为Delphi开发者提供了一个强大的工具,不仅可以用于快速开发2D物理效果丰富的应用,同时也提供了学习和研究物理引擎设计的机会。通过深入研究源代码,开发者可以提升...
cocos2d-x是一个流行的开源2D游戏开发框架,而Box2D则是一个强大的2D物理引擎。将两者结合,我们可以创建出具有逼真物理效果的游戏。本文将深入探讨如何在cocos2d-x项目中集成并使用Box2D物理引擎。 1. **cocos2d-x...
首先,Box2D中的基本构建块是“Body”,它代表了游戏中的一个实体,如角色、方块或其他物体。Body可以被赋予不同的形状(如CircleShape、PolygonShape等)来定义其外观。在“拆方块游戏”中,方块就是由Box2D的Body...
Box2D是一个流行的开源2D物理引擎,常用于游戏开发和其他需要实时物理模拟的应用中。在本主题中,我们将探讨如何将Box2D集成到Qt应用程序中,为你的项目添加真实的物理效果。Qt是一个功能强大的C++框架,用于创建跨...
通过学习这个AS3.0版的Box2D资源包,开发者不仅可以掌握物理引擎的使用,还可以提升游戏开发的专业技能,创造出更真实、更具吸引力的互动体验。无论是初学者还是经验丰富的开发者,都能从中受益。
总之,“物理引擎box2d2.4和编译的VS2013库.zip”是一个强大的2D物理引擎,结合Visual Studio 2013,可以帮助开发者快速构建具有逼真物理效果的游戏和应用程序。通过熟练掌握Box2D的用法,你可以创建出各种有趣的...
1. **刚体(Bodies)**:Box2D中的基本实体是刚体,它可以是静态或动态的。静态刚体不会受到力的影响,常用于创建不可移动的平台或障碍物。动态刚体则会受到力的作用并进行运动,适合用于角色或可移动的游戏对象。 ...
Box2D 是一款开源的2D物理引擎,广泛应用于游戏开发中,用于模拟现实世界的物理行为。它的设计目标是为开发者提供一个简单、高效且功能强大的物理模拟平台。Box2Dweb是Box2D的JavaScript版本,允许在网页上进行物理...
在IT领域,尤其是在游戏开发和互动媒体设计中,物理引擎扮演着至关重要的角色。它们能够模拟现实世界的物理规则,如重力、碰撞检测、摩擦力等,为2D和3D场景提供逼真的动态效果。这里我们将深入探讨几个在Flash平台...
1. **刚体(Rigid Body)**:在Box2D中,刚体代表坚硬且不会形变的物体,它们在碰撞和运动中保持形状不变。 2. **形状(Shape)**:形状是与刚体关联的2D碰撞几何结构,具备摩擦和恢复属性,用于碰撞检测和物理模拟...
- **刚体(Rigid Bodies)**:Box2D中的基本实体,可以是静态或动态。静态刚体不会受到力的影响,而动态刚体则会受力影响并改变运动状态。 - **形状(Shapes)**:刚体可以附加不同类型的形状,如圆形、矩形、...
- **刚体(Bodies)**:Box2D中的刚体代表游戏对象,可以是静态或动态的,例如平台、角色或者子弹。刚体可以是简单的形状(如矩形、圆形),也可以由多个形状组合而成。 - **形状(Shapes)**:刚体可以通过不同...
Box2D是一个开源的2D刚体物理引擎,主要用于游戏开发,它可以模拟真实的物理...通过阅读Box2D的用户手册和教程,可以更深入地理解物理引擎的工作原理和使用方法,从而在游戏开发中创造出更加真实和引人入胜的游戏体验。
Box2D是一款非常知名的开源2D物理引擎,广泛应用于游戏开发和模拟系统中。它为开发者提供了实现真实感物理效果的工具,如碰撞检测、刚体动力学等,让游戏中的物体运动更加逼真,增加了游戏的趣味性和挑战性。 Box2D...