【问题标题】:Java LibGDX drawing multiple shapes each with unique renderersJava LibGDX 绘制多个形状,每个形状都有独特的渲染器
【发布时间】:2016-02-23 16:01:07
【问题描述】:

我正在使用 JAVA 使用 LibGDX 创建一个游戏,但我遇到了一个即使经过一周的尝试也无法解决的问题。我有使用 ShapeRenderer 类绘制的形状,并且我有多个相互交互的类和方法。一个形状在屏幕上增长,当用户点击屏幕时,该形状停止增长,第二个形状开始增长。

我有一组 ShapeRenderer 和 Polygon,我必须使用不同的 ShapeRenderer 和不同的 Polygon 绘制每个形状。例如,必须使用 ShapeRenderer[1] 和 Polygon[1] 渲染三角形。该级别的下一个三角形必须使用 ShapeRenderer[2] 和 Polygon[2] 绘制。这是为了避免在同一个 ShapeRenderer 上绘制多边形时发生冲突的值和旋转。

我的特殊问题是我创建的一个方法,“DrawStar”被赋予一个数字(以 1 开头代表第一颗星)并使用 ShapeRenderer[1] 和 Polygon[1] 绘制该星。这意味着正在绘制第一颗星,然后当我单击屏幕时,理想情况下,第一颗星应该停止生长,第二颗星应该开始使用 ShapeRenderer[2] 和 Polygon[2] 渲染。

问题是:假设这个特定关卡的编写是为了增加 2 颗星。方法“DrawStar”将被赋予数字“1”并随着它的增长绘制第一颗星,然后方法“DrawStar”被赋予数字“2”并绘制第二颗星(这在视觉上还不是问题因为星星的多边形从值 0 开始,直到第二次点击才增加,所以即使它正在被绘制它也不可见)并且它继续同时绘制两颗星星,它基本上在之后绘制该级别的所有星星另一个即 DrawShape(1) 然后 DrawShape(2) 然后 DrawShape(1) 然后 DrawShape(2) 等等。

这是我的代码:

public void drawFiveStar(FiveStar star, int num) {
 shapeRenderer[num].begin(ShapeType.Line);
 shapeRenderer[num].setColor(Color.RED);
 poly[num].setVertices(star.verticiesStar);
 poly[num].rotate(1);
 poly[num].setOrigin(star.originX, star.originY);
 shapeRenderer[num].polygon(poly[num].getTransformedVertices());
 shapeRenderer[num].end();
}

Star 表示通过的星形对象,num 表示要绘制的形状编号,如上面使用 ShapeRenderer[1] 和 Polygon[1] 的示例中所述。问题是它会 DrawFiveStar(Star1, 1), DrawFiveStar(Star1, 2), DrawFiveStar(Star1, 1), DrawFiveStar(Star1, 2)....直到我点击鼠标按钮,它移动到下一个星对象DrawFiveStar(Star2, 1), DrawFiveStar(Star2, 2), DrawFiveStar(Star2, 1), DrawFiveStar(Star2, 2)....

上面代码的问题在于,使用 ShapeRenderer 数组的全部意义在于,对于第二个形状,使用新的、新鲜的 ShapeRenderer。这段代码使第一个星形对象将使用两个 ShapeRenderers,并且当我单击提示第二个星形对象增长时,两个 ShapeRenderer 都已用于绘制第一个星形对象。理想情况下,它应该只有第一个 ShapeRenderer 用于绘制第一个星形对象,然后在第二个对象开始增长时使用第二个 ShapeRenderer 绘制。我尝试了许多解决方案,但都没有产生我刚才描述的理想解决方案的预期结果。

这是一个我无法弄清楚的编程问题,因为代码需要是动态的,因此如果它是 3 或 100 个形状,代码仍然会为每个星形对象使用不同的 ShapeRenderer。同样,这是因为在一个 ShapeRenderer 对象上绘制多个形状并旋转它们会导致非常奇怪的结果,形状到处乱飞,在单独的 ShapeRenderer 对象上绘制多个旋转形状可以解决这个问题。这就是我要在这里实现的目标。

阅读关卡>看到有2个形状要绘制>使用2个形状渲染器来绘制这2个形状

【问题讨论】:

    标签: java libgdx polygon shape shape-rendering


    【解决方案1】:

    如果使用单个ShapeRenderer 会产生问题,也许您正在更改转换矩阵,例如使用平移和旋转?在这种情况下,您需要先保存原始矩阵,并在转换后恢复它。

    示例

    shapeRenderer.begin(ShapeType.Filled);
    for(Shape shape: shapes)
    {
     Matrix4 tf = shapeRenderer.getTransformMatrix().cpy();
     shapeRenderer.translate([...]);
     shapeRenderer.rotate([...];
     // ... create your shape ...
     shapeRenderer.setTransformMatrix(tf);
    }
    shapeRenderer.end();
    

    【讨论】:

    • 非常感谢我只用一个形状渲染器解决了这个问题,我遇到的错误是我用形状渲染器绘制的多边形与我用 spritebatch 绘制的精灵不匹配。问题是当我进入更高级别时,我需要重置精灵声明,否则它的最后位置被记住并且与多边形不匹配。谢谢!
    【解决方案2】:

    有点不清楚您的问题是什么,但我猜您正在将两个不同的想法混入传入的 num 变量中,因此它没有按照您的意愿行事。

    num 是您要使用的形状渲染器索引,还是您要绘制的形状实例?如果它们不同,则需要将两个不同的 int 值传递给您的方法,并适当地使用它们。

    也就是说,如果您认为您需要多个 ShapeRenderer,那么您一定是在错误地使用它。这是一个非常灵活的类,在所需位置绘制多种类型的形状应该没有问题。找出你做错了什么并修复它,所以你只需要一个。 ShapeRenderer 是一种重物。每个实例都有一个大的后备数组,在 GPU 上存储了一个网格,并加载了一个 ShaderProgram。您绝对不想加载 100 个相同的着色器来绘制 100 个形状。

    【讨论】:

    • 非常感谢,我会考虑让它与一个形状渲染器一起工作。很久以前我遇到过使用一个形状渲染器对象旋转 2 个形状的问题,它会产生有趣的结果,并且通过为每个对象使用不同的形状渲染器来解决这个问题。虽然我猜这是不可扩展的,因为它使用大量内存来创建它的 100 个实例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    相关资源
    最近更新 更多