COCOS2DX学习之Box2d物理引擎使用之------动态物体的创建
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物理引擎使用之------动态物体的创建的更多相关文章
- [Cocos2D-x For WP8]Box2D物理引擎
物理引擎通过为刚性物体赋予真实的物理属性的方式来计算运动.旋转和碰撞反映.为每个游戏使用物理引擎并不是完全必要的—简单的“牛顿”物理(比如加速和减速)也可以在一定程度上通过编程或编写脚本来实现.然而, ...
- cocos2d-x中的Box2D物理引擎
在Cocos2d-x中集成了2个物理引擎,一个是Chipmunk,一个是Box2D.前者是用C语言编写的,文档和例子相对较少:Box2D是用C++写的,并且有比较完善的文档和资料.所以在需要使用物理引 ...
- 瘸腿蛤蟆笔记29-cocos2d-x-3.2 Box2d物理引擎dynamics模块介绍
转载标明出处:http://blog.csdn.net/notbaron/article/details/38611335 上篇回想 本篇名言:奋斗.寻觅.发现,而不屈服.[诗人丁尼生] 上篇中,我们 ...
- 【极客学院出品】Cocos2d-X系列课程之九-BOX2D物理引擎
Cocos2d-x 是时下最热门的手游引擎,在国内和国外手机游戏开发使用的份额各自是70%和25%,在App Store的top10中,有7个是用它开发的. 本节课程为Cocos2d-x系列课程之九, ...
- 实例介绍Cocos2d-x中Box2D物理引擎:使用关节
下面我们将使用Box2D物理引擎技术进行重构.使得关节能够掌握如何在Box2D使用关节约束.HelloWorldScene.cpp中与使用关节的相关代码如下: void HelloWorld::add ...
- 实例介绍Cocos2d-x中Box2D物理引擎:碰撞检测
在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact ...
- 实例介绍Cocos2d-x中Box2D物理引擎:HelloBox2D
我们通过一个实例介绍一下,在Cocos2d-x 3.x中使用Box2D物理引擎的开发过程,熟悉这些API的使用.这个实例运行后的场景如图所示,当场景启动后,玩家可以触摸点击屏幕,每次触摸时候,就会在触 ...
- 实例介绍Cocos2d-x中Box2D物理引擎:碰撞检測
在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact ...
- libgdx学习记录18——Box2d物理引擎
libgdx封装了Box2D物理引擎,通过这个引擎能够模拟物理现实,使设计出的游戏更具有真实感. libgdx中,Box2d程序的大概过程: 1. 创建物理世界world,并设置重力加速度. 2. 创 ...
随机推荐
- 打开或关闭CD_ROM
实现效果: 知识运用: API函数 mciSendString //函数用来向媒体控制接口设备发送命令 声明如下 [DllImport("winmm.dll",EntryPoin ...
- Eclipse 下载 开源项目 maven依赖丢失和 Deployment Assembly 丢失
周末下载了最新的jeecg的源码来瞅瞅,但是下载后发现,pom文件中定义的依赖都丢失了. 如下图 上网搜索了一下啊,发现需要先给这个项目这个项目 disable maven nature 然后再添加上 ...
- Navicat 模型生成表
打开模型 -> 左上角文件 -> 导出SQL 打开sql文件,将sql在数据库执行,注意主键递增.日期类型 根据当前时间戳更新是否需要(默认选中的)等等
- 【简●解】[AHOI2009]中国象棋
[题目大意] 叫你在\(n×m\)的棋盘上放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,问有多少种放置方法. [关键词] \(DP\) 分类讨论 乘法和加法原理 [分析] 仔细观察就会发 ...
- C#对象初始化的探讨
最近在弄MQ的性能监测数据埋点,无疑中用到一个Nstatsd的客户端,看到里面写过里面一种嵌套类的写法.代码如下: 客户端Client是一个密封的类,并且构造函数私有访问.然后又用一个嵌套类Curre ...
- INFORMATION_SCHEMA InnoDB 表
INFORMATION_SCHEMA InnoDB Tables 本节提供InnoDB INFORMATION_SCHEMA表的表定义. 有关相关信息和示例,请参见"InnoDB INFOR ...
- docker 阿里云镜像加速器
传送门:阿里云镜像地址 Ubuntu/CentOS 安装/升级你的Docker客户端 推荐安装1..0以上版本的Docker客户端,参考文档 docker-ce 如何配置镜像加速器 针对Docker客 ...
- MindManager 设置默认Note字体大小
工具栏 Design > Notes Theme > Default Font
- POJ-2773 Happy 2006,暴力2700ms+水过!
Happy 2006 这个题很可能会超时的,但我几乎暴力的方法2700ms+过了,可能是后台水 ...
- poj 3678 XOR和OR和AND(简单2-sat问题)
/* 题意:给你一些边,每条边有一个值和一个运算符XOR OR AND求是否存在一些点使得所有的边根据这些运算符 可以符合条件的权值. 建边方式参考:http://blog.csdn.net/shua ...