0

我正在使用 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 个形状

4

2 回答 2

0

如果使用单个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();
于 2016-01-04T19:06:27.407 回答
0

有点不清楚你的问题是什么,但我猜你正在将两个不同的想法混为一谈传入的num变量,所以它没有做你想做的事。

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

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

于 2015-11-21T06:43:10.850 回答