实现2D可破坏景观(例如蠕虫)


76

像在Worms中一样,构建可破坏的2D景观将涉及哪些步骤?理想情况下,可以通过哪些方式使此过程尽可能高效?


7
很好的问题。蠕虫有两个挑战:可破坏性,以及在怪异的角度上移动。
ashes999 2010年

我认为这里已经被问过很多次了
Vishnu 2010年

2
不错,相关链接似乎并不表明这一点。
共产党鸭子

3
您可以在Hedgewars中检查它是如何完成的-它是开源的Worms克隆。
GvS

答案还不够,但是您可能还想看看Clonk。这是由德国开发人员开发的较旧的2D游戏,它也具有可破坏的地形,直至特定像素。它不再在开发中,但是源代码可以在上面的链接下找到。还有开源的继任者OpenClonk,但是从视频中看,它似乎已经摆脱了像素完美的破坏,并朝着Terraria风格的方向转向了可以破坏的块。
基督教徒

Answers:


47

我不知道蠕虫中的风景是如何实现的,但是我很确定他们为风景使用了位图(至少在该系列的较早游戏中如此)。

一种非常基本的方法是位图图像(B / W),其中黑色像素代表空气,白色像素代表地面。使用像素操作可以轻松完成对景观的破坏。因此,如果火箭击中地面,则radius = blastRadius在撞击点涂一个黑色圆圈。

然后,您可以使用该位图渲染您的世界(或其中的一部分)。为了获得更好的性能,我建议您以某种方式实施它,即您可以仅更新/渲染“世界”的一部分。例如。如果景观的某些部分被火箭摧毁,则仅重新渲染受影响的区域,而不是整个世界。

除了使用黑白图像作为“碰撞图”之外,您还可以使用24位图像,其中使用两个通道存储每个像素的表面法线(x,y),使用一个通道存储实际的“碰撞图”地图”。掌握表面法线将极大地帮助您计算弹跳弹药,或确定角色是否可以沿给定方向移动。


3
存储额外的信息是碰撞图是一个好主意。
deft_code 2011年

6

我头上的一种可能性是:

使用矢量图形路径表示形式来存储可破坏“土地”的轮廓。当发生破坏事件时(例如,手榴弹熄灭),爆炸区域(表示为圆圈)将通过布尔减法运算从陆地路径中移除。生成的路径代表了用于地面碰撞检测的新“陆地”,并且还可能是用于绘制陆地的蒙版。


2
我认为这就是《刺猬》的做法。@Bill,您可以看一下,因为它是开源的。
加斯顿(Gastón)2010年

2
@GastónHedgewars中的地图都是图像(PNG)。我怀疑它们是否已转换为矢量图形。另外:使用矢量图形(样条曲线,贝塞尔曲线等)在诸如碰撞检测或减去形状之类的事情上会占用更多CPU资源。尽管看一下源代码是一个好主意(尽管编码风格很糟糕:))
bummzack 2010年

4
这样的计算几何会变得非常复杂,非常快!
亚当·哈特

谷歌搜索“ box2d可破坏地形”现在给出了一些可运行的矢量演示。
Ciro Santilli新疆改造中心法轮功六四事件

6

使用构造实体几何

我写了一个概念证明,它使用构造性实体几何来处理可破坏的地形。我使用GLU Tessellator执行布尔运算。该文档说明了如何搜索“绕组规则的CSG用途”

我将镶嵌器的三角形输出作为静态多边形输入到Box2D中。PoC运作良好。我能够实时任意减去和添加地形,并且Box2D能够继续正确地运行地形。唯一真正的问题是GLU镶嵌器可以生成Box2D不喜欢的退化三角形,因此我不得不手工过滤掉它们。

PoC的下一步(我从未尝试过)是使用Boost图形库中的SCC算法来检测何时割开了一块地形(将山顶切开了)。切断的地形仍将是可破坏的,但现在由动态(非静态)Box2D实体表示,三角形附加为形状。我完成了设计工作,但是一旦我开始研究Boost文档,就失去了兴趣。有一天,当我进行焦土/蠕虫游戏时,我“计划”重新考虑这个想法。


5

上面所有的答案都讨论了如何实现最简单的情况,例如蠕虫。就是说,当影响范围被破坏而其他一切都没有受到影响时。您是否考虑过,您的景观最终可能会一分为二?假设有一座山,玩家用火箭发射器将其切开。现在,山不应该倒下吗?同样,自然地景观要具有弹性。在蠕虫时代(至少像我记得的那样,我很多年都没有玩蠕虫游戏),计算机还不够强大,无法正确执行。但是现在。

当然,这完全取决于您的项目目标。但是,如果您希望它真的很棒,也许您应该尝试将Box2D用作物理引擎。您可以做很多事情。


3
在蠕虫中,您可以使用割炬在景观上挖一个洞。如果那个隧道只是在挥舞着可怜的火炬的蠕虫上倒塌,那不会太有趣了。也有可能使景观碎片“漂浮”在空中。您的建议听起来像是一个有趣的主意,不像蠕虫游戏。
bummzack 2010年

这就是全部,我正在考虑该游戏玩法的变化。同样,景观的某些部分可能是不可破坏的和/或永久悬浮在空中,这将使您创建“浮动”块。另外,有些飞机可能会受到恒定的力,将它们向上或向侧面拉,就像空气在《咕咕世界》中所做的一样。
Septagram 2010年

这很有趣,因为我实际上正在考虑制作这样的游戏,这对Worms机械师来说是一个有趣的转折。位图刚体的概念本身无疑将是一个有趣的话题,但是复杂性有点让我感到头疼。
威廉·卡萨林

好吧,在这种情况下,位图刚体是行不通的,相反,我将景观设计为弹性连接的三角形三角网格。你玩过粘胶世界吗?如果没有,请参阅屏幕截图:vgchartz.com/games/pics/6644424aaa.jpg doublegames.de/images/screenshots/world-of-goo_1_big.jpg。不,不,不,不,如果您不玩它,则绝对必须:)现在想象一下,每个三角形都不会显示粘性球,而是显示您的景观纹理的一部分,并且更小。摆弄常数,您的风景就会变得很坚硬或像果冻一样柔软
Septagram 2010年

2
看一下物理引擎。整个引擎都基于这样的想法,即一切都是可变形/可破坏的晶格(如塔楼)。
deft_code 2011年

3

正如bummzack所说,Bitmaps。尽管您可以使用1位透明胶片,或者如果您没有该透明胶片,请使用不会在游戏中使用的可怕的粉红色。

只需检查像素颜色即可计算出影响点。当发生影响时,请更改(或删除)位图的颜色。

至于爆炸半径,我的第一站将是布雷森纳姆(Bresenham)的圆算法,非常快速且高效。虽然我会先用方形等粗略的删除,然后将圆围绕它以得到边缘。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.