If the state machine doesn't need to be exposed you can create base class for Scene which is not templated:

abstract class Scene {} // As it is now minus the state machine

abstract class ConcreteScene (T) : Scene
{
    private StateMachine!T _stateMachine;

    // other code that need access to _stateMachine
}

class MainMenu : ConcreteScene!(MainMenu)  {}

Scene _currentScene = new MainMenu;

"ConcreteScene" might not be the best name of an abstract class.

Just came up with something similar before I saw this post:

interface IScene { // enter, exit, update, draw }
class Scene!T : IScene {
    private StateMachine!T _stateMachine;
    void update(float time) {
        _stateMachine.update(cast(T) this, time);
    }
}
The cast is unfortunate but since it only happens once per update cycle I'm not that worried about it.

I could just declare the StateMachine separately in every Scene, but that seems like a lot of duplicate code (I then repeat the same code for
updating the state machine, ect.)

Or you could use a template mixin:

template StateMachineMixin (T)
{
    private StateMachine!T _stateMachine;

    // other code that need access to _stateMachine
}

class MainMenu : Scene
{
    mixin StateMachineMixin!(typeof(this));
}

Interesting idea, I might give this a try but the first suggestion seems fine for now. Thanks!

Reply via email to