我正試圖爲我的遊戲實現鼠標選擇。當我QueryAABB
它看起來像處理比他們真正大的物體。World.QueryAABB在libgdx中給出不正確的結果
這裏的這是怎麼回事圖像
- 中的藍色方塊是一個包含我想身體中的演員選擇
- 藍色框中的輪廓由繪製
Box2DDebugRenderer
- 鼠標選擇屏幕上的區域(白色框),這是完全圖形的
- AABB轉換爲米和pas sed將
QueryAABB
- 回調被稱爲對藍盒子,並把它紅
- 綠色大綱留下的是一個單獨的身體檢查,如果我的轉換是正確的,這是用於實際選擇過程 不
它似乎與我的電錶尺寸相關,電阻越大,結果越不準確。在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
代表使用按下鼠標左鍵的初始點,並且getX
和getY
是Actor
方法給出當前位置。接下來的一點排序他們,因爲他們可能出現故障。然後將它們轉換爲米,因爲它們都是以像素爲單位的。
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
libgdx是開源的,你也可以自己添加這些函數...... – noone
@noone不是一個壞主意。 – SpaceFace