---第三,希望最终编辑--- 首先让我说这是一个关于代码压缩的问题,几乎与堆栈无关。在下面的代码中,您将注意到每个块由openGl pushmarix()和popmatrix()
分隔。这就是问题所在!在这种方法中,只有太多的推/弹调用,我想压缩它,这样每次只调用一次push和pop。
glPushMatrix(); //<--------- push matrix
Vec2 torPos = ...;
glTranslatef(...);
glRotated(...);
glRectf(...);
glPopMatrix(); //<--------- pop matrix
glPushMatrix(); //<--------- push matrix
Vec2 armPos = i.arm.getPosition().mul(30);
glTranslatef(...);
glRotated(...);
glRectf(...);
glPopMatrix() //<--------- pop matrix
glPushMatrix(); //<--------- push matrix
GL11.glColor3f(...);
Vec2 anchor = new Vec2(0,0);
i.torsoArmJoint.getAnchorA(anchor);
glTranslatef(....);
glRectf(...);
glPopMatrix(); //<---------- pop matrix
最明智的做法(似乎)是通过实现for循环。这就是问题的来源......因为坦率地说,如果在前面的代码中有其他方法可以解决问题,那也无关紧要。
我想知道的是......在java中,你是否可以拥有一个循环,例如push / pop上下文,你必须有line1,然后是-whatever-然后是line2,其中顺序必须是line1 ,代码,第2行。
将之前的代码转换为以下代码似乎很明智:
glPushMatrix(); //<--------- push matrix
method1();
glPopMatrix(); //<--------- pop matrix
glPushMatrix(); //<--------- push matrix
method2();
glPopMatrix() //<--------- pop matrix
glPushMatrix(); //<--------- push matrix
method3();
glPopMatrix(); //<---------- pop matrix
甚至是这样:
object1.pushmatrix(); //<--------- push matrix
object1.method();
object1.popmatrix(); //<--------- push matrix
object2.pushmatrix(); //<--------- push matrix
object2.method();
object2.popmatrix(); //<--------- push matrix
object3.pushmatrix(); //<--------- push matrix
object3.method();
object3.popmatrix(); //<--------- push matrix
但正如你所看到的,这里有一个模式(因此注释),我必须不断地为每个过程调用这些push / pop方法。在python中,我可以简单地将所有方法调用附加到列表中,然后使用for循环遍历列表:
methodList = [method1, method2, method3]
for method in methodList:
glPushMatrix() //<--------- push matrix
method()
glPopMatrix() //<---------- pop matrix
现在,如果您不知道python只知道有一个调用列表,那么您将调用for循环中的调用作为&#39;方法&#39;。正如您所看到的,这将解决问题,因为现在只有一个推送和一个弹出。但是我不知道如何在java中这样做。
答案 0 :(得分:1)
我的方法是将所有方法分组到一个虚拟类中,并使用反射来访问它。以下是实施示例:
public class StackExample {
// Other declaration here ----------
public static void main(String[] args){
MethodCollection collection = new MethodCollection();
String[] methods = {"method1", "method2", "method3"};
// requires to catch exception just in case the method does not exist
try {
for (String a : methods) {
glPushMatrix(); // <----- Push matrix
MethodCollection.class.getMethod(a, null).invoke(collection,null);
glPopMatrix(); // <----- Pop matrix
}
}
catch (Exception e){
e.printStackTrace();
}
}
static class MethodCollection {
/**
* Empty constructor
*/
public MethodCollection(){}
public void method1(){
System.out.println("Method 1");
}
public void method2(){
System.out.println("Method 2");
}
public void method3(){
System.out.println("Method 3");
}
}
}