Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从类的所有实例调用方法?_Java_Android_Opengl Es - Fatal编程技术网

Java 如何从类的所有实例调用方法?

Java 如何从类的所有实例调用方法?,java,android,opengl-es,Java,Android,Opengl Es,我正在编写一个基本的游戏引擎,有一个抽象类,它表示可以在3D世界中绘制的任何对象,但是在这个类中有一个抽象方法Render(),我希望引擎在每个绘制阶段自动调用它。如何实现这一点,使从抽象类扩展而来的每个类都自动调用Render() 我使用的是java、android sdk 2.2和opengl es。您可以将可以渲染的每个对象注册到一个类中,该类将对所有对象调用render() 例如: public class Registry{ private static Collection&

我正在编写一个基本的游戏引擎,有一个抽象类,它表示可以在3D世界中绘制的任何对象,但是在这个类中有一个抽象方法Render(),我希望引擎在每个绘制阶段自动调用它。如何实现这一点,使从抽象类扩展而来的每个类都自动调用Render()


我使用的是java、android sdk 2.2和opengl es。

您可以将可以渲染的每个对象注册到一个类中,该类将对所有对象调用render()

例如:

public class Registry{
    private static Collection<RenderedObject> register = new ArrayList<RenderedObject>();

    public static void add(RenderedObject obj){
        register.add(obj);
    }

    public static void renderAll(){
        for(RenderedObject obj : register){
            obj.render();
        }
    }
}
公共类注册表{
私有静态集合寄存器=新ArrayList();
公共静态无效添加(RenderObject对象){
注册。添加(obj);
}
公共静态void renderAll(){
for(renderObject对象:寄存器){
obj.render();
}
}
}

您可以将对象注册到RenderObject构造函数中的注册表中。

维护所有对象的列表,循环并调用该方法。

您可以使用引擎:

public class RenderingEngine implements Engine {
    private Engine originalEngine;
    private Collection<AbstractRender3DObject> items;

    public RenderingEngine(Engine originalEngine) {
      // assing
    }
    public void draw() {
         originalEngine.draw();
         invokeRender();
    }

    private void invokeRender() {
       for (AbstractRenderItem item : items) {
           item.render();
       }
    }

    public void register(Object3D item) {
         if (item instanceof AbstractRender3DObject) {
             items.add(item);
         }
         super.register(item);
    }
}
公共类RenderingEngine实现引擎{
私人发动机原创发动机;
私人收藏物品;
公共渲染引擎(引擎原始引擎){
//阿辛
}
公众抽签(){
originalEngine.draw();
invokeRender();
}
私有void invokeRender(){
for(AbstractRenderItem:items){
item.render();
}
}
公共无效登记簿(Object3D项目){
if(AbstractRender3DObject的项目实例){
项目。添加(项目);
}
超级注册(项目);
}
}

我不知道您正在使用的框架,所以我假设了一些方法和接口名称。但是想法如上所述。

在Android上使用静态变量是一个非常糟糕的主意。@aioobe,没有静态环境,您也可以做同样的事情@Helper方法,它的工作方式是相同的。@Helper:像这样明显而简单的东西现在是命名的“模式”了吗?下一步是什么?可变模式?“加法模式?”当然是科林。我甚至会说“你应该在没有静态环境的情况下完成它。”@Matti Virkkunen这基本上是一种观察者模式:对象在创建时注册,在更新时被调用(稍后)。它只是缺少一个合适的接口,注意以数字开头的标识符在Java中是非法的。