OpenGL 2D游戏问题

时间:2010-09-14 14:33:42

标签: opengl 2d

我想使用OpenGL在2D中制作类似蠕虫的可破坏地形的游戏。

  • 最好的办法是什么?
    • 每像素绘制像素? (呃,不好?)
    • 让世界成为一个纹理并操纵它(可能吗?)

提前致谢

7 个答案:

答案 0 :(得分:15)

考虑到蠕虫地形的样子,我想出了这个想法。但我不确定如何在OpenGL中实现它。它更像是一种分层的2D绘图方法。无论如何,我正在发布这个想法。我已经使用Paint.NET模拟了这种方法。

首先,你有一个背景天空图层。

alt text

你有一个地形图层。

alt text

地形图层被遮盖,因此顶部未绘制。在天空图层顶部绘制地形图层以形成场景。

alt text

现在主要想法。每当发生爆炸或其他地形变形事件时,您在地形图层上绘制圆形或其他形状,使用地形图层本身作为绘图蒙版(因此仅绘制与现有地形重叠的圆的部分),消灭部分地形。使用透明/蒙版颜色画笔进行填充,使用类似于粗笔的地形的颜色。

alt text

您可以重复此过程以添加更多变形。您可以将此图层保留在内存中并在发生变形时添加变形,或者如果没有太多变形要渲染,您甚至可以在每个帧中将它们渲染到内存中。

alt text

答案 1 :(得分:2)

我猜你最好使用带有正确贴图的纹理填充多边形(一个不会拉伸纹理以使用所有纹素,但将裁剪区域移出的线性贴图),然后在它们获得时重新塑造它们破坏。

答案 2 :(得分:0)

我想,但这只是一个简单的想法,一个好方法可能是绘制一个非常大的行数。

我认为你将景观表示为一堆线段,对于屏幕的每一列,你有0 .. n 垂直线,构成地面:

 12    789
0123  6789
0123456789
0123456789

在上面的精彩内容中,“0”:s的列组成一行,依此类推。我没有尝试说明单个像素列有多行的情况,因为这种粗糙格式有点难。

我不确定这会是效率,但它至少有一定意义,因为行是一个OpenGL原语。

您可以通过启用纹理贴图并为每个线段指定所需的纹理坐标来对线条进行着色和纹理处理。

答案 3 :(得分:0)

我假设你的问题是实现角色/武器/地形之间的碰撞。 只要您不在opengl es上执行此操作,您就可以使用模板缓冲区来执行每像素碰撞检测并使您的地形成为单个可修改纹理。

此页面将提供一个想法: http://kometbomb.net/2007/07/11/hardware-accelerated-2d-collision-detection-in-opengl/

答案 4 :(得分:0)

我想象的方式是:

  • 应用了纹理的平面
  • 用于地面碰撞的路径(点/段的矢量)。

当某些东西爆炸时,你会对纹理(显示背景)和“可走路”路径进行布尔操作(矩形圆)。

我想说的是你做一个几何布尔操作并使用结果来更新纹理(使用alpha蒙版或其他东西)并更新你用来跟踪可步行区域的数据结构(这可能是)。

将事情分开,而不仅仅依赖于gl draw方法

答案 5 :(得分:0)

我想我首先将前景绘制到模板缓冲区中,以便模板缓冲区在前景的任何地方设置为1位,在其他位置设置为0(您希望天空显示在其中)。

然后绘制一个框架,绘制天空,启用模板缓冲区,并绘制前景。对于初始帧(在任何爆炸破坏前景的一部分之前),模板缓冲区实际上不会做任何事情。

但是,如果发生爆炸,则将其绘制到模板缓冲区(清除该圆圈的模板缓冲区)。然后像以前一样重新绘制数据:绘制天空,启用模板缓冲区,并绘制前景。

这使您可以获得所需的效果(前景在需要时消失),而无需根据需要修改前景纹理。如果你不想使用模板缓冲区,对我来说很明显的替代方案是启用混合,只需操纵前景纹理的alpha通道 - 将alpha设置为0(透明),它受到爆炸的影响。 IMO,模板缓冲区是一种更清洁的方法,但操纵alpha通道也很简单。

答案 6 :(得分:-1)

通常,我看到它完成的方法是让每个实体都是纹理四边形,然后更新动画纹理。对于可破坏的地形,最好将火车分成瓦片然后你只需要更新已经改变的那些。不要使用GLdrawpixels它可能是最慢的方法(除了每帧重新加载纹理之外,尽管它会很接近。)