Cocos Creator Box2d 学习笔记-02

来源:互联网 发布:软件开发招标书 编辑:程序博客网 时间:2024/05/18 02:29

1 创建一个world

每个 Box2D 程序都将从一个世界对象(world object)的创建开始。这是一个管理内存,对象和模拟的

中心。

var Box2d = require("box2dweb-commonjs");var gravity = new Box2d.b2Vec2(0, -10);var doSleep = true;this.myWorld = new Box2d.b2World(gravity, doSleep);
这里与box2d c++ 中文手册中创建世界对象不一样,box2d c++ 中文手册会先指明一个世界包围盒b2AABB,但在这 “box2dweb-commonjs” 中没有设置,我看了源码如下:
b2World.prototype.b2World = function (gravity, doSleep) {      this.m_destructionListener = null;      this.m_debugDraw = null;      this.m_bodyList = null;      this.m_contactList = null;      this.m_jointList = null;      this.m_controllerList = null;      this.m_bodyCount = 0;      this.m_contactCount = 0;      this.m_jointCount = 0;      this.m_controllerCount = 0;      b2World.m_warmStarting = true;      b2World.m_continuousPhysics = true;      this.m_allowSleep = doSleep;      this.m_gravity = gravity;      this.m_inv_dt0 = 0.0;      this.m_contactManager.m_world = this;      var bd = new b2BodyDef();      this.m_groundBody = this.CreateBody(bd);   }
暂时还没有发现哪里设置世界包围盒(AABB), 但是world中后QueryAABB方法,这个有点疑惑,望各位指正。

2 创建一个物体

物体通常由以下步骤来创建:
  1. 使用位置(position),阻尼(damping)等定义一个物体
  2. 使用世界对象创建物体
  3. 使用几何结构,摩擦,密度等定义形状
  4. 在物体上创建形状

2.1 定义一个物体

var bodyDef = new Box2d.b2BodyDef();bodyDef.type = Box2d.b2Body.b2_dynamicBody;//动态物体bodyDef.position.Set(0, 0);
物体的定义(bodyDef)会有这些属性:质量、 位置和角度、 阻尼、 休眠参数和子弹参数

这里写图片描述

2.2 创建一个物体
this.myBody = this.myWorld.CreateBody(bodyDef);
2.3 使用几何结构,摩擦,密度等定义形状
形状就是物体上的碰撞几何结构。
另外形状也用于定义物体的质量。也就是说,你来指定密度,Box2D 可以帮你计算出质量。
形状具有摩擦和恢复的性质。形状还可以携带筛选信息,使你可以防止某些游戏对象之间的碰撞。
形状永远属于某物体,单个物体可以拥有多个形状。形状是抽象类,所以在 Box2D 中可以实现许多类型的形状。
var fixtureDef = new Box2d.b2FixtureDef();fixtureDef.shape = new Box2d.b2PolygonShape();//多边形fixtureDef.shape.SetAsBox(300, 400);
在box2dweb-commonjs中形状的属性有:摩擦和恢复(friction)、密度(density)、形状(shape)、筛选(filter)、传感器(ssSensor)和恢复(restitution)

这里写图片描述

2.4 在物体上创建形状
this.myBody.CreateFixture(fixtureDef);

3. 刷新world

在update中添加如下方法,和与工程中的节点想关联起来,你会看见节点移动开始移动起来
update: function (dt) {        this.myWorld.Step(dt, 10, 10);        this.myWorld.ClearForces();        //this.bgNode就是场景中显示的原件        this.bgNode.setPosition(this.myBody.GetPosition());        //cc.log(this.circleBall.GetPosition());        },
0 0