如何在LibGDX中绘制无三角缺口的矩形多边形?
问题描述
我正在制作一款简单的2D游戏,需要创建代表玩家Sprite包围盒的矩形多边形,以下是我的实现代码:
float[] vertices = new float[] {player.getSprite().getX(), player.getSprite().getY(), player.getSprite().getX() + player.getSprite().getWidth(), player.getSprite().getY(), player.getSprite().getX(), player.getSprite().getY() + player.getSprite().getHeight(), player.getSprite().getX() + player.getSprite().getWidth(), player.getSprite().getY() + player.getSprite().getHeight()}; Polygon rPoly = new Polygon(vertices); polyBatch.draw( new PolygonRegion(new TextureRegion(healthImage), rPoly.getTransformedVertices(), new EarClippingTriangulator().computeTriangles(vertices).toArray()), player.getSprite().getScaleX(), player.getSprite().getScaleY());
其中的Sprite为LibGDX中的实际Sprite对象,使用该实现后绘制出的多边形带有三角缺口(如图所示:
),请问如何绘制出无三角缺口的矩形多边形?
解决方法
出现三角缺口的核心问题是顶点顺序错误和PolygonRegion参数不匹配,直接按以下步骤修正即可:
1. 修正顶点环绕顺序
EarClippingTriangulator要求顶点按顺时针或逆时针连续环绕,你当前的顶点顺序是左下→右下→左上→右上,属于交叉排列,会导致三角化失败。正确的矩形顶点顺序应该是连续环绕的,比如顺时针:左下→右下→右上→左上。
2. 统一顶点数据源
创建PolygonRegion时,顶点数组和三角化使用的顶点必须是同一组,你之前混用了原始顶点和变换后的顶点,会导致索引错位。
3. 可选:手动指定三角索引(更高效)
矩形是规则凸四边形,不需要用三角化工具计算,直接手动定义两个三角形的索引即可,避免不必要的计算。
修正后的代码示例(基础版)
Sprite sprite = player.getSprite(); float x = sprite.getX(); float y = sprite.getY(); float width = sprite.getWidth(); float height = sprite.getHeight(); // 顺时针顺序定义矩形顶点:左下→右下→右上→左上 float[] vertices = new float[] { x, y, // 左下顶点 x + width, y, // 右下顶点 x + width, y + height,// 右上顶点 x, y + height // 左上顶点 }; // 手动拆分矩形为两个三角形,索引对应顶点数组的位置 short[] triangles = new short[] {0, 1, 2, 1, 3, 2}; // 创建PolygonRegion并绘制 PolygonRegion polygonRegion = new PolygonRegion(new TextureRegion(healthImage), vertices, triangles); polyBatch.draw(polygonRegion, sprite.getX(), sprite.getY(), sprite.getOriginX(), sprite.getOriginY(), sprite.getWidth(), sprite.getHeight(), sprite.getScaleX(), sprite.getScaleY(), sprite.getRotation());
若需保留Polygon变换功能(进阶版)
如果后续需要对多边形做旋转、缩放等变换,可将顶点设置为相对于Sprite原点的坐标,再同步Sprite的变换参数:
Sprite sprite = player.getSprite(); float width = sprite.getWidth(); float height = sprite.getHeight(); // 相对于Sprite原点的顶点坐标 float[] localVertices = new float[] { 0, 0, // 左下 width, 0, // 右下 width, height, // 右上 0, height // 左上 }; Polygon rPoly = new Polygon(localVertices); // 同步Sprite的所有变换参数 rPoly.setPosition(sprite.getX(), sprite.getY()); rPoly.setScale(sprite.getScaleX(), sprite.getScaleY()); rPoly.setRotation(sprite.getRotation()); rPoly.setOrigin(sprite.getOriginX(), sprite.getOriginY()); // 使用Polygon变换后的顶点进行三角化和Region创建 short[] triangles = new EarClippingTriangulator().computeTriangles(rPoly.getVertices()).toArray(); PolygonRegion polygonRegion = new PolygonRegion(new TextureRegion(healthImage), rPoly.getTransformedVertices(), triangles); // 直接绘制,变换已经在Polygon中处理完成 polyBatch.draw(polygonRegion, 0, 0);
内容的提问来源于stack exchange,提问作者tarcin
相关产品推荐
相关产品推荐

