flibitijibibo / FNA-MGHistory

FNA - Accuracy-focused XNA4 reimplementation for open platforms
http://fna-xna.github.io/
246 stars 37 forks source link

Initialization order mishap #317

Closed renaudbedard closed 9 years ago

renaudbedard commented 9 years ago

If you do in your Game inheritor :

protected override void Initialize()
{
    // add some components
    Components.Add(new MyEarlyComponent());

    base.Initialize();

    // add some more components
    Components.Add(new MyLateComponent());
}

The MyLateComponent never gets initialized.

renaudbedard commented 9 years ago

Can be fixed by putting the

            _components.ComponentAdded += Components_ComponentAdded;
            _components.ComponentRemoved += Components_ComponentRemoved;

calls to the very end of Initialize() in Game.cs

flibitijibibo commented 9 years ago

This will need an XNA4 accuracy check - I won't be able to do this for a while, so if someone wants to nab this before me you've got plenty of time to beat me to it.

flibitijibibo commented 9 years ago

I just checked this with XNA4 and it appears we're doing the accurate behavior as-is. Components not in the list by base.Initialize() will NOT be automatically initialized. The documentation seems to indicate that this is intentional, too:

https://msdn.microsoft.com/en-us/library/microsoft.xna.framework.gamecomponent.initialize.aspx

If this GameComponent has been added to the Game.Components collection, this method will be called automatically if you call base.Initialize in your Game.Initialize method.

In classes that derive from Game, it is necessary to call base.Initialize in Game.Initialize, which will automatically enumerate through any game components that have been added to Game.Components and call their Initialize method.