1、创建一个物理世界

首先要引入一个头文件#include "Box2D\Box2D.h"

之后利用b2word创建一个对象,而且指定这个物理世界中的加速度方向。

word = new b2World(b2Vec2(0,-10));                        //指定物理世界的加速度

最后还要重写一下update函数。这个函数在之前的计时器学习的时候已经说过。每一帧的变动都将自己主动运行这个函数。所以我们要通过这个函数来进行创建的物理世界的刷新。

2、创建一个运动的物体

我们将自己实现一个在物理世界加入一个物体的函数,在当中调用createbody来创建一个物体,该函数接受一个參数。这个參数是关于创建的这个物体的一些基本信息,比方位置,动态还是静态等等。

	b2BodyDef def;
def.position = b2Vec2(10,10);
def.type = b2_dynamicBody;
word->CreateBody(&def);

之后为了能够显示出创建的这个物体的运动情况,在update中,能够通过一个循环来便利整个物理世界的物体列表,找到我们定义的这个物体就能够输出他在物理世界中自由落体的坐标变化

void HelloWorld::update(float dt)
{
word->Step(dt, 8, 3);
for(b2Body *b = word->GetBodyList(); b; b = b->GetNext())
{
if(b->GetType() == b2_dynamicBody)
{
log("x:%f, y:%f", b->GetPosition().x, b->GetPosition().y);
}
}
}

最后要在init函数里面scheduleUpdate()用这个函数启动update

直接看坐标的变化可能不是非常明显。那么这次通过加入一个图形来看

首先,自然要先创建一个sprite。

然后将创建的那个物体和sprite绑定在一起。

b2Body *b =  word->CreateBody(&def);
auto sprite = Sprite::create();
addChild(sprite);
sprite->setTextureRect(Rect(0,0,80,80));
b->SetUserData(sprite);

由于BOX2d 物理世界中,它的位置是用米来进行度量的,并非利用像素。BOX2D有一个比較精确的模拟范围就是10M。所以我们要依据像素和米的单位进行映射,找出相应的比例关系才可以确定所创建物体要指定的位置。

所以,在AppDelegate::applicationDidFinishLaunching()函数中我们将设置一下程序的分辨率glview->setDesignResolutionSize(800,600, ResolutionPolicy::SHOW_ALL);设置了一个800*600的分辨率,也就是说纵轴的800相应于物理世界中的10m,那么他们的比例就是80。

也就是说。上述的操作形成了这种一个效果,把整个屏幕变成了800*600的分辨率,在物理世界中,最高的纵坐标范围是10.依照比例缩小的坐标系的范围。

创建的物体在物理世界中的位置能够通过def.position = b2Vec2(3,5);来进行指定,def是这个物体类型信息的一个对象。

可是假设要连接一个图形的话,那么图形不是物理世界中,它是cocos2dx里面得东西,是游戏引擎的部分。所以,要通过刚才的比例设置sprite的位置。

s->setPosition(b->GetPosition().x * RATIO, b->GetPosition().y*RATIO);

s是一个sprite的指针。

上面的工作尽管将物理世界得物体和图形进行了绑定,可是,这仅仅是静态的东西。

所创建的物体在物理世界中是会由于重力的原因下落的。那么与其绑定的图形也就要随之调整位置,所以在Update函数里面要实时更新图形的位置。

void HelloWorld::update(float dt)
{
word->Step(dt, 8, 3);
Sprite *s;
for(b2Body *b = word->GetBodyList(); b; b = b->GetNext())
{
if(b->GetType() == b2_dynamicBody)
{
if(b->GetUserData())
{
s = (Sprite*)b->GetUserData();
s->setPosition(b->GetPosition().x * RATIO, b->GetPosition().y*RATIO);
}
}
}
}

所以在update函数里面就要检查body对象是否绑定了图形。然后获取到他所绑定的图形。进行又一次设置当前的图形坐标。

COCOS2DX学习之Box2d物理引擎使用之------动态物体的创建的更多相关文章

  1. [Cocos2D-x For WP8]Box2D物理引擎

    物理引擎通过为刚性物体赋予真实的物理属性的方式来计算运动.旋转和碰撞反映.为每个游戏使用物理引擎并不是完全必要的—简单的“牛顿”物理(比如加速和减速)也可以在一定程度上通过编程或编写脚本来实现.然而, ...

  2. cocos2d-x中的Box2D物理引擎

    在Cocos2d-x中集成了2个物理引擎,一个是Chipmunk,一个是Box2D.前者是用C语言编写的,文档和例子相对较少:Box2D是用C++写的,并且有比较完善的文档和资料.所以在需要使用物理引 ...

  3. 瘸腿蛤蟆笔记29-cocos2d-x-3.2 Box2d物理引擎dynamics模块介绍

    转载标明出处:http://blog.csdn.net/notbaron/article/details/38611335 上篇回想 本篇名言:奋斗.寻觅.发现,而不屈服.[诗人丁尼生] 上篇中,我们 ...

  4. 【极客学院出品】Cocos2d-X系列课程之九-BOX2D物理引擎

    Cocos2d-x 是时下最热门的手游引擎,在国内和国外手机游戏开发使用的份额各自是70%和25%,在App Store的top10中,有7个是用它开发的. 本节课程为Cocos2d-x系列课程之九, ...

  5. 实例介绍Cocos2d-x中Box2D物理引擎:使用关节

    下面我们将使用Box2D物理引擎技术进行重构.使得关节能够掌握如何在Box2D使用关节约束.HelloWorldScene.cpp中与使用关节的相关代码如下: void HelloWorld::add ...

  6. 实例介绍Cocos2d-x中Box2D物理引擎:碰撞检测

    在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact ...

  7. 实例介绍Cocos2d-x中Box2D物理引擎:HelloBox2D

    我们通过一个实例介绍一下,在Cocos2d-x 3.x中使用Box2D物理引擎的开发过程,熟悉这些API的使用.这个实例运行后的场景如图所示,当场景启动后,玩家可以触摸点击屏幕,每次触摸时候,就会在触 ...

  8. 实例介绍Cocos2d-x中Box2D物理引擎:碰撞检測

    在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact ...

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

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

随机推荐

  1. python基础一 day4 字典

    增加:   结果 删:  结果: 结果:   返回值是一个元组形式的键值   改: 结果: 结果:                                      代码: info=inpu ...

  2. CentOS6 自己动手搭建开放NTP服务器

    第一步: 1. 安装NTP服务程序: [root@host ~]# rpm -qa | grep ntp #查询是否安装ntp服务程序 [root@host ~]# yum install -y nt ...

  3. 爬虫学习之csv读取和存储

    一.读取 该读取主要使用到csv里面的Reader().DictReader()方法,和引用io里面的StringIO进行对字符串进行封装 在处理网上的csv文件方式主要是有一下几方面: • 手动把C ...

  4. ADB相关指令实例详解

    1.获取物理设备相关信息: adb devices 2.apk安装 2.1 新的应用(该应用未安装) adb -s 设备序列号 install apk路径 2.2 应用已安装,重安装覆盖 adb -s ...

  5. Qt_为什么学习Qt

    1)学习GUI编程,市场上任何一款产品几乎都带有图形界面,市场上很火的Androoid.IOS编程无非也是GUI app编程,GUI编程都是差不多的,学习Qt后再学习ANdroid IOS ,那都是S ...

  6. 小程序01 微信小程序介绍和开发准备

    前言 火爆的微信小程序:跳一跳.摩拜单车.美柚.大众点评.滴滴出行 背景 为什么会有小程序? 微信最早推出公众号和服务号,公众号和服务号所传播的网页经常出现加载缓慢甚至页面空白的情况. 微信小程序的诞 ...

  7. C++中static,extern和extern "C"关键字

    1. extern 变量 extern 表明该变量在别的地方已经定义过了,在这里要使用那个变量. 当extern不与"C"在一起修饰变量或函数时,如在头文件中: extern in ...

  8. 【简●解】[AHOI2009]中国象棋

    [题目大意] 叫你在\(n×m\)的棋盘上放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,问有多少种放置方法. [关键词] \(DP\) 分类讨论 乘法和加法原理 [分析] 仔细观察就会发 ...

  9. 复制webp图片到word || 微信webp图片不能复制 || 如何复制webp到word

    用IE浏览器打开Alt+A 复制直接去word粘贴, 用IE浏览器打开Alt+A 复制直接去word粘贴 用IE浏览器打开Alt+A 复制直接去word粘贴 用IE浏览器打开Alt+A 复制直接去wo ...

  10. 小白安装Python环境详细步骤!

    昨天,有小伙伴向我反映,他对我说“你好像还没教过我安装Python的吧?”听到这句话,我不禁汗颜起来,我的确好像没太注意Python学习的基础了,一直发各种爬虫与初学者看不懂的代码,在此我要向我的读者 ...