box2d中的物理世界
box2d中的物理世界,即b2World类就是一个包含了各种物体(body,物理体,或者叫刚体),固定附着物(fixture,形状与物理体的绑定物)以及各种约束体(比如关节),并使其在当中完成各种交互的这样一个集合体.
这个世界可能存在重力,所以,在创建这个世界的时候我们需要传一个描述重力的二维向量(v2对象),当然这取决于你的视角设定,也许你是做的横版游戏,这样的确需要一个重力.如果是顶视图,那可能就不需要重力了.
var gravity:V2=new V2(0,10);
var world:b2World=new b2World(gravity);
然后世界定期需要刷新
//刷新时间粒度
var stepTime:Number=1/30;
//速度计算层级
var velocityIterations:int=8;
//位置计算层级
var positionIterations:int=8;
world.Step(stepTime,velocityIterations,positionIterations);
在这个Step方法中进行了碰撞的检测,速度的更新等操作.
正如一开始描述的那样,world是一个管理刚体的集合.那么,刚体的产生,销毁以及碰撞判断都由world来处理.所以我们很容易找到b2World.CreateBody,b2World.DestoryBody这样的方法
刚体共有三种类型,分别是staticBody,dynamicBody以及kinematicBody
其含意分别是指,静态刚体(即不受力影响的物体,比如边界墙),动态刚体(完全模拟真实物理情况的物体),运动刚体(这是2.1版新增的一个类型,和静态刚体相比,就是它可以移动.它也同样不会被环境力所影响)
现在我尝试在world中创建两个刚体
var mybodyA:b2Body=world.CreateBody(new b2BodyDef());
var mybodyB:b2Body=world.CreateBody(new b2BodyDef());
但实际上,仅仅只是这样创建两个刚体是没有意义的.因为它还没有具体的形状.所以它们即存在于这个世界中,但又无法参与到具体的碰撞运算中.
这个时候我们需要再定义一下形状
形状有两类,一种是b2PolygonShape(多边形),一种是b2CircleShape(圆形)
多边形最多有8个边,并且多边形必须是凸边形.当然,你也可以使用组合来形成更为伪凹边形或者更复杂的形状.
这里我们分别把上边的两个刚体一个定义成一个普通的矩形方形,另一个定义成圆形.
var shapeA:b2PolygonShape=new b2PolygonShape();
var boxWidth:Number=100;
var boxHeight:Number=100;
shapeA.SetAsBox(boxWidth,boxHeight);
var radius:Number=100;
var shapeB:b2CircleShape=new b2CircleShape(radius);
接下来就是将刚体和形状通过附着对象(b2Fixture)绑定起来.
var fixtureDef:b2FixtureDef=new b2FixtureDef();
fixtureDef.shape=shapeA;
new b2Fixture(myBodyA,fixtureDef);
也可以使用更简洁的写法
var density:Number=1;
myBodyA.CreateFixtureShape(shapeA,density);
此时场景中便有了一个方形的刚体了.现在我们把方形刚体当做"地板",放在下方
*注意,一般来说,定义刚体初始的位置时,要尽量在刚开始使用b2BodyDef对象建立刚体的时候就定义好,而不是已经创建好后再去更新位置,因为会有一瞬间,所有刚体都会堆积在同一个位置诞生,那样不利于正确的碰撞运算.所以我们这里要修改一下我们开始创建刚体的代码.
var bodyDefA:b2BodyDef=new b2BodyDef();
bodyDefA.postion.v2=new V2(0,400);
bodyDefA.type=b2Body.b2_staticBody;
var mybodyA:b2Body=world.CreateBody(bodyDefA);
这样就在下方创建了一个静态刚体用着"地板"了.
现在我们要再把开始那个球给完善了.
先修改一下创建时的代码
var bodyDefB:b2BodyDef=new b2BodyDef();
bodyDefB.postion.v2=new V2(10,0);
bodyDefB.type=b2Body.b2_dynamicBody;
var mybodyB:b2Body=world.CreateBody(bodyDefB);
再建立形状关联
myBodyB.CreateFixtureShape(shapeB,1);
这样两个可以进行物理模拟的有形状的刚体就形成,但是它们现在还并不是可视的.
一般来说.我们在游戏开发中都会将自己的贴图(Sprite)附着在刚体上.当刚体发生位移或者旋转时,我们只需要同步一下即可.
刚体有一个userData属性是专门用来存放刚体对应的自定义对象的.我们可以将我们的贴图放在这里.比如我们的库中有两个导出名分别叫Ball和Box的影片剪辑,那么我们可以象下边这样将影片剪辑的实例存放在userData中.
mybodyA.SetUserData(new Box());
mybodyB.SetUserData(new Ball());
当然,你也可以在刚体定义对象中就申明
var bodyDefB:b2BodyDef=new b2BodyDef();
bodyDefB.userData=new Ball();
然后再在EnterFrame事件中执行world.Step方法.
addEventListener(Event.EnterFrame,update);
function update(e:Event)
{
world.Step(1/30,8,8);
for(var body:b2Body = world.GetBodyList(); body; body = body.GetNext())
{
var userData:*=body.GetUserData();
if(userData is Sprite)
{
userData.x = body.GetPosition().x;
userData.y = body.GetPosition().y;
userData.rotation = body.GetAngle() * (180/Math.PI);
}
}
}
有时候我们在做测试的时候可能没有准备什么box,什么ball的影片剪辑,这时,我们可以先使用debugdraw来绘制形状,查看一个演算的效果.
使用的方式为
var debug:b2DebugDraw = new b2DebugDraw(world);
addChild(debug);
然后在update中刷新绘图即可
debug.Draw();
box2d中的物理世界的更多相关文章
- cocos2d-x快乐的做让人快乐的游戏3:cocos-2d 3.x中的物理世界
Cocos2d-x 3.0+ 中全新的封装的物理引擎给了开发人员最大的便捷,你不用再繁琐与各种物理引擎的细节,全然的封装让开发人员能够更快更好的将物理引擎的机制加入�到自己的游戏中,简化的设计是从2. ...
- 关于Cocos2d-x中物理世界的物体乱跳的问题的解决
这是电脑短时间内帧率低,无法满足游戏配置的帧率引起的. 解决方法: 第一种: 1.打开AppDelegate.cpp文件 2.把director->setAnimationInterval(1. ...
- cocos2dx 3.2中的物理引擎初探(一)
cocos2dx在设计之初就集成了两套物理引擎,它们是box2d和chipmunk.我目前使用的是最新版的cocos2dx 3.2.引擎中默认使用的是chipmunk,如果想要改使用box2d的话,需 ...
- 16--Box2D使用(二、显示物理世界)
在上一篇文章中我们创建了的一个物理世界,当物理世界中的刚体一个也没有显示出来.为显示物理世界中的物体,我们需要引入GLES-Render(调试Box2D使用).这两个文件可以再 %Cocos_Home ...
- 15--Box2D使用(一、创建物理世界)
创建工程Box2DTest,去掉背景和精灵对象等.首先在HelloWorldScene.h头文件定义一个屏幕像素与物理世界长度转换宏,并引入box2D头文件 #define PIXEL_TO_METE ...
- 《割绳子》《蜡笔物理学》《Contre Jour》《顽皮鳄鱼爱洗澡》等游戏用Box2D引擎实现物理部分的方法(转)
从最热门游戏排行榜和flash游戏网站上,你能看到什么?许多2D游戏都有非常出色的物理学和美术设计.现在我们要学习那些游戏使用了什么物理学以及如何用Box2D制作它们. 除了知道是“什么”,更重要的是 ...
- 在powerdesigner中创建物理数据模型
物理数据模型(PDM)是以常用的DBMS(数据库管理系统)理论为基础,将CDM/LDM中所建立的现实世界模型生成相应的DBMS的SQL语言脚本.PDM叙述数据库的物理实现,是对真实数据库的描述 PDM ...
- cocos2d-x游戏开发 跑酷(两) 物理世界
原创.转载请注明出处:http://blog.csdn.net/dawn_moon/article/details/21240343 泰然的跑酷用的chipmunk物理引擎.我没有细致学过这个东西. ...
- cocos2d-x游戏开发 跑酷(四) 关联与物理世界
原创.转载注明出处http://blog.csdn.net/dawn_moon/article/details/21451077 前面一节尽管实现了一个跑动的人物,可是他只不过一个精灵在运行一个跑动的 ...
随机推荐
- hdu1501 Zipper
Zipper Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submis ...
- JS中获取页面单选框radio和复选框checkbox中当前选中的值
单选框:单选框的name值全部相同 页面有一组单选框的元素<td><input type="radio name="radioid">满意< ...
- HDU 1269 迷宫城堡 tarjan算法求强连通分量
基础模板题,应用tarjan算法求有向图的强连通分量,tarjan在此处的实现方法为:使用栈储存已经访问过的点,当访问的点离开dfs的时候,判断这个点的low值是否等于它的出生日期dfn值,如果相等, ...
- IDL实现 Modis经纬度查询、迅雷下载
转载请注明原文地址 本文纯属交流学习,请勿用作其他用途.匿名登录ModisFTP站点可能导致侵权,所造成的一切法律后果,本人概不负责. 一 介绍 Modis免费分发,光谱通道丰富,产品体系成熟,在多个 ...
- 43个优秀的Swift开源项目推荐(转载)
["轮子"] 工具类 SwiftyJSON:GitHub 上最为开发者认可的 JSON 解析类 Dollar.swift:Swift 版 Lo-Dash (或 underscore ...
- Selenium2+python自动化28-table定位
前言 在web页面中经常会遇到table表格,特别是后台操作页面比较常见.本篇详细讲解table表格如何定位. 一.认识table 1.首先看下table长什么样,如下图,这种网状表格的都是table ...
- WordPress安装到zen-cart产品页中
把WordPress安装到zen-cart一个子目录里吧,设置好固定连接等这个文件/includes/templates/template_default/templates/tpl_product_ ...
- MQ日常维护操作手册
假设队列管理器为QMgrName,以下所有使用QMgrName的地方您都可以替换成您维护的mq队列管理器名称. 一.MQ的启动与停止 用root用户启/停需要root用户包含在mqm组中. 1.MQ的 ...
- Integer自动装箱拆箱bug,创建对象在-128到127
1 public class Demo3 { public static void main(String[] args) { Integer a = 1; Integer b = 2; Intege ...
- Socket在手机上的应用
usb读取:pid vid --可以唯一的确定设备获取手机驱动socket固定端口通信 wifipc机在局域网内,udp的数据包(整个网段) 蓝牙配对 bluetoothsocket 如果放大:可以分 ...