rcor via Digitalmars-d-learn
2014-10-19 11:19:37 UTC
I'm trying to make a game, and would like to set up the following
hierarchy:
At any time, the game is in one Scene. Each scene has a state
machine that manages States of type T, where T is the type of the
scene (e.g. Overworld, Menu).
abstract class State!T {
void update(T scene, float time, InputManager input);
...
}
class StateMachine!T { //manages states of type State!T }
abstract class Scene {
alias T = // type of class extending Scene
// methods pushState, popState, currentState access
_stateMachine
private StateMachine!T _stateMachine;
}
class MainMenu : Scene {
// I want _stateMachine of type StateMachine!MainMenu
}
class Overworld : Scene {
// I want _stateMachine of type StateMachine!Overworld
}
class MoveToLocation : State!Overworld {
override void update(Overworld world, float time, InputManager
input) {
// access properties of Overworld here
}
}
Within the Scene class, I've tried alias T = typeof(this), but
that appears to be resolved within Scene. This means that any
Scene, such as Overworld, have a state machine of type
StateMachine!Scene rather than StateMachine!Overworld. Since
States are particular to a certain scene and are designed to
manipulate properties specific to that type of scene, this would
involve a lot of casting if States are not parameterized. It
feels like I need something like a class version of the (this T)
syntax used in templates.
This all smells a bit off though, so I wouldn't be surprised if
the answer is that I'm approaching this all wrong, but right now
I'm not seeing it.
hierarchy:
At any time, the game is in one Scene. Each scene has a state
machine that manages States of type T, where T is the type of the
scene (e.g. Overworld, Menu).
abstract class State!T {
void update(T scene, float time, InputManager input);
...
}
class StateMachine!T { //manages states of type State!T }
abstract class Scene {
alias T = // type of class extending Scene
// methods pushState, popState, currentState access
_stateMachine
private StateMachine!T _stateMachine;
}
class MainMenu : Scene {
// I want _stateMachine of type StateMachine!MainMenu
}
class Overworld : Scene {
// I want _stateMachine of type StateMachine!Overworld
}
class MoveToLocation : State!Overworld {
override void update(Overworld world, float time, InputManager
input) {
// access properties of Overworld here
}
}
Within the Scene class, I've tried alias T = typeof(this), but
that appears to be resolved within Scene. This means that any
Scene, such as Overworld, have a state machine of type
StateMachine!Scene rather than StateMachine!Overworld. Since
States are particular to a certain scene and are designed to
manipulate properties specific to that type of scene, this would
involve a lot of casting if States are not parameterized. It
feels like I need something like a class version of the (this T)
syntax used in templates.
This all smells a bit off though, so I wouldn't be surprised if
the answer is that I'm approaching this all wrong, but right now
I'm not seeing it.