|
 | | |
|
| |  |   |  |  | |  |  | |  |  | |  |  | |  | |
 | | |
| Dúvida sobre métodos Initialize e Draw |
|
|
Boa tarde,
Estou desenvolvendo um jogo 2D baseando-me no conteúdo do livro Beginning XNA 2.0 Game Programming, porém estou utilizando a versão 3.0 do framework, e me surgiu a seguinte dúvida: tenho as classes GameScene e AudioComponent. Para instanciar um objeto da classe GameScene, preciso carregar recursos gráficos e fazer referência a um objeto da classe AudioComponent (este objeto é instanciado e registrado, através do método Services.AddService, dentro do método Initialize da classe Game). Meu problema está na ordem de execução dos métodos Initialize da classe Game e GameScene: eu só instancio meu objeto GameScene dentro do método LoadContent da classe Game, e mesmo adicionando este objeto no array Components o seu método Initialize não é invocado.
O código abaixo ilustra este problema:
public class StartScene : FrameworkXNA.Scene.GameScene
{
...
public override void Initialize()
{
audioComponent = (AudioComponent)Game.Services.GetService(typeof(AudioComponent));
...
}
}
public class Game1 : Microsoft.Xna.Framework.Game
{
// Como a classe GameScene depende de recursos gráficos para ser criada, estou instanciando
// esta no método LoadContent()
protected override void LoadContent()
{
startScene = new StartScene(...);
Components.Add(startScene);
}
protected override void Initialize()
{
audioComponent = new AudioComponent(...);
Services.AddService(typeof(AudioComponent), audioComponent);
base.Initialize();
}
}
O comportamento que eu esperava era que ao adicionar o objeto startScene no array Components, o método startScene.Initialize seria automaticamente executado (uma vez que executo o método base.Initialize() no métodp Game.Initialize), porém isto não está ocorrendo.
Em relação ao método Draw, minha dúvida seria quanto a criação de um novo objeto SpriteBatch para cada classe que seja DrawableGameComponent ou se registro apenas uma instância do SpriteBatch (criada na classe Game), pois neste último caso teria que fazer spriteBatch.Begin(); base.Draw(); spriteBatch.End(); considerando que ao adicionar um objeto DrawableGameComponent ao array Components o método Draw deste objeto possa ser automaticamente invocado.
São dúvidas sobre a burocracia do framework ao qual ainda não tenho muita experiência, mas acredito que mais alguém já tenha passado por algum problema semelhante e possa contribuir.
Agradeço desde já
Happy coding |
|
|
|  |  | | |
| Re: Dúvida sobre métodos Initialize e Draw |
|
|
wh1pl4sh escreveu
Boa tarde,
Estou desenvolvendo um jogo 2D baseando-me no conteúdo do livro Beginning XNA 2.0 Game Programming, porém estou utilizando a versão 3.0 do framework, e me surgiu a seguinte dúvida: tenho as classes GameScene e AudioComponent. Para instanciar um objeto da classe GameScene, preciso carregar recursos gráficos e fazer referência a um objeto da classe AudioComponent (este objeto é instanciado e registrado, através do método Services.AddService, dentro do método Initialize da classe Game). Meu problema está na ordem de execução dos métodos Initialize da classe Game e GameScene: eu só instancio meu objeto GameScene dentro do método LoadContent da classe Game, e mesmo adicionando este objeto no array Components o seu método Initialize não é invocado.
O código abaixo ilustra este problema:
public class StartScene : FrameworkXNA.Scene.GameScene
{
...
public override void Initialize()
{
audioComponent = (AudioComponent)Game.Services.GetService(typeof(AudioComponent));
...
}
}
public class Game1 : Microsoft.Xna.Framework.Game
{
// Como a classe GameScene depende de recursos gráficos para ser criada, estou instanciando
// esta no método LoadContent()
protected override void LoadContent()
{
startScene = new StartScene(...);
Components.Add(startScene);
}
protected override void Initialize()
{
audioComponent = new AudioComponent(...);
Services.AddService(typeof(AudioComponent), audioComponent);
base.Initialize();
}
}
O comportamento que eu esperava era que ao adicionar o objeto startScene no array Components, o método startScene.Initialize seria automaticamente executado (uma vez que executo o método base.Initialize() no métodp Game.Initialize), porém isto não está ocorrendo.
Em relação ao método Draw, minha dúvida seria quanto a criação de um novo objeto SpriteBatch para cada classe que seja DrawableGameComponent ou se registro apenas uma instância do SpriteBatch (criada na classe Game), pois neste último caso teria que fazer spriteBatch.Begin(); base.Draw(); spriteBatch.End(); considerando que ao adicionar um objeto DrawableGameComponent ao array Components o método Draw deste objeto possa ser automaticamente invocado.
São dúvidas sobre a burocracia do framework ao qual ainda não tenho muita experiência, mas acredito que mais alguém já tenha passado por algum problema semelhante e possa contribuir.
Agradeço desde já
Happy coding |
O seu GAmeComponent(StartScene) está sendo adicionado à lista de components no local errado. Você deve adicioná-lo no método Initialize do seu Game. Dai quando base.Initialize() for invocado, todos os métodos initializes dos components serão invocados.
@lucianoJoseBr
My Blog: http://lucjose.wordpress.com |
|
|
|  |  | | |
| Re: Dúvida sobre métodos Initialize e Draw |
|
|
Em relaçao ao DrawalbeGameComponent.
Vale lembrar que ao utilizar componentes, a perca de performance é inevitável. Se o seu objetivo nao é perder performance e nao reutilizar algo em outros projetos, não vale a pena utilizar Components.
Se você quer desenvoler um componente, você precisa elaborá-lo o mais independente possivel de regras como essa que você exemplificou : spriteBatch.Begin(); base.Draw(); spriteBactch.End();
Supondo que você tenha distribuido seu component numa comunidade de desenvolvedores XNA. Toda pessoa que pegou o seu DrawableGameComponent, precisa fazer isso que vc fez acima. Quando o certo seria que todos que forem utilizar seu component, apenas precise instancia-lo e adiciona-lo na coleção de componentes de um Game.
Melhor que isso, é desenvolver um componente inteligente o suficiente para invocar SpriteBAtch.Begin() antes da 1º chamada ao método Draw do 1º DrawableGameComponent e após a ultima chamada ao método Draw do ultimo DrawableGameComponent, ele invoque o SpriteBAtch.End().
@lucianoJoseBr
My Blog: http://lucjose.wordpress.com |
|
|
|
|  |  | |  |  | |  |  | |  |
|
|
| | |
|
|
|  |
 |  |
|