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物理引擎使用之------动态物体的创建,布布扣,bubuko.com

时间: 2024-12-22 22:37:47

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

COCOS2DX学习之box2d物理引擎在VS2012中的配置

因为vs中并没有继承box2dz游戏物理引擎,所以在开发有关box2d的游戏的时候,要自己将这个引擎添加进去.首先在解决方案中添加一个已经存在的项目,这个项目的路径就是你创建的cocos2dx项目的目录里面cocos2d\external\Box2D\proj.win32这个文件夹下面的一个vs工程,把它添加进去编译好,就会看到proj.win32\Debug.win32中有了Box2d的库. 之后,将生成的box2d的库添加到项目属性的连接器中即可 tool是我创建的coocs2dx项目 CO

COCOS2DX学习之Box2D物理引擎-------物体和相互作用

1.创建一个静态物体 创建一个静态物体应该很简单,在头文件生命一下要创建新物体的函数,然后在cpp文件中实现它即可. 具体的时候先过程,首先要用createbody函数创建一个物体,然后定义一个b2bodydef变量,指定一下这个变量的type还有position.这样的话一个最简单的静态物体就算是创建好了. 2.物体的相互作用 但是我们虽然创建了两个物体但是在运行的时候发现依然没有看到静止的物体挡住了动态运动的物体,这就是两个物体并没有发生相互作用. 为了让两个物体发生相互作用,我们要设置一个

cocos2d-x中的Box2D物理引擎

在Cocos2d-x中集成了2个物理引擎,一个是Chipmunk,一个是Box2D.前者是用C语言编写的,文档和例子相对较少:Box2D是用C++写的,并且有比较完善的文档和资料.所以在需要使用物理引擎的时候,大多数开发者会选择Box2D.Box2D是一款用来模拟刚体在物理世界运动的仿真引擎.通过Box2D物理引擎,世界中的物体就可以按照运动定律进行运动. 注:Box2D下的类都是以b2为前缀的,希望不要与你的命名相冲突 1. 首先我们介绍下需要用到的基本概念. 世界(world) :世界代表了

瘸腿蛤蟆笔记34-cocos2d-x-3.2 Box2d物理引擎World类介绍

上篇回顾 本篇名言:将爱的能量传送给别人,我们自己就会变成一条管道,吸纳来自上天的神圣能源.而那种玄秘体验是我们每个人都得以品尝的! [詹姆士·雷德非] 上篇中,我们学习了Box2d物理引擎dynamics模块中的Contact类,该类包含所有的接触类型.物体碰撞的具体都在该类中. 蛤蟆接着学习dynamics模块中的类,这次咱们学习World这个类. 理论介绍 World类(其实是b2World类,蛤蟆之前说过,Box2d中的类都是b2开头的)包含Body和Joint. 它管理所有的仿真允许异

瘸腿蛤蟆笔记42-cocos2d-x-3.2 Box2d物理引擎Motor Joint

瘸腿蛤蟆原创笔记,欢迎转载,转载请标明出处: 源码下载: http://download.csdn.net/detail/notbaron/7900243 上篇回顾 本篇名言:对"战士旅行者"而言,选择其实不是去选择,而是优雅地接受"无限"的邀请.[唐望] 上篇中,蛤蟆学习了Box2d物理引擎中的持续施加力,接下去蛤蟆继续学习其他的Box2d引擎的使用.这次我们使用Box2d物理引擎来学习 Motor Joint     . 理论介绍 本次的理论知识, 咱们回顾下M

瘸腿蛤蟆笔记28-cocos2d-x-3.2 Box2d物理引擎collision模块介绍

上篇回顾 本篇名言:绝不测量山的高度─除非你已到达顶峰,那时你就会知道山有多低. [哈马绍] 上篇中,我们学习了Box2d物理引擎的三大模块之一的common模块,该模块主要包含设置,内存管理和向量数学. 这次蛤蟆接着学习collison模块. 理论介绍 这个collision模块包括了shapes和函数.同时包括一个动态树和broad-phase(蛤蟆不知道怎么解释这个)用于加速碰撞系统.这个模块设计的时候是在动态系统之外使用的.        Shape 这里的shapes描述了碰撞几何,可

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

上篇回顾 本篇名言:奋斗.寻觅.发现,而不屈服.[诗人丁尼生] 上篇中,我们学习了Box2d物理引擎的三大模块之一的collision模块,该模块主要包含形状shape,碰撞函数和动态树等概念. 这次蛤蟆接着学习dynamics模块. 理论介绍 Dynamics模块是Box2d引擎中最复杂的,也是基本上我们打交道最多的模块了.该模块建立在common和collision模块之上,所以需要我们先了解common和collision模块. Dynamics模块包含几大类:  fixture cla

瘸腿蛤蟆笔记39-cocos2d-x-3.2 Box2d物理引擎自由落体实现

瘸腿蛤蟆原创笔记,欢迎转载,转载请标明出处: 上篇回顾 本篇名言:烦恼使我受着极大的影响--我一年多没有收到月俸,我和穷困挣扎:我在我的忧患中十分孤独,而且我的忧患是多么多,比艺术使我操心得更厉害! [米开朗基罗] 前段时间蛤蟆出差北京去了,好在中秋节前回来了哈哈. 上篇中,蛤蟆学习了Box2d物理引擎中的Ray-cast代码解释,接下去蛤蟆继续学习其他的Box2d引擎的使用.这次我们使用Box2d物理引擎来学习物理掉落的情况. 理论介绍 本次的理论知识基本和上次RayCast一致,需要补充如下

瘸腿蛤蟆笔记36-cocos2d-x-3.2 Box2d物理引擎Ray-cast使用

瘸腿蛤蟆原创笔记,欢迎转载,转载请标明出处: 上篇回顾 本篇名言:人类心灵深处,有许多沉睡的力量:唤醒这些人们从未梦想过的力量,巧妙运用,便能彻底改变一生.[澳瑞森·梅伦] 上几篇中,蛤蟆学习了Box2d物理引擎中如何将我们创建的物理体给描绘在程序里面.让我们能够看到一个非常直观的物体,便于后续进一步学习和理解. 具体步骤 我们还是使用helloworld工程. 1.  首先将\cocos2d-x-3.2\tests\cpp-tests\Classes\Box2DTestBed目录中的6个文件G