Java LibGDX绘制多个形状,每个形状具有唯一的渲染器

Java LibGDX绘制多个形状,每个形状具有唯一的渲染器,java,libgdx,polygon,shape,shape-rendering,Java,Libgdx,Polygon,Shape,Shape Rendering,我正在用JAVA用LibGDX创建一个游戏,我遇到了一个问题,即使经过一周的尝试也无法解决。我使用ShaperEnder类绘制形状,并且我有多个相互交互的类和方法。一个形状在屏幕上增长,当用户单击屏幕时,该形状停止增长,第二个形状开始增长 我有一个ShaperEnder和多边形的数组,我必须用不同的ShaperEnder和不同的多边形绘制每个形状。例如,必须使用ShaperEnder[1]和多边形[1]渲染三角形。该级别上的下一个三角形必须使用ShaperEnder[2]和多边形[2]绘制。这是

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

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

我的一个特殊问题是我创建的一个方法,“DrawStar”给定一个数字(以1开始表示第一颗星),并使用ShaperEnder[1]和Polygon[1]绘制该星。这意味着当我单击屏幕时,第一颗星正在绘制,理想情况下,第一颗星应该停止生长,第二颗星应该开始使用ShaperEnder[2]和Polygon[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();
}
星形表示通过的星形对象,num表示要绘制的形状编号,如上面的ShaperEnder[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)

上面代码的问题是,使用ShaperEnder数组的整个要点是,对于第二个形状,使用新的ShaperEnder。这段代码使第一个星形对象将同时使用两个ShaperEnder,当我单击以提示第二个星形对象增长时,两个ShaperEnder都已用于绘制第一个星形对象。理想情况下,只有第一个ShaperEnder用于绘制第一个星形对象,然后当第二个对象开始增长时,才使用第二个ShaperEnder绘制。我尝试了许多解决方案,但没有一个能产生我刚才描述的理想解决方案所期望的结果

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


阅读级别>查看有2个要绘制的形状>使用2个形状渲染器绘制这2个形状

不清楚您的问题是什么,但我猜您正在将两个不同的想法合并到传入的
num
变量中,因此它没有做您想要的事情

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


也就是说,如果您认为您需要多个ShaperEnder,那么您一定是错误地使用了它。它是一个非常灵活的类,在所需位置绘制多种类型的形状时应该没有问题。找出你做错了什么并修复它,这样你就只需要一个。变形器是一种很重的物体。每个实例都有一个大的背景阵列,在GPU上存储一个网格,并加载一个着色器程序。您肯定不想加载100个相同的着色器来绘制100个形状。

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

示例

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();

非常感谢,我将研究如何使用一个形状渲染器。很久以前,我就遇到过这样的问题:使用一个形状渲染器对象旋转两个形状,这样会产生有趣的结果,并且通过为每个对象使用不同的形状渲染器解决了这个问题。这是不可伸缩的,虽然我猜,因为它使用了大量内存来创建100个itThanks实例。我只使用了一个形状渲染器就解决了这个问题。我的错误是,我用形状渲染器绘制的多边形与我用spritebatch绘制的精灵不匹配。问题是当我移动到更高的级别时,我需要重置精灵声明,否则它的最后位置会被记住,并且与多边形不匹配。谢谢