目录

我的学习分享

记录精彩的程序人生

存档: 2019 年 08 月 (41)

【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】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】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】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】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】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】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】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】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】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++ ....