一、认识Box2D
帮助文档,共69页
二、创建一个物理世界
先导入主头文件

#include <Box2D/Box2D.h>

三、物理世界一览
像素转成米 的比例因子 就是32
三、运动的物体
刚体的类型有三种:动态的、静态的、漂浮的(不受重力影响)
结构体b2BodyDef,构造刚体时,必须指定的、定义一个刚体所需的參数
cocos2d的像素和box2d的世界 长度转换
当box2d中世界长度为10米 为最佳模拟
b2FixtureDef

一个 b2FixtureDef 是依附在刚体 身上的物理特质的属性

一个刚体 有多个 b2FixtureDef

每个 b2FixtureDef 又有形状shape、密度、摩擦系数等成员属性

加入一个刚体的三步曲:
通过world创建一个body (參数是一个结构体b2BodyDef)
为body设置Fixture属性 (參数是一个b2FixtureDef结构体)
创建一个精灵,并将其绑定到body的UserData
glview->setDesignResolutionSize
(480,320,ResolutionPolicy::SHOW_ALL)表示:
游戏编写时,依照480*320的屏幕分辨率来的;
当执行在不同的屏幕分辨率下时,
会依据实际的屏幕分辨率 与 编写时的分辨率 的缩放比例因子,进行图像绘制
ResolutionPolicy::SHOW_ALL表示完整显示 界面上的全部元素
即:宽高等比缩放,但缩放比例取宽比和高比之中小的那一个。
四、漂浮的物体 b2_kinematicBody

创建一个漂浮的物体,不受重力影响,向右漂浮动

addRectBody(1,5,b2_kinematicBody);

#pragma mark - 加入一个刚体
// 加入一个精巧的或运动的Rect刚体,通过參数type指定,x和y是世界坐标中的位置
void Box2DScene::addRectBody(float x, float y, b2BodyType body_type)
{// 1.1 结构体b2BodyDef// 每个刚体都有自身的 固有的 必须的 b2BodyDef属性b2BodyDef def;// 在世界坐标中 的位置:第x米,第y米处def.position = b2Vec2(x, y);// 设置【b2BodyDef】的 类型 (运动的或精巧的或漂浮的)def.type = body_type;// 设置【b2BodyDef】的 线速度 y = 10 ,表示物体向上飞if(body_type == b2_dynamicBody){// 动态物体  自由落体def.linearVelocity = b2Vec2(0, 9.8);}else{// 漂浮物体  向右飘动def.linearVelocity = b2Vec2(1, 0);}// 设置【b2BodyDef】的 子弹效应 (防止碰撞检測时 由于速度 太快,而失效;如本应反弹,结果陷入地板内)// def.bullet = true;// 1.2 通过调用world的方法,创建一个Body物体// 參数 是一个 b2BodyDef,它是构造一个刚体必须的、固有的东东// 由于,每个刚体都有自身的 b2BodyDef属性b2Body* body = world->CreateBody(&def);// *************************************************// 2.1 形状分为 圆和多边形b2PolygonShape shape;shape.SetAsBox(0.5, 0.5);// 2.2 一个刚体 有多个 b2FixtureDef// 一个 b2FixtureDef 是依附在刚体 身上的物理物质的属性// 每个 b2FixtureDef 又有形状shape、密度、摩擦系数等成员属性b2FixtureDef fixtureDef;// 每个 b2FixtureDef都有一个成员shapefixtureDef.shape = &shape;// 密度fixtureDef.density = 1;// 摩擦系数fixtureDef.friction = 0.3;// 为刚体 加入一个 b2FixtureDefbody->CreateFixture(&fixtureDef);// *************************************************// 3、创建并加入一个 cocos2d 的精灵auto s = Sprite::create();// 0.5是物理世界中的精灵大小 单位是 米// 即在物理世界中,精灵 是一个1米 * 1米的方块s->setTextureRect(Rect(0, 0, 0.5*2*RATIO, 0.5*2*RATIO));// 加入到图层LayeraddChild(s);// *************************************************// 4、绑定 cocos2d界面上的精灵body->SetUserData(s);}

五、精巧的物体 如地板
#pragma mark - 加入一个地板
void Box2DScene::addGroundBody()
{// 1.1 结构体b2BodyDef// 每一个刚体都有自身的 固有的 必须的 b2BodyDef属性b2BodyDef def;// 在世界坐标中 的位置:第x米,第y米处  这个是在log("宽:%f",winSize.width);// 位置def.position = b2Vec2(480/RATIO,0);// 设置【b2BodyDef】的 类型 (运动的或精巧的或漂浮的)def.type = b2_staticBody;// 1.2 通过调用world的方法,创建一个Body物体// 參数 是一个 b2BodyDef,它是构造一个刚体必须的、固有的东东// 由于,每一个刚体都有自身的 b2BodyDef属性groundBody = world->CreateBody(&def);// *************************************************// 2.1 形状分为 圆和多边b2PolygonShape groundShape;// 尺寸: 在物理世界中的 半长和 半宽 多少米groundShape.SetAsBox(480/RATIO, 0.5);// 2.2 一个刚体 有多个 b2FixtureDef// 一个 b2FixtureDef 是依附在刚体 身上的物理物质的属性// 每一个 b2FixtureDef 又有形状shape、密度、摩擦系数等成员属性b2FixtureDef fixureDef;// 形状fixureDef.shape = &groundShape;// 密度fixureDef.density = 1;// 摩擦系数fixureDef.friction = 0.3;groundBody->CreateFixture(&fixureDef);
}

六、物体间的碰撞检測

首先, 设置碰撞检測 的侦听者 为当前Layer

world->SetContactListener(this);

让场景继承b2ContactListener(实现接口)
实现接口中的方法:

virtual void BeginContact(b2Contact* contact);

b2Contact类中有一个方法,能够得到刚体:

contact->GetFixtureA()->GetBody()

接口中的方法,固定写法
完整代码
//
//  Box2DScene.h
//  01_cocos2d-x
//
//  Created by beyond on 14-10-5.
//
//#ifndef ___1_cocos2d_x__Box2DScene__
#define ___1_cocos2d_x__Box2DScene__#include "cocos2d.h"
// 1、导入物理世界 主头文件
#include <Box2D/Box2D.h>USING_NS_CC;
// 注意 这儿,继承的是 Layer
// 要想进行碰撞检測,必须 实现接口
class Box2DScene : public cocos2d::Layer,public b2ContactListener
{
private:// 2、成员变量:物理世界,參数 指定x和y的重力方向b2World *world;// 由于 要碰撞检測,所以b2Body *groundBody;// 屏幕尺寸Size winSize;public:// c++里面没有id类型, 所以 返回类的实例对象的 指针static cocos2d::Scene* createScene();// 下面是 不同点:cocos2d-x的 'init' 方法 返回 bool// 而cocos2d-iphone 返回 'id' 类型virtual bool init();// 宏 自己主动实现 "静态的 create()方法"CREATE_FUNC(Box2DScene);// 4、在时钟方法里,模拟世界的执行 stepvirtual void update(float dt);// 5、加入一个精巧的或运动的Rect刚体,通过參数type指定,x和y是世界坐标中的位置void addRectBody(float x,float y,b2BodyType body_type);// 6、加入一个地板void addGroundBody();// 7、碰撞检測// 接口中的方法,是一个固定定法virtual void BeginContact(b2Contact* contact);};#endif /* defined(___1_cocos2d_x__Box2DScene__) */

//
//  Box2DScene.cpp
//  01_cocos2d-x
//
//  Created by beyond on 14-10-5.
//
//#include "Box2DScene.h"
// cocos2d 为宽960 * 高640
// box2d世界为宽10米 * 6.67米 (由于10米是比較理想的模拟情况)
// 因此 像素转成米 的比例是 96
// 假设,要把 像素转成米  仅仅要 像素/RATIO
// 假设,要把 米转成像素  仅仅要 米*RATIO  (把物理世界中的刚体 在界面上更新坐标时)
#define RATIO 960.0/10.0fUSING_NS_CC;
Scene* Box2DScene::createScene()
{// 'scene' 自己主动释放// 创建一个sceneauto scene = Scene::create();// 'layer' 自己主动释放auto layer = Box2DScene::create();// 将图层 加入到场景中scene->addChild(layer);// 返回 填充好图层的 场景return scene;
}// 在 "init" 方法中,实例化自己要用的精灵对象
bool Box2DScene::init()
{// 1. 调用父类的init , cpp 没有super,直接写父类名if ( !Layer::init() ) return false;// 屏幕尺寸winSize = Director::getInstance()->getVisibleSize();// 2、创建一个物理世界,參数 是x y 方向的重力加速度,负数表示 重力向下world = new b2World(b2Vec2(0,-9.8));// 设置碰撞检測 的侦听者 为当前Layerworld->SetContactListener(this);// 3、开启时钟方法,在时钟方法中,让世界 向前执行scheduleUpdate();// 4、创建并加入一个执行的物体 RectBody// 參数 x 5  y 3,x和y是世界坐标中的位置,类型是 b2_dynamicBodyaddRectBody(5,3,b2_dynamicBody);// 5、加入一个地板addGroundBody();// 6、创建一个漂浮的物体addRectBody(1,5,b2_kinematicBody);return true;
}
#pragma mark - 加入一个刚体
// 加入一个精巧的或运动的Rect刚体,通过參数type指定,x和y是世界坐标中的位置
void Box2DScene::addRectBody(float x, float y, b2BodyType body_type)
{// 1.1 结构体b2BodyDef// 每一个刚体都有自身的 固有的 必须的 b2BodyDef属性b2BodyDef def;// 在世界坐标中 的位置:第x米,第y米处def.position = b2Vec2(x, y);// 设置【b2BodyDef】的 类型 (运动的或精巧的或漂浮的)def.type = body_type;// 设置【b2BodyDef】的 线速度 y = 10 ,表示物体向上飞if(body_type == b2_dynamicBody){// 动态物体  自由落体def.linearVelocity = b2Vec2(0, 9.8);}else{// 漂浮物体  向右飘动def.linearVelocity = b2Vec2(1, 0);}// 设置【b2BodyDef】的 子弹效应 (防止碰撞检測时 由于速度 太快,而失效;如本应反弹,结果陷入地板内)// def.bullet = true;// 1.2 通过调用world的方法,创建一个Body物体// 參数 是一个 b2BodyDef,它是构造一个刚体必须的、固有的东东// 由于,每一个刚体都有自身的 b2BodyDef属性b2Body* body = world->CreateBody(&def);// *************************************************// 2.1 形状分为 圆和多边形b2PolygonShape shape;shape.SetAsBox(0.5, 0.5);// 2.2 一个刚体 有多个 b2FixtureDef// 一个 b2FixtureDef 是依附在刚体 身上的物理物质的属性// 每一个 b2FixtureDef 又有形状shape、密度、摩擦系数等成员属性b2FixtureDef fixtureDef;// 每一个 b2FixtureDef都有一个成员shapefixtureDef.shape = &shape;// 密度fixtureDef.density = 1;// 摩擦系数fixtureDef.friction = 0.3;// 为刚体 加入一个 b2FixtureDefbody->CreateFixture(&fixtureDef);// *************************************************// 3、创建并加入一个 cocos2d 的精灵auto s = Sprite::create();// 0.5是物理世界中的精灵大小 单位是 米// 即在物理世界中,精灵 是一个1米 * 1米的方块s->setTextureRect(Rect(0, 0, 0.5*2*RATIO, 0.5*2*RATIO));// 加入到图层LayeraddChild(s);// *************************************************// 4、绑定 cocos2d界面上的精灵body->SetUserData(s);}
#pragma mark - 加入一个地板
void Box2DScene::addGroundBody()
{// 1.1 结构体b2BodyDef// 每一个刚体都有自身的 固有的 必须的 b2BodyDef属性b2BodyDef def;// 在世界坐标中 的位置:第x米,第y米处  这个是在log("宽:%f",winSize.width);// 位置def.position = b2Vec2(480/RATIO,0);// 设置【b2BodyDef】的 类型 (运动的或精巧的或漂浮的)def.type = b2_staticBody;// 1.2 通过调用world的方法,创建一个Body物体// 參数 是一个 b2BodyDef,它是构造一个刚体必须的、固有的东东// 由于,每一个刚体都有自身的 b2BodyDef属性groundBody = world->CreateBody(&def);// *************************************************// 2.1 形状分为 圆和多边b2PolygonShape groundShape;// 尺寸: 在物理世界中的 半长和 半宽 多少米groundShape.SetAsBox(480/RATIO, 0.5);// 2.2 一个刚体 有多个 b2FixtureDef// 一个 b2FixtureDef 是依附在刚体 身上的物理物质的属性// 每一个 b2FixtureDef 又有形状shape、密度、摩擦系数等成员属性b2FixtureDef fixureDef;// 形状fixureDef.shape = &groundShape;// 密度fixureDef.density = 1;// 摩擦系数fixureDef.friction = 0.3;groundBody->CreateFixture(&fixureDef);
}#pragma mark - 时钟方法
void Box2DScene::update(float dt)
{// 1、让物理世界 的时间和位置向前迭代// 參数:时间差,速度迭代,位置迭代;官方推荐 8和3world->Step(dt,8,3);// 2、取出世界中的全部刚体,改变其位置Sprite *s;// 链表for (b2Body *b = world->GetBodyList(); b; b=b->GetNext()) {// log("y:%f米",b->GetPosition().y);if (b->GetUserData()) {// 刚体绑定的 精灵s = (Sprite*)b->GetUserData();// 更新精灵 在cocos2d中的位置  ; 单位要从米转成像素  仅仅需  米*RATIO 就可以s->setPosition(b->GetPosition().x*RATIO, b->GetPosition().y*RATIO);}}}
#pragma mark - 碰撞检測
// 接口中的方法,是一个固定定法
void Box2DScene::BeginContact(b2Contact *contact){// 碰撞有一方 是地板,则说明 检測到了碰撞b2Fixture *A = contact->GetFixtureA();b2Body *aBody = A->GetBody();b2Fixture *B = contact->GetFixtureB();b2Body *bBody = B->GetBody();if (aBody == groundBody||bBody == groundBody) {log("有物体落在了地板上");}
}

转载于:https://www.cnblogs.com/zfyouxi/p/4255167.html

cocos2d_x_05_Box2D物理引擎相关推荐

  1. 【Unity 3D】学习笔记三十六:物理引擎——刚体

    物理引擎就是游戏中模拟真是的物理效果.如两个物体发生碰撞,物体自由落体等.在unity中使用的是NVIDIA的physX,它渲染的游戏画面很逼真. 刚体 刚体是一个很很中要的组件. 默认情况下,新创的 ...

  2. 《Unity 4 3D开发实战详解》一6.7 物理引擎综合案例

    本节书摘来异步社区<Unity 4 3D开发实战详解>一书中的第6章,第6.7节,作者: 吴亚峰 , 杜化美 , 张月霞 , 索依娜 责编: 张涛,更多章节内容可以访问云栖社区" ...

  3. html 物理引擎,在物理引擎中画圆弧

    本文作者:IMWeb zzbozheng 未经同意,禁止转载 因为需求的需要,要使用在物理引擎中使用四分之一圆弧,我们来看看怎么实现在物理引擎中画出四分之一的圆弧, 在物理引擎中绘制圆弧 一般来说,物 ...

  4. 创建可微物理引擎Nimble,开源SOTA人体骨骼模型,斯坦福腿疾博士生用AI「助跑」人生...

    来源:机器之心本文约2000字,建议阅读5分钟 身残志坚,斯坦福大学的这位人工智能 + 机器人博士生想用技术克服身体缺陷. 有一位研究者,他身患残疾,出生时便患有退行性神经疾病,该疾病一直攻击着他的外 ...

  5. MuJoCo要开源!DeepMind收购物理引擎MuJoCo,将推动全球机器人研发

    物理模拟为机器人打开了一扇进击的大门. 作者 | 吴彤.杏花 编辑 | 青暮 喜大普奔!MuJoCo要开源! 昨天,DeepMind发帖,称已经收购了用于机器人研发的MuJoCo物理引擎,目前正致力于 ...

  6. 基于HT for Web 3D呈现Box2DJS物理引擎

    为什么80%的码农都做不了架构师?>>>    上篇我们基于HT for Web呈现了A* Search Algorithm的3D寻路效果,这篇我们将采用HT for Web 3D来 ...

  7. 小神之Newton物理引擎教程(一) Newton物理引擎教程

    第一节 Getting started 这个例程将告诉你如何把 newton 物理引擎和你的图形引擎结合起来. 如果你没有解过 SDK 包,先解开包. 打开 Visual studio 找到包里的 T ...

  8. 随风摆动效果_扫盲贴!节目中的AR虚拟效果,使用物理引擎后有什么不同?

    作者 | 封毅 订阅 | 010-86092062 在2019央视春晚节目内容中,AR虚拟效果引人注目,相对于往年有很大提升,不但在技术上实现了央视春晚首次4K超高清AR虚拟内容的节目制作,还大规模使 ...

  9. libgdx学习记录18——Box2d物理引擎

    libgdx封装了Box2D物理引擎,通过这个引擎能够模拟物理现实,使设计出的游戏更具有真实感. libgdx中,Box2d程序的大概过程: 1. 创建物理世界world,并设置重力加速度. 2. 创 ...

  10. 基于HTML5的WebGL结合Box2DJS物理引擎应用

    上篇我们基于HT for Web呈现了A* Search Algorithm的3D寻路效果,这篇我们将采用HT for Web 3D来呈现Box2DJS物理引擎的碰撞效果,同上篇其实Box2DJS只是 ...

最新文章

  1. Android APK应用安装原理(2)-查找APK并自动安装
  2. admui3字体无法删除_被微信好友删除、拉黑还不知?这3个方法可以自查,看完涨知识了...
  3. 用Tableau画幂函数柱状图
  4. Cocos2d-x 3.0正式版及android环境搭建
  5. 10-异步爬虫(线程池/asyncio协程)实战案例
  6. hierarchy change - ERP side debugging
  7. 12 Essential Bootstrap Tools for Web Designers
  8. BugkuCTF-MISC题zip伪加密
  9. python同或符号_奇技淫巧,还是正统功夫? - Python推导式最全用法
  10. java.util.concurrent.*下的常见类你了解多少?
  11. 【报告分享】完美日记品牌分析报告.pdf(附68页pdf全文下载链接)
  12. 前端如何实现网络速度测试功能_如何通过fiddler的断点功能,来实现不同场景的测试...
  13. 【学习 OpenCV】—— 色彩空间(RGB、HSV、rgb2hsv、rgb2gray 的实现)
  14. 微信小程序二维码生成
  15. 国产_系统_加油 by tmddebaba
  16. 「读书笔记」第五项修炼-学习型组织的艺术与实践(一)
  17. ESP32-IDF开发笔记 | 01 - ESP-IDF开发环境搭建(2023.04.08更新)
  18. 子网掩码的作用和用法
  19. 微信小程序蓝牙连接小票打印机
  20. python 批量修改文件名_Python 批量修改文件名

热门文章

  1. 【BAT面试题系列】Java面试必考题JVM详解,BAT师兄深度解析背后原理
  2. 【LeetCode】整数反转【不能借助辅助空间,需要处理溢出】
  3. jQuery插件——自定义jQuery插件
  4. IDEA系列(六)一This file is indented with tabs instead of 4 space
  5. openstack热添加磁盘
  6. HDU 4983 Goffi and GCD(数论)
  7. 20145304 第十周学习报告
  8. Java重写《C经典100题》 --08
  9. django 静态文件的配置 orm 中 字段与数据的增删改查 使用MySQL数据库
  10. Light oj 1233 - Coin Change (III) (背包优化)