我正在尝试为我的游戏实现鼠标选择。当我QueryAABB
时,看起来它正在处理的物体比它们实际上要大得多。
以下是图片中的内容
Box2DDebugRenderer
QueryAABB
它似乎连接到我的仪表尺寸,它越大,结果就越不准确。在1米= 1像素时,它可以完美地工作。
Meter conversions
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))
此代码位于act
类的CursorActor
方法内。并且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
是在mutable.HashSet[Selectable]
内定义的CursorActor
。
其他值得注意的事情
Box2DDebugRenderer
使用相机的组合矩阵乘以MetersToPixels
答案 0 :(得分:1)
从我能够收集到的内容来看,QueryAABB
对于优化来说自然是不准确的。但是,我遇到了libgdx的障碍,因为它没有任何公开可见的功能,例如b2testOverlap
,根据我的理解,没有计划在任何时候很快就有一个。
我认为我最好的解决方案可能是使用jbox2d并假装libgdx的物理实现不存在。
或者没有人建议我可以自己将它添加到libgdx。
<强>更新强>
我决定采用一种简单的解决方案,即从夹具的形状中收集顶点,并使用com.badlogic.gdx.math.Intersector
对齐选择的顶点。它的确有效。如果我决定切换到使用传感器作为选择框,我可能会一直停止使用QueryAABB
。