2013-05-09 65 views
0

我寫一個塔防遊戲我的簡介CS2類座標。我有這樣一段代碼查找映射爲一個敵人單元上的下一個座標:Rectangle2D.contains()不能正確檢測邊界

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 
    } 

「座標」是存儲用於給定的蠕變(此代碼段是在蠕變的方法的座標變量類)。

我遇到的問題是碰撞檢測。爬行穿過我的塔樓。 (這裏是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)對象的任何座標的效果。

任何人都可以提供一些線索,爲什麼我得到這個行爲?

回答

2

你默認情況下是沿着x去時,有比呆在你是在沒有更好的選擇。你會默認運行到一座塔樓。您應該將默認值更改爲其他值,或者使用類似

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

假設總會有至少一個可訪問的座標。

順便說一句,尋路不是一般的簡單的問題,以上的解決方案往往會離開你與振盪解其中阻塞蠕變會來回跑兩個最近點之間。但是,這可能比只是在進入塔樓時更好,因爲任何其他舉措都會讓你遠離目前的距離。