我正在为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)对象的坐标的效果。
有人能说清楚为什么我会这样做吗?
答案 0 :(得分:2)
默认情况下,如果没有比住在原地更好的选择,那么就去x
。你将默认进入塔楼。您应该将默认值更改为其他内容,或使用类似
getAccessibleCoordinates.filterNot( containsTower ).minBy{ pt =>
Coordinate.distanceBetween(pt, MainGame.finishCoordinates)
}
假设始终存在至少一个可访问的坐标。
顺便说一下,路径通常不是一个简单的问题,上面的解决方案往往会给你提供振荡解决方案,其中阻塞的蠕变将在两个最近的点之间来回运行。但是,这可能比进入塔楼更好,因为任何其他行动都会比你目前的距离更远。