segunda-feira, 12 de novembro de 2007

Biblioteca Tecnodata3D.Utility - Classe Global

Opa! gente bacana,

Aqui estou entao mais uma vez para explicar a nossa engine, e começaremos pela assembly básica - Utility.

Como expliquei antes, a Utility contem classes que representam a base da engine, assim como várias classes de apoio. Vamos começar por ententer alguns conceitos

O que é um singleton?

Um singleton é uma classe da qual existe apenas uma instancia dela em toda a vida do projeto. Na nossa engine, poucas classes sao singletons, de bom exemplo a classe Global. Nesta classe ficam agregados os varios modulos da Utility necessarios para o uso da engine. Ela tem uma estrutura bem simples:

Tecnodata3D.Utility.Global
- private static Global _default;
- private BaseGame _game;
- private List _listModules;
- public AssetManager AssetManager { get(); set(); }
- public Camera Camera { get(); set(); }
- public static Global Default { get(); }
- public BaseGame Game { get(); }
- public Input Input { get(); set(); }
- public Log Log { get(); set(); }
- public ScreenManager { get(); set(); }
- public UserProfileManager UserProfileManager { get(); set(); }
- private Global ();
- public static void CreateInstance(BaseGame game);
- public void Initialize();
- public void AddModule ( AModule oModule );
- public AModule GetModule ( string sModule );
- public void ReplaceModule ( AModule oModule );
- public void RemoveModule ( AModule oModule );
- public void Update ( GameTime gameTime );
- public void Draw ( GameTime gameTime );

Como falei anteriormente, para usar a engine, deve-se criar uma classe de jogo que herda a classe BaseGame. A propria BaseGame se preocupa em criar a instancia de Global, entao nao existe necessidade de se preocupar com isso. Esta classe, entao, é uma interface global para uso da biblioteca Utility da engine - atravez dela temos acesso aos modulos principais, alem de possibilidade de criar e adicionar novos modulos, ou substituir os padrao por outros (por exemplo, voce pode criar uma classe CameraRTS, herdando-a da classe Camera, e utilizar do metodo ReplaceModule() para substituir a camera padrao pela customizada).

Isso nos dá uma poderosa biblioteca básica para usar para a maioria dos projetos (por exemplo, Camera vem já com 4 tipos de camera diferentes), e caso exista necessidade de substituir ou extender essas funcionalidades, temos a flexibilidade de o fazer facilmente.

Mas como usar a Global? É simples, em qualquer local do projeto, basta acessar a propriedade estática Default, a qual guarda a instancia "singleton" da classe Global. Entao, acessamos facilmente a Camera da biblioteca através do formato Global.Default.Camera. Embora possamos acessar qualquer módulo existente na Global atraves do metodo GetModule(), criamos algumas propriedades para facilitar a digitação para acesso a alguns modulos mais utilizados (internamente eles usam o metodo GetModule).

E como é a organização interna da Global?

Internamente, todos os módulos sao guardados numa lista, obedecendo a uma ordem definida por uma propriedade OrderID da classe abstrata AModule. Se um módulo necessita ser executado antes de outro, basta alterar sua propria OrderID antes de ser adicionado na Global. Por padrao, todos os módulos que tem uma propriedade de facil acesso já sao criados e adicionados na Global pela BaseGame.

Embora seja a BaseGame que recebe primeiramente as chamadas a Update() e Draw(), elas sao repassadas imediatamente para Global, que trata de iterar por todos os modulos em ordem correta, repassando assim as chamadas a cada um dos módulos. Este sistema é extremamente eficiente e simples de trabalhar - e remove a necessidade de chamar individualmente Update() e Draw() para os modulos necessarios - tudo é cuidado automaticamente pela engine.

E é isso aí gente - como tinha dito, a Global é uma classe bem simples, porém facilita muito a vida na hora de acessar dados globais do projeto. Próximo post estarei explicando detalhadamente o funcionamento da classe BaseGame - que é o coração da parte Utility da engine.

Abraço e até mais!

Nenhum comentário: