像在Worms中一样,构建可破坏的2D景观将涉及哪些步骤?理想情况下,可以通过哪些方式使此过程尽可能高效?
像在Worms中一样,构建可破坏的2D景观将涉及哪些步骤?理想情况下,可以通过哪些方式使此过程尽可能高效?
Answers:
我不知道蠕虫中的风景是如何实现的,但是我很确定他们为风景使用了位图(至少在该系列的较早游戏中如此)。
一种非常基本的方法是位图图像(B / W),其中黑色像素代表空气,白色像素代表地面。使用像素操作可以轻松完成对景观的破坏。因此,如果火箭击中地面,则radius = blastRadius
在撞击点涂一个黑色圆圈。
然后,您可以使用该位图渲染您的世界(或其中的一部分)。为了获得更好的性能,我建议您以某种方式实施它,即您可以仅更新/渲染“世界”的一部分。例如。如果景观的某些部分被火箭摧毁,则仅重新渲染受影响的区域,而不是整个世界。
除了使用黑白图像作为“碰撞图”之外,您还可以使用24位图像,其中使用两个通道存储每个像素的表面法线(x,y),使用一个通道存储实际的“碰撞图”地图”。掌握表面法线将极大地帮助您计算弹跳弹药,或确定角色是否可以沿给定方向移动。
我头上的一种可能性是:
使用矢量图形路径表示形式来存储可破坏“土地”的轮廓。当发生破坏事件时(例如,手榴弹熄灭),爆炸区域(表示为圆圈)将通过布尔减法运算从陆地路径中移除。生成的路径代表了用于地面碰撞检测的新“陆地”,并且还可能是用于绘制陆地的蒙版。
我写了一个概念证明,它使用构造性实体几何来处理可破坏的地形。我使用GLU Tessellator执行布尔运算。该文档说明了如何搜索“绕组规则的CSG用途”。
我将镶嵌器的三角形输出作为静态多边形输入到Box2D中。PoC运作良好。我能够实时任意减去和添加地形,并且Box2D能够继续正确地运行地形。唯一真正的问题是GLU镶嵌器可以生成Box2D不喜欢的退化三角形,因此我不得不手工过滤掉它们。
PoC的下一步(我从未尝试过)是使用Boost图形库中的SCC算法来检测何时割开了一块地形(将山顶切开了)。切断的地形仍将是可破坏的,但现在由动态(非静态)Box2D实体表示,三角形附加为形状。我完成了设计工作,但是一旦我开始研究Boost文档,就失去了兴趣。有一天,当我进行焦土/蠕虫游戏时,我“计划”重新考虑这个想法。
上面所有的答案都讨论了如何实现最简单的情况,例如蠕虫。就是说,当影响范围被破坏而其他一切都没有受到影响时。您是否考虑过,您的景观最终可能会一分为二?假设有一座山,玩家用火箭发射器将其切开。现在,山不应该倒下吗?同样,自然地景观要具有弹性。在蠕虫时代(至少像我记得的那样,我很多年都没有玩蠕虫游戏),计算机还不够强大,无法正确执行。但是现在。
当然,这完全取决于您的项目目标。但是,如果您希望它真的很棒,也许您应该尝试将Box2D用作物理引擎。您可以做很多事情。
正如bummzack所说,Bitmaps。尽管您可以使用1位透明胶片,或者如果您没有该透明胶片,请使用不会在游戏中使用的可怕的粉红色。
只需检查像素颜色即可计算出影响点。当发生影响时,请更改(或删除)位图的颜色。
至于爆炸半径,我的第一站将是布雷森纳姆(Bresenham)的圆算法,非常快速且高效。虽然我会先用方形等粗略的删除,然后将圆围绕它以得到边缘。