You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 05:05:18