【问题标题】:Implementing Terrain destruction like Scorched Earth Game on iphone or Java在 iPhone 或 Java 上实现地形破坏,如 Scorched Earth Game
【发布时间】:2019-03-16 10:00:37
【问题描述】:

我正在寻找一个如何实现 2D 地形破坏的示例,您在焦土之类的游戏或 iPhone 上看到了这种情况iShoot。

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


(来源:vintagecomputing.com)

【问题讨论】:

  • 如果只是 2D 的,那只是图像处理,只是擦除用作地形的位图的一部分。
  • @LasseV.Karlsen 你能提供一些关于 3d 地形破坏的链接吗?谢谢。

标签: java iphone opengl


【解决方案1】:

我记得,在 Worms 中他们使用了两个图像;带有颜色的“漂亮”地形,以及纯黑白的蒙版地形。命中检测始终在掩码上进行。

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

一个简单的例子可以用一个数组来完成,其中 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)和非地形(0)位,那么他可以只使用排序来“进行折叠”(在这种情况下,是一个恒定的时间算法)。
【解决方案2】:

苏维特的回答很棒!我在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 参数允许地形相对于屏幕重新定位,允许玩家在环境中交互移动,同时将游戏环境保持为环绕连续体。

【讨论】:

    猜你喜欢
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    相关资源
    最近更新 更多