【问题标题】:Libgdx intersection of polygonsLibgdx 多边形的交集
【发布时间】:2014-01-21 04:56:48
【问题描述】:

我正在通过向 Mario Zechner 的开源跳线游戏添加更多功能来学习 libgdx。我正在尝试制作一些有角度的平台并遇到旋转矩形的碰撞检测问题。
我遵循this 解决方案并使用多边形和我的矩形边界。
出于测试目的,我还没有设置角度。我只是想验证 bob 是否正确跳出平台。但由于某种原因,这不起作用。边界要么太靠左,要么在平台上方,要么根本不存在。我没有正确设置多边形吗? 使用 Box2d 会更容易吗?我没有这方面的任何经验,我想知道这对于简单的平台是否有点过头了。

public PlatformClient(int platformType, float x, float y) {
    this.platformType = platformType;
    float x1 = x - Platform.PLATFORM_WIDTH/2;
    float y1 = y + Platform.PLATFORM_HEIGHT/2;

    this.polyBounds = new Polygon(new float[]{x1, y1, x1+Platform.PLATFORM_WIDTH, y1, x1+Platform.PLATFORM_WIDTH, y1-Platform.PLATFORM_HEIGHT, x1, y1-Platform.PLATFORM_HEIGHT}); 
    polyBounds.setPosition(x-Platform.PLATFORM_WIDTH/2, y-Platform.PLATFORM_HEIGHT/2);
}

class Platform {
   public static final float PLATFORM_WIDTH = 2f;
   public static final float PLATFORM_HEIGHT = 0.35f;

}

在 Bob 类中,当他移动时更新多边形边界:

public void update(float deltaTime) {   
    ...
    position.add(velocity.x * deltaTime, velocity.y * deltaTime);
    bounds.x = position.x - BOB_WIDTH / 2;
    bounds.y = position.y - BOB_HEIGHT / 2;
    float newX = position.x - BOB_WIDTH / 2;
    float newY = position.y - BOB_HEIGHT / 2;
    polyBounds.setVertices(new float[]{ 
            newX, newY, 
            newX+BOB_WIDTH, newY, 
            newX+BOB_WIDTH, newY-BOB_HEIGHT,
            newX, newY-BOB_HEIGHT});
}

世界级:

 private void checkPlatformCollisions () {
   int len = platforms.size();
   for (int i = 0; i < len; i++) 
   {
      PlatformClient platform = platforms.get(i);
      if (bob.position.y >= platform.position.y) 
      {
         if(Intersector.overlapConvexPolygons(bob.polyBounds, platform.polyBounds))
         {
               System.out.println("it overlaps");
               // jump off platform
         }
      }
   }
 }

编辑

感谢形状渲染器,我能够正确设置多边形。我修复了上面代码中的一些 +,- 问题。但以下代码:Intersector.overlapConvexPolygons() 仍然不起作用(见图)。他在多边形接触之前跳了起来,或者他根本不跳。 还有什么想法吗?

这就是我绘制 Bob 的多边形和明显重叠的平台的方式。

 public void render() {
    shapeRenderer.setProjectionMatrix(cam.combined);
    shapeRenderer.begin(ShapeType.Line);
    for(int i=0; i<world.platforms.size(); i++) {

        shapeRenderer.setColor(1, 0, 0, 1);

        shapeRenderer.polygon(world.platforms.get(i).polyBounds.getVertices());
        shapeRenderer.polygon(world.bob.polyBounds.getVertices());
    }
    shapeRenderer.end();
   }

【问题讨论】:

  • 您是否尝试过使用 ShapeRenderer 打印形状以进行调试?
  • 我使用的是 SpriteBatch 而不是 ShapeRenderer。根据this,我不应该将这两者混为一谈。
  • 我知道你不应该混合它们。但出于调试目的,最好使用 ShapeRenderer 来绘制您的确切形状。您使用 spritebatch 绘制的图像可能比您的形状更大或更小,甚至在另一个位置上。所以只需调用 spritebatch.end() 然后 shaperenderer.begin(Shapetype.LINE) 然后再次绘制多边形调用 shaperenderer.end() 和 spritebatch.start() 。我尝试进行一次多边形碰撞检测,但由于某种原因,我的多边形不是凸面的,它不起作用。所以你最好试试!
  • 谢谢,我能够正确设置多边形。但它仍然无法正常工作(请参阅我在原始帖子中的编辑)
  • 因为如果您使用 spritebatch 渲染,您需要手动设置位置旋转等。形状总是取决于图像。它发生在我身上,我以错误的顺序设置了多边形的点,形状是这样的: __ \/ /\ 所以碰撞检测无法工作。请回答您的问题并将其标记为已解决。谢谢

标签: java libgdx


【解决方案1】:

好的,我通过删除解决了它

polyBounds.setPosition(x-Platform.PLATFORM_WIDTH/2, y-Platform.PLATFORM_HEIGHT/2);

来自构造函数。现在碰撞工作正常。

【讨论】:

    猜你喜欢
    • 2012-06-28
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多