Rectangle2D.contains()没有正确检测边界中的坐标

时间:2013-05-09 19:51:41

标签: java scala collision-detection

我正在为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
  }

“coordinates”是存储给定creep坐标的变量(此代码段是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对象。当creep遍历它时,此方法返回true,但是我没有获得有效“阻塞”任何包含塔(Rectangle2D)对象的坐标的效果。

有人能说清楚为什么我会这样做吗?

1 个答案:

答案 0 :(得分:2)

默认情况下,如果没有比住在原地更好的选择,那么就去x。你将默认进入塔楼。您应该将默认值更改为其他内容,或使用类似

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

假设始终存在至少一个可访问的坐标。

顺便说一下,路径通常不是一个简单的问题,上面的解决方案往往会给你提供振荡解决方案,其中阻塞的蠕变将在两个最近的点之间来回运行。但是,这可能比进入塔楼更好,因为任何其他行动都会比你目前的距离更远。