我想使用OpenGL制作一个2D的像Worms一样有可摧毁地形的游戏。
- 实现这个功能的最佳方法是什么?
- 逐像素绘制?(嗯,不好吧?)
- 将世界作为纹理并对其进行操作(是否可能?)
提前感谢您的帮助。
考虑到Worms游戏中地形的外观,我想到了这个想法。但是我不确定你如何在OpenGL中实现它。这更像是一种分层2D绘图方法。无论如何我还是要发布这个想法。我使用Paint.NET模拟了这种方法。
首先,你有一个背景天空层。
然后你有一个地形层。
地形层被掩蔽以便顶部部分不被绘制。将地形层放在天空层上方以形成场景。
现在是主要的想法。每当发生爆炸或其他改变地形的事件时,您可以在地形层上绘制圆形或其他形状,使用地形层本身作为绘图掩模(因此只绘制与现有地形重叠部分的圆形部分),以擦除部分地形。使用透明/掩蔽颜色的笔刷进行填充,并使用类似于地形的颜色进行粗笔触绘制。
您可以重复此过程以添加更多变形。如果没有太多的变形需要渲染,您可以将此层保留在内存中并在发生变形时添加它们,甚至可以每帧在内存中进行渲染。
我猜你最好使用具有正确映射的纹理填充多边形(线性映射不会拉伸纹理以使用所有纹素,而是将裁剪区域留出),然后在它们被摧毁时重新塑造它们。
我猜你的问题是如何实现角色/武器/地形之间的碰撞。
只要你不是在OpenGL ES上进行,你可以使用模板缓冲区来进行逐像素碰撞检测,并将你的地形作为一个可修改的单一纹理。
这个页面会给你一个想法: http://kometbomb.net/2007/07/11/hardware-accelerated-2d-collision-detection-in-opengl/
当某些物体爆炸时,您将使用几何布尔运算 (矩形-圆) 处理纹理(揭示背景)和 '可行走' 路径。
我想说的是,您要执行几何布尔运算,并使用结果来更新纹理(使用 alpha 蒙版或其他方法)和更新用于跟踪可行走区域的数据结构(无论是哪一个)。
将事物分开,而不仅依赖于 gl 绘图方法。
我认为首先要将前景绘制到模板缓冲区中,这样模板缓冲区就会在任何有前景的地方设置为1位,而在其他地方(你想让天空显示的地方)则为0。
然后,要绘制一个帧,你需要绘制天空,启用模板缓冲区,并绘制前景。对于初始帧(在任何爆炸摧毁前景的部分之前),模板缓冲区实际上不会起作用。
然而,当你有了爆炸时,你需要将其绘制到模板缓冲区中(清除该圆形的模板缓冲区)。然后像以前一样重新绘制数据:绘制天空,启用模板缓冲区,并绘制前景。
这样可以让你获得想要的效果(前景消失在所需位置),而无需修改前景纹理。如果你不想使用模板缓冲区,我认为明显的替代方法是启用混合,并且只操作前景纹理的alpha通道--在受爆炸影响的地方将alpha设置为0(透明)。在我看来,模板缓冲区是一种更简洁的方法,但操作alpha通道也很简单。
我认为,这只是一个快速的想法,一个好的方法可能是绘制大量的线条。
我在考虑将景观表示为一堆线段,对于屏幕的每一列,您都有0.. n个垂直线条,组成地面:
12 789
0123 6789
0123456789
0123456789