目录

我的学习分享

记录精彩的程序人生

标签: Box2D (32)

【Box2D】12.Box2D C++ 教程-跳跃 有更新!

https://blog.csdn.net/Const_Gong/article/details/51459226 声明:本教程翻译自:Box 2D C++ turorials - Jumping,仅供学习参考。 跳跃(Jumping) 水平滚轴游戏中的角色可以进行跳跃,是吧?现在就让我们看看几种不同实现跳跃的方法。我们已经在之前力和冲量(force and impulses)的话题中进行过相关问题的讨论,但是现在就让我们考虑一下如何把这些方法整合到游戏中。我们可以从匀速运动(moving at constant speed)这个话题开始,在一定范围内左/右控制移动一个动态物体。 直接设置速度 当玩家跳跃的时候他们的速度就会改变,让我们以此为起点。首先在Keyboard()方法中添加一个case分支,来获得玩家的跳跃输入: case 'j': //jump { b2Vec2 vel = body->GetLinearVelocity(); vel.y = 10;//upwards - don't change x velocity body->SetLinear....

【Box2D】29.Box2D C++ 教程-开发环境设置(iPhone) 有更新!

https://blog.csdn.net/Const_Gong/article/details/51469033 声明:本文翻译自Box2D C++ tutorial-Setting up (iPhone),仅供学习参考。 简介 这篇文章针对在iOS上使用Box2D和OpenGL进行开发的环境设置问题。既然这跟环境设置话题中使用testbed框架不一样,那么我么也就让这个教程页单独分离出来,但是如果你现在的情况依然是我六个月前提到的情况,那么这篇文章依然对你有用: 想用Box2D基于iOS开发物理类游戏 比较熟悉C++,并且对于学习Obj-C没有顾虑 想在你的游戏中使用OpenGL 比起使用cocos2d来说,你更愿意使用自己的代码 你从来都没有用过XCode(甚至是Mac) 本篇文章可以作为’绝对的新手’导读,引导大家在XCode工具上使用Box2D创建一个基本的iPhone项目,假设用户对于XCode和Obj-C一无所知。本次将会创建一个正在掉落盒子的场景作为教程的简单例子。 项目仅使用OpenGL ES 1.1,基于XCode 3.2.4以及Box2D 2.1.2. 让项目....

【Box2D】28.Box2D C++ 教程-连接器-平移 有更新!

https://blog.csdn.net/Const_Gong/article/details/51469024 声明:本文翻译自Box2D C++ tutorial-Joints-prismatic,仅供学习参考。 平移连接器(Prismatic joints) 平移连接器可能更多的俗称为滑动连接器。连接器上的两个物体相对于彼此来说保持固定的旋转,它们只能够沿着特定的轴线一起移动。平移连接器可以进行限定,保证其只能沿着某个轴在一定范围内进行移动。还可以设定此连接器的马达,连接的物体会以给定的力矩,以相应的速度进行移动。平移连接器经常使用的场景为: 电梯 移动平台 滑动门 活塞 创建平移连接器 平移连接器第一次创建的时候需要先定义b2PrismaticJointDef并进行设置,然后作为参数传入CreateJoint方法,此方法返回b2PrismaticJoint对象。我们已经在连接器-概述中看到了定义连接器所需要设置的一些共同的属性-连接器中的两个物体,以及它们之间是否会发生碰撞。下面先对这些参数进行设置: b2PrismaticJointDef prismaticJoint....

【Box2D】27.Box2D C++ 教程-连接器-旋转 有更新!

https://blog.csdn.net/Const_Gong/article/details/51469019 声明:本文翻译自Box2D C++ tutorial-Joints-revolute,仅供学习参考。 旋转连接器(Revolute joints) 旋转连接器可以想象成枢纽,锚点,或者转轴。每个物体上都定义一个锚点,物体移动的时候锚点总是重合的,之间的相对转动也是没有限制的(译者注:详细可见Box2D手册第八章旋转连接器部分,此处有一张图,一目了然)。 旋转连接器可以设置限制,让物体的旋转限定在一个固定范围内。也可以设定马达(motor),通过指定扭矩,物体会试着按照给定的速度进行旋转。对于旋转连接器场常见的包括如下: 滚轮或滚筒 链条或悬桥(使用多个旋转连接器) 破布娃娃的关节 转门,弹射器,杠杆 创建旋转连接器 创建旋转连接器首先设置b2RevoluteJointDef属性,然后传递给CreateJoint方法从而获得一个b2RevoluteJoint对象实例。我们在连接器-概述中看到所有连接器的定义都有一些共同的属性-连接两个物体,它们之间是否会发生碰撞。那么先....

【Box2D】26.Box2D C++ 教程-连接器-概述 有更新!

https://blog.csdn.net/Const_Gong/article/details/51469017 声明:本文翻译自Box2D C++ tutorial-Joints-overview,仅供学习参考。 连接器 Box2D中有大量的’连接器(joints)’用来把两个物体连接到一起。这些连接器可以模拟物体之间的相互作用,以此形成铰链,活塞,绳索,车轮,滑轮,汽车,链子,等等吧。学习使用连接器可以高效的帮你创建更吸引人和有趣的场景。 让我们快速浏览一些有效的连接器,然后回顾一下这些特性,最后我们将用其中几个常用的特性完成一个例子。这里是Box2D v2.1.2版本中的一些连接器: 旋转连接器(Revolute)-一个允许物体围绕公共点旋转的铰链顶点的连接器 距离连接器(Distance)-在每个物体上都有一个点以保持之间距离的连接器 平移连接器(Prismatic)-两个物体之间的相对旋转是固定的,它们可以沿着一个坐标轴进行平移 线性连接器(Line)-由旋转和平移组合而成的连接器,对于构建汽车悬架模型很有用 焊接连接器(Weld)-可以把物体固定在相同方向上。 滑轮连接....

【Box2D】19.Box2D C++ 教程-碰撞过滤 有更新!

https://blog.csdn.net/Const_Gong/article/details/51464588 声明:本教程翻译自:Box2D C++ tutorials-Collision filtering,仅供学习参考。 碰撞过滤(Collision filtering) 到目前为止所有场景都是我们自己创建的,场景中的每个定制器(fixture)之间可以互相发生碰撞。这是默认的物理环境,但是可以通过设置’碰撞过滤’(Collision filtering)来控制定制器之间的碰撞状态。在创建定制器的时候,可以设置一些标志位来实现碰撞过滤的功能,具体标志位有: 类别标志位(categoryBits) 遮罩标志位(maskBits) 分组索引(groupIndex) 每一个标志位是一个16位的整数,因此你可以设置16种不同的碰撞类型。其实还是有很大灵活度的,因为可以组合这些标志位,以此可以决定两个定制器之间是否会发生碰撞。带有分组索引标志位的定制器,可以覆盖带有类别/遮罩标志位的定制器集合。 类别和遮罩标志位(category and mask bits) 为定制器设置....

【Box2D】17.Box2D C++ 教程-源代码 有更新!

https://blog.csdn.net/Const_Gong/article/details/51464572 声明:本教程翻译自:Box 2D C++ turorials - Source code,仅供学习参考。 教程源代码 这里你可以下载到教程中所提到相关话题的例子源代码。zip文件中包含了标准的并带有一些额外添加测试的Box2D v2.1.2源码树,所以你应该可以使用cmake或者在Setup话题中提到的相关code::blocks方法进行编译。 教程中例子的源代码(更新到’连接器-棱柱(Joints-prismatic)’)(创建时间:2012年1月1日) 源代码中个别地方可能与教程中讲解页面上的源代码不完全一样,但是大部分都是一样的。 因为测试例子做为头文件都包含在一个.cpp文件中,所以之前早期做过的一些例子和后来做的一些宏定义或者变量名有不一样的地方。 二进制文件 如果你只是想看一下教程里例子运行的效果,你可以下载由上面源代码编译好的二进制文件。除非这就像网站上所使用的flash那样容易获取,这部分是我必须做的 :)。 -Winodws binary(更....

【Box2D】15.Box2D C++ 教程-用户数据 有更新!

https://blog.csdn.net/Const_Gong/article/details/51464486 声明:本教程翻译自:Box2D C++ tutorials - User data,仅供学习参考。 用户数据(User data) 在上一个话题中,我们看到在游戏实体中存储物理对象的的用处。有时候情况相反也许也很有用-在游戏中,一个物理实体指针存储游戏实体。在Box2D中这叫做user data,这是一个能够让你存储有用数据的指针。下面这些类都有这个功能: b2Body b2Fixture b2Joint Box2D不会在意具体内容是什么,而且不会对内容有任何操作。Box2D只是进行存储,然后当你想调用这些数据的时候可以随时获取。上面所提到的类都有下面这两个方法: // in b2Body, b2Fixture, b2Joint void SetUserData(void* data); void* GetUserData(); 在后面的话题中,物体(bodies)和定制器(fixtures)里设置用户数据(user data)会非常有用。那么让我们实现一个简....

【Box2D】14.Box2D C++ 教程-画自己的图像 有更新!

https://blog.csdn.net/Const_Gong/article/details/51459237 声明:本教程翻译自:Box 2D C++ turorials - Drawing your own objects,仅供学习参考。 画自己的图像 从之前的话题中可以看出,很显然使用debug draw不能做出视觉上具有吸引力的游戏。通常我们都会使用我们自己的方法在场景中画图像,然后访问Box2d获取物体的物理信息以此知道在哪里画图像。在本次话题中,我们将会专门定义一个类用作渲染游戏实体,然后我们来看看如何保证实体的物理状态。 现在所有实体类将会进行自身渲染,但是之后我们在其它话题中使用。那些话题中的焦点就不再是渲染图形,所以这里我们在一个圆弧上,画了一张带有微笑的笑脸,并且保证其能够正确移动和旋转。 那么在本话题中,让我们创建一个四方形空的区域作为开始。 FooTest() { // a static body b2BodyDef myBodyDef; myBodyDef.type = b2_staticBody; myBodyDef.position.Set(0,....

【Box2D】13.Box2D C++ 教程-使用debug Draw 有更新!

https://blog.csdn.net/Const_Gong/article/details/51459230 声明:本教程翻译自:Box 2D C++ turorials - Using debug draw,仅供学习参考。 使用debug draw testbed使用一个称为“debug draw”的特性来画你所见到的形状。不过很显然,如果你想让游戏能够更加吸引眼球,还是需要替换那些无聊的多边形的,但是当物理场景中产生问题时,debug draw会变的非常有用。有时候问题发生在游戏场景中的某个部分,比如精灵被显示在错误的位置或错误的旋转方式,产生不正确的物理现象。如果你想准确的检测Box2d世界正在发生什么,那么我建议你保留debug draw的功能。 它的工作方式非常简单。它会告诉你Box2d中所有的形状以及这些形状的位置等。“在x,y位置,半径为r的弧形”,或者“一条从a到b的边”,等其他你所需要的形状。你不必做任何的变换或者担心物体的位置或者哪个定制器属于哪个物体,你可以轻松的画出这些几何形状。这就是说如果你只会画几条线段,也不会把事情搞砸:-)。 testbed中默....

【Box2D】9.Box2D C++ 教程-自定义重力 有更新!

https://blog.csdn.net/Const_Gong/article/details/51459208 声明:本教程翻译自:Box2D C++ tutorials-Custom gravity,仅供学习参考。 为每一个物体指定不同的重力 我们经常会遇到的一个问题是,在其他物体依然遵循重力规则的情况下,如何让指定的物体不受重力影响。其实这实现起来很简单,现在就用我们所了解的力矩试着实现它。我们还是以上一个话题的场景为基础,使用三个独立的物体。 // class member variable to keep track of three bodies b2Body* bodies[3]; FooTest() { //body definition b2BodyDef myBodyDef; myBodyDef.type = b2_dynamicBody; // shape definition b2PolygonShape polygonShape; polygonShape.SetAsBox(1, 1); // a 2x2 rectangle // fixture de....

【Box2D】8.Box2D C++ 教程-力和冲量 有更新!

https://blog.csdn.net/Const_Gong/article/details/51459197 声明:本教程翻译自:Box2D C++ tutorials-Forces and impulses,仅供学习参考。 力和冲量(Forces and impulses) 让物体移动,需要对其施加力或者冲量。可以通过时间的不断积累对物体施加力的作用来改变物体的运动,然而冲量作用于物体则会立刻改变物体的速度。举个例子,想象一下现在你的车坏了,你想推车,可以选择驱动另外一辆车缓慢开向这辆坏了的车,当两辆车的保险杠接触之后,继续对这辆车施加推力,然后通过时间不断的积累慢慢的让其移动。或者也可以用冲量,驱动一辆完好的车全速驶向这辆坏了车。具体使用哪种方法取决于你。 也可以通过简单设置物体的位置来瞬间‘曲速(参见Warp drive)’物体。在游戏中你可能想有一个瞬移的特性,但是你要知道在真正的物理世界当中并不存在这样一种特性!Box2D的全部侧重点是让所模拟的物体看起来更真实,基于这一点考虑我会建议你尽量使用力和冲量来移动物体。大多数时候这么做看起来貌似过于严谨,但是在真实的世界....

【Box2D】7.Box2D C++ 教程-设置世界 有更新!

https://blog.csdn.net/Const_Gong/article/details/51459188 声明:本教程翻译自: Box2D C++ tutorials-World settings ,仅供学习参考。 世界(Worlds) 世界(Worlds)作为Box2D世界里主要的实体,在之前的讨论话题中已简单的介绍过。当你创建或者删除物体的时候,可以调用世界里的方法来完成这些功能,所以世界也管理着所有对象的空间分配。这也就意味着世界非常重要,那么就让我们来看看世界到底可以做些什么吧。 -定义重力加速度 -调用物理模拟 -发现定制器的作用域 -切断射线并找到相交的定制器 最后两个特性会在稍后的话题里展开讲解,目前我们只看第一个特性以及世界的生命周期。testbed框架为我们完成了这些,而且作为m_world类成员变量我们也已经使用过了,所以相比于创建一个测试场景来说,我们只对它做一个快速查看。 世界(world)的创建像其它普通类型一样,在构造函数里进行基本的设置。 b2Vec2 gravity(0, -9.8); // normal earth gravity, 9....

【Box2D】6.Box2D C++ 教程-定制器 有更新!

https://blog.csdn.net/Const_Gong/article/details/51459183 声明:本教程翻译自: Box2D C++ tutorials- Fixtures ,仅供学习参考。 定制器(Fixtures) 定制器用来描述场景中对象的大小,形状,材质属性等。一个物体可以附加多个定制器,物体的质心会被定制器的附加顺序所影响。当两个物体相撞时,会根据各自的定制器作出相应的反应。定制器的主要属性如下: 形状 - 多边形或圆弧 恢复 - 定制器的弹力 摩擦 - 光滑程度 密度 - 物体大小的重量 我们会谈到上面的每一个概念,并针对它们做一些实验(isSensor属性可以让定制器变成’传感器‘,之后的教程里我们会谈到它)。让我们就以上一次话题’物体‘作为起点,创建一个简单的动态物体作为开始吧。那么FooTest类的构造函数看起来会是下面这个样子: FooTest() { b2BodyDef myBodyDef; myBodyDef.type = b2_dynamicBody; // this will be a dynamic body myBody....

【Box2D】5.Box2D C++ 教程-物体 有更新!

https://blog.csdn.net/Const_Gong/article/details/51459174 声明:本教程翻译自:Box2D C++ tutorials-Bodies,仅供学习参考。 物体(Bodies) 物体是物理场景中的基本对象,但是这里的物体并不是你看到的实际互相弹跳碰撞的实物。听起来很费解吗?挺住!马上做解释! 你可以把物体想象成是一种看不见摸不着的实物的属性。这些不可见的属性是: 质量(mass)-实物到底有多重 速度(velocity)-某方向上实物到底运动多快 转动惯量(rotational inertia)-开始或停止转动需要多大的力 角速度(angular velocity)-某方向实物转动的速度有多快 位置(location)-实物在哪 角度(angle)-实物面向哪个方向 即便你知道一个对象的所有这些特性,你仍然不清楚这个对象的长相或者它与其它物体产生碰撞的时候会作出什么样的反应。我们需要使用定制器(fixtures)来定义物体的形状和大小,关于定制器我们会在本教程的下一个话题进行讲解。目前我们还是使用一个简单的盒子来代替随后出现的定....

【Box2D】4.Box2D C++ 教程-创建测试 有更新!

https://blog.csdn.net/Const_Gong/article/details/51459168 声明:本教程翻译自:Box2D C++ tutorials-Making a test,仅供学习参考。 创建属于你的测试 让我们向testbed中添加一个测试,这里只是一个简单的例子,一开始不会实现很多功能,但是作为一个例子我们会看到所有需要编辑和修改的地方。 首先需要一个Test类的子类来定义测试自身。在Testbed/Tests文件夹下面,应该可以找到一大堆在testbed项目中使用的名字相近的.h头文件。在这个目录下可以添加自己创建的.h头文件,取一个简洁的名字比如呃…FooTest。现在,我们将会创建一个只能在屏幕顶部显示一些文本的空例子。 #ifndef FOOTEST_H #define FOOTEST_H class FooTest : public Test { public: FooTest() { } //do nothing, no scene yet void Step(Settings* settings) { //run the defaul....

【Box2D】3.Box2D C++ 教程-Testbed结构 有更新!

https://blog.csdn.net/Const_Gong/article/details/51459143 声明:本文翻译自Box2D tutorials-Testbed structure ,仅供学习参考。 Testbed结构 testbed框架可以让你高效的添加新的测试。当定义一个新的测试,只要写出针对于测试必要的代码即可。相对于所有测试来说的,相同功能的方法例如,创建、销毁、重设,以及控制面板上的选中框和按钮,都由testbed框架来处理,永远都不需要你亲自更改。 每个测试的设置方法——如何设置场景,鼠标/键盘的输入,等等,可以按需设置。在创建属于我们自己的测试之前,先来看看一个测试的生命周期是怎样的。 图中橘色的部分,是我们在自己的测试中需要添加或修改的部分。具体来说,我们会通过创建一个Test类的子类,Test类封装了所有公共特性,我们会在子类中覆盖其中一些方法。让我们来看几个在Test类中可能会用到的虚方法。 class Test ...{ virtual void Step(Settings* settings); virtual void Keyboard(....

【Box2D】2.Box2D C++ 教程-环境设置 有更新!

https://blog.csdn.net/Const_Gong/article/details/51457330 声明:本文翻译自Box2D C++ tutorial-Setting up ,仅供学习参考。 环境设置包括三种主流系统: -Windows -Linux -Mac 由于最新的Box2D版本,源码中针对Windows和Mac平台中的主流IDE(VS2010和XCode4)已经进行了整合,所以这里就不进行翻译了,再者教程原文中的设置看起来已经过时了,有兴趣的读者可以自己查看,目的主要就是让Testbed例子跑起来。因为教程的后面都是基于这个框架对例子进行讲解的。 下面简单说一下基本操作步骤,源代码下载下来之后,进行解压,打开Box2D v2.2.1文件夹,进入Build目录即可看到名为VS2010和XCode4的两个文件夹,进入对应的文件夹即可看到对应的IDE入口程序。这里我用的是XCode4,用XCode4打开后,选择左上角的项目名称为Testbed,编译即可运行,顺利的话即可看到类似下面的窗口, 如果看到类似这个窗口,那么祝贺你,你成功了! Box2D C++ ....

【Box2D】1.Box2D C++ 教程-简介 有更新!

https://blog.csdn.net/Const_Gong/article/details/51457221 声明:本文翻译自Box2D C++ tutorial-Instroduction 仅供学习参考。 简介 Box2D这个名字是世界上2D物理引擎中最好的命名,在如今大部分软件都习惯采用动物的名字命名的情况下,似乎Box2D这个名字看起来有点土,但是名字仅仅是个名字,就像玫瑰总是能够散发出香气一样,不管她叫什么玫瑰。轻量级、健壮、高效以及非常的小巧。并且在很多平台上都开辟了很多应用。而且还是开源和免费的。详情可见Box2D官方网站http://www.box2d.org。 物理引擎实现了在实时逼真的环境中对物体的物理特性进行了模拟。虽然她可以在很多其他应用中使用,但是她的诞生却是作为游戏中的类库而产生的,因此大部分的游戏软件都会以Box2D作为主要的物理引擎来使用。引擎主要是由Erin Catto(译者注:作者twitter:@Erin Catto,需翻墙)开发并维护,牛b的物理引擎使用起来不应该像全日制工作那样不爽,但是使用牛b的Box2D物理引擎完全可以轻松的当作一种....

【Box2D】10.Box2D C++ 教程-匀速运动 有更新!

https://blog.csdn.net/Const_Gong/article/details/51459214 声明:本教程翻译自:Box2D tutorials-Moving at constant speed,仅供学习参考。 以匀速移动物体 游戏中一种常见的需求是让物体做匀速运动。例如横屏游戏中的玩家角色,太空飞船或者汽车,等等。根据游戏的不同,有时候物体应该逐渐改变速度,其他情况又希望能够瞬间开始和停止运动。使用SetLinearVelocity方法精确的设置物体速度,这种方法看起来非常诱人,而且这么做也可以达到目标,但是这种方法有其自身的缺点。虽然这么做在屏幕上看起来很好,但是直接设置物体的速度不是参与模拟物理世界的正确方法。让我们看看如何使用实际的力和冲量来使物体达到特定速度。 我们将会看到两种情况,一种是物体立即开始移动到特定速度,另一种是物体缓慢移动直到达到特定速度。一开始,我们需要一个有动态物体的场景,然后再放一些静态物体的篱笆墙来防止这个动态物体到处跑。篱笆墙的场景在后面的话题中还会经常遇到。为了持续跟踪用户所做的操作,我们会创建一个类成员变量来记录上一次用户....