在iphone或Java上实现像Scorched Earth Game这样的地形破坏

时间:2009-05-09 17:34:15

标签: java iphone opengl

我正在寻找一个如何实现2D地形破坏的示例,您可以在烧焦的地球或iphone iShoot等游戏中看到。

我正在寻求实现一个需要做可破坏地形的游戏,并使用OpenGL(Java中的LWJGL)和在iPhone上使用OpenGL ES来渲染它。

alt text
(来源:vintagecomputing.com

2 个答案:

答案 0 :(得分:7)

我记得,在沃尔姆斯,他们使用了两张图片;带有颜色的“漂亮”地形,以及纯黑色和白色的面具地形。命中检测总是在面罩上完成。

如果你真的希望地形像坦克大战一样崩溃,你需要迭代你的图像的每一列,并让它搜索地形和比赛场地底部之间的间隙。如果检测到任何间隙,请将间隙上方的地形向下移动到列中可能的最低点。

一个简单的例子可以用一个数组来完成,其中1代表实心地形,0代表空白。在这种情况下,我将数组的左侧设置为地平面,元素[0]将在地面上:

[1,1,1,1,1,1,0,0,0,0]

让我们假设地形从侧面被击中并形成一个洞:

[1,1,0,0,1,1,0,0,0,0]

现在你在另一片地形上面留下了一块漂浮的地形。要使浮动地形折叠,请遍历数组,跟踪找到0的第一个位置(空白区域)。然后,当您继续迭代时,在发现1(地形)时,只需将1移动到0所在的位置。通过迭代旧的0位置+ 1来重复该过程。

[1,1,1,0,0,1,0,0,0,0]

[1,1,1,1,0,0,0,0,0,0]

这是基本方法,而不是最有效的方法。例如,同时将所有地形索引移动到间隙上方会快得多。

修改

正如第一条评论所述,列表上的排序更容易。我保持原始的响应完整,因为它有助于解释崩溃地形背后的实际原理。

答案 1 :(得分:2)

Soviut的答案很棒!我在Scorched Earth for iPhone中的破坏性地形特征中使用了类似的算法。我决定坚持原版并立即让地形稳定下来,但是当我考虑动画地形稳定时,我遇到了一些性能问题。你也可以在iShoot中看到这方面的证据,因为iShoot使用缓慢定位的动画地形。有些情况下,当下一个玩家发射武器时,地面仍在从一个玩家的转弯处解决。这可能会干扰击球,并且干扰可能会根据下一位牌手的射击速度而改变。由于Scorched Earth是一个回合制游戏,让游戏等到地面稳定直到切换到下一个玩家似乎是一个好主意。

为了渲染地形,我使用OpenGL在每个水平屏幕位置绘制一对顶点的多边形,如下所示:

1 3 5 7 9
0 2 4 6 8

带偶数的点表示屏幕底部的像素线。具有奇数的点表示地形的垂直像素位置。此信息被复制到一个点数组中,该数组使用glVertexPointer,glColorPointer和glDrawArrays作为三角形条进行渲染,如下所示:

// prepare vertex buffer
for (int i=0,j,k=0,K=480;k<=K;k++) {
    j = (k-(int)offsetX+480)%480;
    vGroundLevel[i++] = k;
    vGroundLevel[i++] = offsetY>0 ? 0 : offsetY;
    vGroundLevel[i++] = k;
    vGroundLevel[i++] = [env groundLevelAtIndex:j]+offsetY;
}
....
// render vertex buffer
glVertexPointer(2, GL_FLOAT, 0, vGroundLevel);
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, cGround);
glEnableClientState(GL_COLOR_ARRAY);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 2*480);

offsetX和offsetY参数允许相对于屏幕重新定位地形,允许玩家以交互方式在环境中移动,同时将游戏环境保持为环绕连续体。