0

我正在为我的 CS2 入门课程编写塔防游戏。我有这段代码可以在地图上找到敌方单位的下一个坐标:

  def findNextCoordinate(): (Double, Double) = {
    val numAccessibleCoordinates = 8
    val angle = 360 / numAccessibleCoordinates
    val pixelsPerFrame = speed / MainGame.fps //hypotenuse
    val currentCoor = coordinates

    def getAccessibleCoordinates(c: (Double, Double)): Array[(Double, Double)] = {
      val points = Array.fill(numAccessibleCoordinates)((0.0, 0.0))

      for (i <- 0 until numAccessibleCoordinates) {
        val currAngle = angle * i
        val x = math.cos(currAngle) * pixelsPerFrame
        val y = math.sin(currAngle) * pixelsPerFrame
        points(i) = ((currentCoor._1 + x), (currentCoor._2 + y))
      }
      points
    }

    val accessiblePoints = getAccessibleCoordinates(coordinates)
    var nextCoor = accessiblePoints(0)
    var distFromFinish = Coordinate.distanceBetween(coordinates, MainGame.finishCoordinates)

    for (pt <- accessiblePoints) {
      val ptDistFromFinish = Coordinate.distanceBetween(pt, MainGame.finishCoordinates)
      var containsTower = Tower.containsTower(pt)
      println(containsTower)
      if (ptDistFromFinish <= distFromFinish && !containsTower) {
        nextCoor = pt
        distFromFinish = ptDistFromFinish
      }
    }
    nextCoor
  }

“坐标”是存储给定蠕变坐标的变量(此代码片段是 Creep 类中的方法)。

我遇到的问题是碰撞检测。小兵穿过我的塔楼。(这里是 Tower.containsTower 方法:)

def containsTower(coor:(Double,Double)):Boolean = {
  var flag = false
  for (t <- MainGame.towers) {
    if (t.tower.contains(coor._1,coor._2)) flag = true
  }
  flag
}

其中 t.tower 是一个 java Rectangle2D 对象。当蠕变穿过它时,此方法返回 true,但我没有得到有效“阻挡”任何包含塔 (Rectangle2D) 对象的坐标的预期效果。

谁能解释我为什么会出现这种行为?

4

1 回答 1

2

x当没有比留在原地更好的选择时,您的默认情况是继续。您将使用默认设置直接进入塔楼。您应该将默认值更改为其他内容,或使用类似

getAccessibleCoordinates.filterNot( containsTower ).minBy{ pt =>
  Coordinate.distanceBetween(pt, MainGame.finishCoordinates)
}

假设总会有至少一个可访问的坐标。

顺便说一句,路径通常不是一个简单的问题,上面的解决方案往往会给你留下振荡的解决方案,其中一个被阻挡的小兵将在两个最近的点之间来回运行。但这可能比直接跑进塔楼要好,因为任何其他动作都会让你比现在更远。

于 2013-05-09T22:38:09.643 回答