【问题标题】:Boundaries in Java Gaming, How do "professionals" do it?Java 游戏中的界限,“专业人士”是如何做到的?
【发布时间】:2012-12-14 08:07:13
【问题描述】:

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

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

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

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

【问题讨论】:

  • 这更像是一个设计问题,真的。
  • @fge 所以这一切都是你设计的方式吗?那么设计一个 2D 程序以更容易实现边界的最佳方法是什么?
  • Christer EricsonReal-Time Collision Detection 很好地概述了 2d 和 3d 碰撞检测。

标签: java boundary 2d-games


【解决方案1】:

我想到了两种可能性,

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

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

编辑:

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

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

【讨论】:

  • 你在说什么,我想我在某个地方看到了这个口袋妖怪,但每个 25x25 的方格都有一个值,如果值为 0,精灵只能移动到该位置,但如果值为 1,它就不能,等等?我该怎么做?
  • 所以我必须创建整个棋盘/竞技场/地图的蒙版并在每次移动时检查?
  • @Exikle 如果您已经有一块板(25x25),它描述了每个板位置放置的图像(或纹理),您不需要蒙版。只需检查 board[y][x]
  • 我没有 25x35 的板,它只是我在图形面板上绘制图像,所以我正在考虑使用我们的蒙版想法,并且每 5 x,y 分配值,因为我的精灵移动乘以 5。因此,我可以为可移动分配 0,为不可移动分配 1。你认为这行得通吗?
  • @Exikle 如果您的位置正好在该块之前,请考虑一个 100x4 像素/单位的小块,并且您可以步行 5 步穿过该块。如果您按 5 步进行事件,则需要测试当前位置和下一个位置之间的所有位置是否“可移动”。然后就可以了。
【解决方案2】:

这取决于游戏。

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

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

【讨论】:

  • Pokemon 将归入哪个类别,因为我想制作一款动作与此类似的游戏。
  • 很确定 Pokemon 是基于网格的。很多2D游戏都是!
猜你喜欢
  • 2011-08-02
  • 1970-01-01
  • 2010-11-27
  • 2013-02-24
  • 2013-08-07
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 2015-12-31
相关资源
最近更新 更多