2017-06-17 5 views
0

Ich benutze die Java-Spiel-Engine von Thebennybox, um meine eigene Engine zu erstellen. Zuvor arbeitete ich mit UE4 wo Sie Static Mesh-Schauspieler in seinem Motor haben könnten dies wahrscheinlich ein Gameobject mit einem MeshRenderer Komponente mit ihm verbunden sein würde: Ich versuche, ein großes Feld von diesem GrasTheBennyBox Engine - Performance-freundliche Instanz Statische Meshes Wie in UE4

GameObject staticMeshActor_Grass = new GameObject(); 

AddObject(staticMeshActor_Grass.addComponent(new MeshRenderer(
    new Mesh("plane.obj"), new Material(
    new Texture("T_Grass_BC.png"), 1, 8, 
    new Texture("T_Grass_N.png"))))); 

Jetzt zu erstellen Kacheln, aber da dies alle ihre individuellen GameObjects (oder Actors in UE4 Terms) nach 16x16 Kacheln sind, fängt es an, die Bildrate zu verkrüppeln!

Ich glaube, ich kann dieses Problem lösen, wenn ich mehrere statische Meshes in einem GameObject mache, um es leistungsfähiger zu machen. In UE4 wird dieses Merkmal "Instanced Static Mesh Component" genannt, was dies ermöglicht und ich möchte etwas Ähnliches haben.

Hier ist die Gameobject Klasse von thebennybox gemacht:

public class GameObject 
{ 
    private ArrayList<GameObject> m_children; 
    private ArrayList<GameComponent> m_components; 
    private Transform m_transform; 
    private CoreEngine m_engine; 

    public GameObject() 
    { 
     m_children = new ArrayList<GameObject>(); 
     m_components = new ArrayList<GameComponent>(); 
     m_transform = new Transform(); 
     m_engine = null; 
    } 

    public GameObject AddChild(GameObject child) 
    { 
     m_children.add(child); 
     child.SetEngine(m_engine); 
     child.GetTransform().SetParent(m_transform); 

     return this; 
    } 

    public GameObject AddComponent(GameComponent component) 
    { 
     m_components.add(component); 
     component.SetParent(this); 

     return this; 
    } 

    public void InputAll(float delta) 
    { 
     Input(delta); 

     for(GameObject child : m_children) 
      child.InputAll(delta); 
    } 

    public void UpdateAll(float delta) 
    { 
     Update(delta); 

     for(GameObject child : m_children) 
      child.UpdateAll(delta); 
    } 

    public void RenderAll(Shader shader, RenderingEngine renderingEngine) 
    { 
     Render(shader, renderingEngine); 

     for(GameObject child : m_children) 
      child.RenderAll(shader, renderingEngine); 
    } 

    public void Input(float delta) 
    { 
     m_transform.Update(); 

     for(GameComponent component : m_components) 
      component.Input(delta); 
    } 

    public void Update(float delta) 
    { 
     for(GameComponent component : m_components) 
      component.Update(delta); 
    } 

    public void Render(Shader shader, RenderingEngine renderingEngine) 
    { 
     for(GameComponent component : m_components) 
      component.Render(shader, renderingEngine); 
    } 

    public ArrayList<GameObject> GetAllAttached() 
    { 
     ArrayList<GameObject> result = new ArrayList<GameObject>(); 

     for(GameObject child : m_children) 
      result.addAll(child.GetAllAttached()); 

     result.add(this); 
     return result; 
    } 

    public Transform GetTransform() 
    { 
     return m_transform; 
    } 

    public void SetEngine(CoreEngine engine) 
    { 
     if(this.m_engine != engine) 
     { 
      this.m_engine = engine; 

      for(GameComponent component : m_components) 
       component.AddToEngine(engine); 

      for(GameObject child : m_children) 
       child.SetEngine(engine); 
     } 
    } 
} 

Die AddObject() -Methode im ersten Teil von einer abstrakten Klasse kommt gezeigt und schließlich ruft die Methode AddChild (Gameobject Kind) in der Gameobject-Klasse. Wie Sie sehen können, haben wir eine ArrayList von GameObjects und GameComponents. Jetzt müsste ich eine Methode implementieren, um die Erstellung mehrerer Mesh-Instanzen in einem GameObject zu unterstützen.

Ich habe bereits versucht, mehrere MeshRenderer-Komponenten zu einem GameObject hinzuzufügen, aber das hat nicht geklappt. Vielleicht hat jemand einen Vorschlag, wie ich das machen könnte?

, wenn Sie wirklich interessiert sind und wollen, dass ich Ihnen helfen kann, den Motor hier herunterladen: https://github.com/BennyQBD/3DGameEngine

Verwenden Sie einfach ‚Open Projects Von File System ..‘ in Eclipse, wählen Sie das Verzeichnis dieses Ordners und sobald Sie Habe getan, dass du das Programm ausführen kannst.

Vielen Dank für Ihre Hilfe!

Antwort

Verwandte Themen