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. easyui权限管理

    在easyui上实现权限的管理 所谓权限:指的是系统中的资源,资源包括菜单资源(学习情况报表,账号审核...)以及按钮资源所谓角色:指的是系统中的权限集合(每一个角色对应着哪些权限集合) 1.一星权限 ...

  2. delphi中使用自定义资源的方法

    如果要在delphi中使用自定义资源文件*.res文件,比如一个光标,此时可以采用下列步骤: 1,创建包含相应的资源文件,这里是创建一个包含自定义光标的res文件. 2,在主窗体的pas文件中加入编译 ...

  3. Tunnelier使用说明

    Tunnelier与MyEnTunnel类似,但是功能更加强大.MyEnTunnel小巧易用,如何使用MyEnTunnel可以参考 MyEnTunnel使用说明 这里列下Tunnelier的优点: 1 ...

  4. 记录xerces使用(VS2017 C++)

    1.编译xerces,获得dll文件和lib文件 2.将dll文件和lib文件拷贝到使用xerces的工程目录里面去 3.配置VS2017 C/C++  ->  All Options --&g ...

  5. 4 SQL 数据更新

    4 数据更新 4-1 数据的插入(INSERT语句的使用方法) 通过create table语句创建出来的表,可以将其比作一个空空如也的箱子.只有把数据装入到这个箱子后,它才能称为数据库.用来装入数据 ...

  6. pwntools使用简介3

    连接 本地process().远程remote().对于remote函数可以接url并且指定端口. IO模块 下面给出了PwnTools中的主要IO函数.这个比较容易跟zio搞混,记住zio是read ...

  7. 【转】C# windows服务的创建与调试

    Windows Service这一块并不复杂,但是注意事项太多了,网上资料也很凌乱,偶尔自己写也会丢三落四的.所以本文也就产生了,本文不会写复杂的东西,完全以基础应用的需求来写,所以不会对Window ...

  8. [WPF自定义控件]Window(窗体)的UI元素及行为

    1. 前言 本来打算写一篇<自定义Window>的文章,但写着写着发觉内容太多,所以还是把使用WindowChrome自定义Window需要用到的部分基础知识独立出来,于是就形成了这篇文章 ...

  9. Tomcat 7.0.3x 启动慢并且遇到StackOverflowError的异常的解决办法

    http://qiuboboy.iteye.com/blog/1853216 使用tomcat 7.0.3x版本的同学可以发现tomcat启动慢了不少,而且还可能遇到如下启动时异常: Unable t ...

  10. Ubuntu 配置Apache虚拟目录

    http://blog.csdn.net/spring21st/article/details/6589300 Ubuntu 配置Apache虚拟目录 http://blog.csdn.net/spr ...