World.QueryAABB在libgdx中给出了错误的结果

时间:2014-02-17 20:56:22

标签: scala libgdx box2d

我正在尝试为我的游戏实现鼠标选择。当我QueryAABB时,看起来它正在处理的物体比它们实际上要大得多。

QueryAABB inaccuracy

以下是图片中的内容

  1. 蓝框是一个包含我想要选择的正文的演员
  2. 蓝色方框上的轮廓由Box2DDebugRenderer
  3. 绘制
  4. 鼠标选择屏幕上的区域(白框),这完全是图形
  5. AABB转换为米并传递给QueryAABB
  6. 为蓝色方框调用了回调并将其变为红色
  7. 留下的绿色轮廓是一个单独的主体,用于检查我的转换是否正确, 用于实际选择过程
  8. 它似乎连接到我的仪表尺寸,它越大,结果就越不准确。在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表示使用按下鼠标左键的初始点,getXgetYActor方法给出当前位置。下一位对它们进行排序,因为它们可能出现故障。然后它们被转换为米,因为它们都是以像素为单位。


    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


    其他值得注意的事情

    • 我是libgdx和box2d的新手。
    • 相机缩放x2
    • 我的Box2DDebugRenderer使用相机的组合矩阵乘以MetersToPixels

1 个答案:

答案 0 :(得分:1)

从我能够收集到的内容来看,QueryAABB对于优化来说自然是不准确的。但是,我遇到了libgdx的障碍,因为它没有任何公开可见的功能,例如b2testOverlap,根据我的理解,没有计划在任何时候很快就有一个。

我认为我最好的解决方案可能是使用jbox2d并假装libgdx的物理实现不存在。

或者没有人建议我可以自己将它添加到libgdx。

<强>更新

我决定采用一种简单的解决方案,即从夹具的形状中收集顶点,并使用com.badlogic.gdx.math.Intersector对齐选择的顶点。它的确有效。如果我决定切换到使用传感器作为选择框,我可能会一直停止使用QueryAABB