2010-09-18 7 views
5

Estoy escribiendo un motor de juego básico y tengo una clase abstracta que representa cualquier objeto que se pueda dibujar en el mundo 3D, sin embargo dentro de esta clase hay un método abstracto Render() que me gustaría llamar automáticamente por el motor en cada sorteo fase. ¿Cómo podría implementar esto para que todas las clases que se extienden desde mi clase abstracta tengan automáticamente invocada Render()?¿Cómo llamarías a un método de todas las instancias de una clase?

Estoy usando java, android sdk 2.2 y opengl es.

Respuesta

3

Puede registrar cada objeto que se puede representar en una clase que invocará a render() en todos sus objetos.

Por ejemplo:

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

Y se puede registrar sus objetos en el registro dentro del constructor de la RenderedObject.

+3

variables estáticas es una * muy mala idea * para usar en Android. – aioobe

+0

Me recuerda un poco el patrón del observador. – helpermethod

+0

@aioobe, puede hacer lo mismo sin un entorno estático. @Helper Method, funciona de la misma manera. –

0

Mantenga una lista de todos los objetos, recorra y llame al método.

1

Se puede hacer una Proxy de su motor:

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

No sé el marco que está utilizando, lo que supone un método de interfaz y nombres. Pero la idea es como la anterior.

+0

Tenga en cuenta que los identificadores que comienzan con un dígito son ilegales en Java. – BalusC

+0

ja, por supuesto. Gracias :) – Bozho

Cuestiones relacionadas