Я использую менеджер состояния игры (вступление, главное меню, игровой процесс и т. д.) из здесь< /а>. Однако есть одна проблема. Очень минималистичный пример:
class cApp //manages the states and gives them access to window
{
public:
cApp (RenderWindow & ref) : window(ref) {}
void changeState(cState *); //these function realy doesn't matter
void update();
void draw();
RenderWindow & window; //the same as in the article, this class not only manages state but gives them access to window etc
private:
std::vector <cState *> states;
}
Штат:
class cState
{
public:
cState(cApp * ptr) : app(ptr) {}
virtual void update() = 0;
virtual void draw() = 0;
protected:
cApp * app;
}
Пока все хорошо. Проблема в том, что это часть базовой структуры. Таким образом, cApp является очень простым и дает доступ только к окну. Однако может быть случай, когда пользователь хочет использовать сеть в своей игре. Сетевой движок не является частью единого состояния, поэтому он должен быть на более глобальном (то есть cApp) уровне.
Итак, пользователь делает:
class cNetworkedApp : public cApp
{
public:
cNetworkedApp(RenderWindow & ref1, NetworkEngine & ref2)
: networking(ref2), cApp(ref1)
NetworkEngine & networking; //initialized in cNetworkedApp constructor
}
class CharacterCreationState : public cState
{
CharacterCreationState(cApp * ptr) : cState(ptr) {}
//implement pure virtual functions
void draw()
{}
void update()
{
//THE PROBLEM
//the state needs to access the network engine so casting is required
cNetworkedApp * ptr = static_cast<cNetworkedApp*>(app))
ptr->networking.sendSomething();
}
}
Единственное очевидное решение — включить все, что возможно, в cApp, однако, как я уже сказал, это фреймворк. Конечно, некоторые движки, такие как физический движок или звуковой движок, — это вещи, которые вы помещаете в состояние, так что это не проблема, но такие вещи, как сетевая система, должны быть единым объектом, доступным для всех состояний. И не каждое приложение использует его.
Нужно ли мне переделывать этот код или все в порядке?
dynamic_cast
даже не будет работать, так как классы не полиморфны. - person Luchian Grigore   schedule 14.02.2013virtual
. В случаеcState
вы можете только предполагать, что они есть, поскольку= 0
иначе не скомпилируется, но в случаеcApp
это неясно. Помните, что проблему нужно решать вы, а не мы. Ваша часть сделки помогает нам понять проблему, наша часть сделки пытается помочь вам прийти к решению. Я лично не буду тратить время, пытаясь угадать ваши намерения. - person David Rodríguez - dribeas   schedule 14.02.2013