3

专业人士如何在 2D 游戏中划清界限?我的做法是说我不希望精灵移动到某个区域:

//Example
if ((playerPosX >= 825) && (playerPosX  <= 910)&& (playerPosY >= 170) && (playerPosY <= 255)) {
    //do nothing
}else{
    //move
}

但是有些游戏有很多界限,所以我想知道,有没有更简单的方法。我不认为有人会在整个游戏中使用上述方法,只是为了阻止移动。

编辑: 我的问题主要是关于一个你可以四处走动的游戏,类似于口袋妖怪或最终幻想

4

2 回答 2

7

这取决于游戏。

  • 在基于网格的游戏中,您通常会在精灵移动时查找网格以检查它是否已移动到“阻塞”区域。如果是这样,检测碰撞和/或执行精灵的一些校正运动。这既简单又高效,唯一的问题是它限制了您围绕网格结构设计关卡/场景。
  • 在具有非常动态环境(例如大量移动的小行星)的游戏中,您通常会有一个基于空间分区(例如四叉树)的碰撞检测系统,用于检测任意对象之间的碰撞。每个对象通常都有一个边界框
  • 在具有由向量定义的复杂但固定几何图形的游戏中,您可以预先计算 BSP 树并将其用于快速检测与场景的碰撞。这种技术在 3D FPS 游戏中很常见,但它也适用于 2D。

许多游戏实际上会使用上述的组合:例如,用于固定场景的 BSP 树和用于由物理子系统管理的动态对象的四叉树。

于 2012-12-29T08:45:27.203 回答
0

我想到了两种可能,

  • 第一次用多边形描述被阻挡的区域,并在多边形测试中做一个点,以确定精灵是否可以移动到这个位置。

  • 第二个像在图像处理程序中创建某种掩码(层),其中零位表示您可以移动的位置,而位表示被阻挡的区域。这可以扩展到指定的深度,另请参阅z-buffer以部分隐藏精灵,

编辑:

if ( mask[ nextY ][ nextX ] == 0 ) {
   currX = nextX;
   currY = nextY;
}

假设所有变量都是 int 并且 mask 是 2d int 数组。

于 2012-12-29T08:41:11.933 回答