记录精彩的程序人生
https://blog.csdn.net/Const_Gong/article/details/51464603 声明:本文翻译自Box2D C++ tutorial-World querying,仅供学习参考。 查询World 通常你可能想知道在给定的场景中都有哪些实体。例如有一个炸弹爆炸了,周围的所有实物都会受到不同程度的破坏,那么在RTS(译者注:Real-Time Strategy,即时战略)游戏当中,当玩家拖拉一个选框的时候,玩家可以合理的选中其中尚未完全破坏的单位。这种快速查询部分场景中尚未被完全损坏的单位的方法及其细节,就属于“查询World”的范畴。 Box2D提供了两个工具来完成这个功能-射线投射和AABB框测试。呃,射线投射是…别忘了上一篇刚刚介绍过哦!在上一篇中我们使用近似纯手工的方法实现的这个功能,当时通过遍历World中的定制器(fixture)来检测哪个物体距离射线原点最近。当场景中有大量物体时候,这种方法很低效。一个更好的办法是使用world自有的RayCast方法。此方法可以通过引擎来捕捉射线路径附近的定制器。 射线投射,高效的遍历方法 既然上一篇中我....
https://blog.csdn.net/Const_Gong/article/details/51464597 声明:本教程翻译自:Box2D C++ tutorials - Ray casting,仅供学习参考。 射线投射经常用来找出部分物理世界当中已经存在的物件。所谓射线就是一条直线,我们可以通过使用Box2D当中提供的方法来检测是否与某个定制器(fixture)有交点。我们也可以找出与定制器交点的法线。 下面就是上面我提到的方法,如果射线与某个定制器发生碰撞则返回true。这里需要注意的是此方法是b2Fixture类的一个成员,这也就是说首先我们满足一个射线对儿这个基本条件才行。 bool b2Fixture::RayCast(b2RayCastOutput* output, const b2RayCastInput& input); 现在让我们看一下输入、输出参数。直接从源代码中可以看出b2RayCastInput包含了哪些参数: // Ray-cast input data. The ray extends from p1 to p1 + maxFracti....
https://blog.csdn.net/Const_Gong/article/details/51464593 声明:本教程翻译自:Box2D C++ tutorials-Sensors ,仅供学习参考。 传感器(Sensors) 在上一个话题中,我们看到,可以通过一些设置防止两个定制器发生碰撞。它们肆无忌惮的互相穿透,好像压根儿就没有看到对方,即便它们在穿透的过程中停止运动,也会保持着重叠的状态。也许这可能就是你想要的特性,但这么做有一个缺陷:既然互相之间没有碰撞,那么我们也就永远都不会获得BeginContact/EndContact信息。 如果我们让两个实体不发生碰撞,就像上一个话题例子中的船和飞机一样,但是我们依然想知道它们之间什么时候发生重叠。比如说,当一架敌军飞机飞到我方友军船只头顶的时候投下一枚炸弹,或者是其它类似的游戏逻辑。如果简单的关闭船和飞机之间的碰撞特性,那么我们就得不到重叠的响应事件,不过我们还有另外一个办法。 当你创建定制器(fixture)的时候,可以设置成员变量isSensor为true,设置此定制器为’传感器(sensor)’的一员,或者如果定制....
https://blog.csdn.net/Const_Gong/article/details/51464583 声明:本教程翻译自:Box2D C++ tutorials Collision callbacks,仅供学习参考。 碰撞回调(Collision callbacks) 当物理场景中的物体移动或者彼此之间发生碰撞的时候,Box2D会为我们处理所有必要的碰撞检测,对于这一点我们不必过于担心。但是就整个游戏来说,偶尔我们需要在物体发生碰撞的时候触发一些事件。例如当游戏玩家触碰到怪物的时候,玩家应该over,等等。我们需要一种从物理引擎获取此信息的方法。 在画自己的图像这个话题中,我们在游戏场景中创建了一个物体作为研究对象,并在每一帧对物体当前位置做了查询操作,并对物体进行了渲染。之所以每帧对物体都进行渲染,是因为物体的位置/旋转每一帧似乎都在不停的变化。但是碰撞则有一点点不一样,它并不是每一帧都会发生,它的发生频率通常少于渲染帧率。所以如果还是每帧都去询问物理引擎某个物体是否发生碰撞,这就像是旅行当中,车中后座的孩子不停的问你:”我们到了吗?怎么还没到啊…“,而大部分时候得....
https://blog.csdn.net/Const_Gong/article/details/51469002 声明:本文翻译自Box2D C++ tutorial-Removing bodies safely,仅供学习参考。 安全地移除物体 除非你正在完成一个最基本的游戏,否则很有可能你会在游戏进行的某一时刻删除一些物体。比如说当玩家杀死一个敌人后,所发出的子弹需要被清除掉,还比如说两个物体发生碰撞其中一个完全毁坏,等等很多此类的例子。在代码中移除一个物体简单的令人发指-只要调用world->DestroyBody(b2Body*),如果进行删除操作期间没有对此物体发生调用,那么整个删除操作就完成了。问题经常出现在删除物体的同一个时间步长内发生对此物体的调用,通常是一个碰撞回调。如果我们回想一下之前碰撞回调的方法,我们会发现不能在碰撞回调内部删除物体,因为此时world正好运行在同一个物理步长中,此时被删除的物体还处于运行期间,这么做不是一个好的办法。 如果你使用线程或者计时器(timers)来移除物体的话,会经常碰到类似的情况,比如说你想在游戏中某个事件发生后的几秒钟删....
****https://blog.csdn.net/Const_Gong/article/details/51469008 声明:本文翻译自Box2D C++ tutorial-Ghost vertices,仅供学习参考。 题外话:因为在Box2D的用户手册的第四章中,我把ghost vertices翻译成了幽灵顶点,所以这里还延续这个翻译吧,如果有人有更恰当的翻译,指出来我会改正,:)。好了,下面开始正文。 (注意:本话题接下来要说的内容和其它教程并不太一样,因为其它教程是基于Box2D v2.1.2版本的,此版本没有边缘形状(译者注:edge shapes,以后简称为边缘)这个概念。我刚开始写这个话题的时候差点忽略了这个问题。本次话题的讨论基于Box2D v2.2版本。) 幽灵顶点(Ghost vertices) 在’跳跃问题‘这个话题中我曾经说过,对于大多数学习Box2D的新同学来说,最常问的问题就是“如何告诉我的游戏角色当前正站在地面上?”。现在看来,在这问题上貌似是我错了…由此也引出我们今天的这个话题。 最近出现一个常见的问题是“为什么我的角色在平坦的地面上移动的时候会出现一....
https://blog.csdn.net/Const_Gong/article/details/51464567 声明:本教程翻译自:Box 2D C++ turorials - Anatomy of a collision,仅供学习参考。 在Box2D中,经常会遇到物体之间的碰撞问题,当一个碰撞发生时,就是利用定制器(fixtures)用来做碰撞检测的。碰撞可以以很多种方式进行,我们可以在碰撞过程中获取大量信息用在游戏逻辑中。 比如说,你可能想知道这几条信息: 碰撞的开始和结束 定制器中的哪个点有碰撞接触 定制器之间法向量的关系 碰撞过程中产生了多大的能量以及会产生有多大的响应 通常情况下碰撞发生的速度非常快,但是这篇文章我们会对一个碰撞进行讨论,把它的速度降到很慢,以此让我们来仔细看看碰撞过程中到底发生了什么,以及我们可以从中得到哪些相关信息。 故事发生在两个多边形定制器(fixtures)之间,为了能够更好的控制这两个多边形,我们选择在失重的世界(重力加速度为零)创建它们。其中一个是静止的四方盒子,另一个是面向四方盒子进行横向移动的三角形。 场景中,三角形底部的角会和盒子....
https://stackoverflow.com/questions/21606528/libgdx-box2d-change-maxpolygonvertices?r=SearchResults I need to make a body with more than 8 vertices, and i get the error. AL lib: (EE) alc_cleanup: 1 device not closed Assertion failed! Program: C:\Program Files\Java\jre7\bin\javaw.exe File: /var/lib/jenkins/workspace/libgdx/gdx/jni/Box2D/Collision/Shapes/b2PolygonShape.cpp, Line 122 Expression: 3 <= count && count <= 8 How can I change that constant? I found this file https://github....
https://blog.csdn.net/Const_Gong/article/details/51469007 声明:本文翻译自Box2D C++ tutorial-The ‘can I jump’ question,仅供学习参考。 在地上是我的特性吗? 如果曾经遇到了关于Box2D的问题,多半可能有“我如何告诉我的游戏角色当前是站在地上的”。我想这个问题如此频繁的冒出来的首要原因,是因为类似回调方法可以得到接触信息有关-回调方法可以抛出与当前物体自身不同的相关信息,或许还因为可以获知当前接触到什么,什么是需要程序员自己实现而不能用库方法编译生成的。不管是上面哪一种情况,其实我们已经在之前的话题中有所覆盖。碰撞回调话题中处理了开始和结束接触事件。传感器话题中我们展示了一个持续跟踪“当前接触”链表的例子。 那么接下来我们要讨论什么呢?呃,我在猜当很多人碰到这个问题的时候都会找到这个页面,所以我把之前讨论的两个话题放到了文章的开始位置为的是能够更好的有个了解。之前我还想过或许比较好的办法是对这些技术做一些改动然后完成一个示范,这或许也是遇到问题的朋友通常所希望的,就像是一个完整的游戏总....
在BOX2D 中如何控制body 自然的旋转到一个指定角度?
https://www.codeandweb.com/texturepacker/tutorials/libgdx-physics Get Sourcecode from GitHub This tutorial is for libGDX beginners, explaining how to create sprite sheets, use sprites in your game and add game physics. Creating a new project Using Gradle to import & manage dependencies Creating sprite sheets Using sprites Creating physics collision shapes Editing physics parameters Using physics in your game Create a new LibGDX application Start by downloading the setup app that LibGDX pro....
b2BodyDef中的linearDamping:模拟刚体线性速度摩擦力,线性速度阻尼,取值范围在0~1。线性速度阻尼越大,刚体移动速度降低的越快,反之亦然。在正常的重力加速度环境下,刚体会因最终落至地面而停止运动,用到linearDamping线性阻尼的情况比较少。在重力加速度为0的俯视和太空类游戏中,在没有发生碰撞的情况下,刚体不受外力影响,会保持匀速运动,这是可以通过设置linearDamping线性速度阻尼,来模拟地面摩擦力或空气阻力,让刚体“尽快”停下来。通常不使用线性阻尼,因为它会使物体看起来有点儿漂浮。 b2BodyDef中的angularDamping:模拟刚体角速度摩擦力,刚体角速度阻尼,或者叫做“旋转摩擦力”可能会更好理解一些。该属性值取值范围在0~1之间,取值越大角速度降低的越快,取值越小角速度降低的越慢。 b2FixtureDef中的friction:模拟刚体表面摩擦力,刚体表面摩擦系数,取值范围0~1,取值越大,刚体表面摩擦力越大。friction和linearDamping有些相似,但又不完全一样。它们都是影响刚体的线性速度,friction决定了两个刚体之....