2014-02-17 18 views
0

我正試圖爲我的遊戲實現鼠標選擇。當我QueryAABB它看起來像處理比他們真正大的物體。World.QueryAABB在libgdx中給出不正確的結果

QueryAABB inaccuracy

這裏的這是怎麼回事圖像

  1. 中的藍色方塊是一個包含我想身體中的演員選擇
  2. 藍色框中的輪廓由繪製Box2DDebugRenderer
  3. 鼠標選擇屏幕上的區域(白色框),這是完全圖形的
  4. AABB轉換爲米和pas sed將QueryAABB
  5. 回調被稱爲對藍盒子,並把它紅
  6. 綠色大綱留下的是一個單獨的身體檢查,如果我的轉換是正確的,這是用於實際選擇過程

它似乎與我的電錶尺寸相關,電阻越大,結果越不準確。在1米= 1像素,它完美的作品。


儀表轉換

val MetersToPixels = 160f 
val PixelsToMeters = 1/MetersToPixels 

def toMeters(n: Float) = n * PixelsToMeters 
def toPixels(n: Float) = n * MetersToPixels 

在圖像我使用MetersToPixels = 160f所以誤差是較明顯的,但我真的想MetersToPixels = 16f


相關的選擇代碼

val x1 = selectPos.x 
val y1 = selectPos.y 
val x2 = getX 
val y2 = getY + getHeight 

val (l,r) = 
    if (x2 < x1) 
    (x2,x1) 
    else 
    (x1,x2) 
val (b,t) = 
    if (y2 < y1) 
    (y2,y1) 
    else 
    (y1,y2) 

world.QueryAABB(selectCallback, toMeters(l),toMeters(b), toMeters(r),toMeters(t)) 

此代碼是我CursorActor類的act方法中。並且selectPos代表使用按下鼠標左鍵的初始點,並且getXgetYActor方法給出當前位置。接下來的一點排序他們,因爲他們可能出現故障。然後將它們轉換爲米,因爲它們都是以像素爲單位的。


selectCallback: QueryCallback

override def reportFixture(fixture: Fixture): Boolean = { 
    fixture.getBody.getUserData match { 
    case selectable: Selectable => 
     selected += selectable 
     true 
    case _ => true 
    } 
} 

Selectable是該查詢,這有助於確定藍色框的顏色後,在內部設置一個布爾標誌的性狀。並且selected是在CursorActor內定義的mutable.HashSet[Selectable]


其他的事情可能是值得一提的

  • 我是新來的libgdx和Box2D的。
  • 攝像機縮放X2
  • Box2DDebugRenderer使用相機的組合矩陣乘以MetersToPixels

回答

1

從我能收集,QueryAABB是優化自然不準確的。不過,我用libgdx碰到了一個障礙,因爲它沒有任何公開可見的函數,如b2testOverlap,並且據我所知,沒有計劃很快就有一個。

我認爲我的最佳解決方案可能是使用jbox2d並假裝libgdx的物理實現不存在。

或者沒有人建議我可以將它添加到libgdx自己。

UPDATE

我決定去與燈具的造型匯聚了頂點,並使用com.badlogic.gdx.math.Intersector針對選擇的頂點的一個簡單的解決方案。我猜想它是有效的。如果我決定切換到使用選擇框的傳感器,我可能會一起停止使用QueryAABB

+0

libgdx是開源的,你也可以自己添加這些函數...... – noone

+0

@noone不是一個壞主意。 – SpaceFace