Реализация сменной игровой сцены в Stack Overflow

У меня есть около 10 классов сцены в моей игре C ++. Это что-то вроде обычного игрового экрана (экран меню, экран игры, таблица лидеров, опции и т. Д.). Поэтому мне нужна техника для замены одной сцены на другую. Я прочитал все комментарии, которые вы отправили мне в этой теме, и попытался реализовать это. Теперь у меня есть следующий код:

// -----[ main.cpp ]----- //
#include "SceneManager.h"#include "Scene.h"
int main( int argc, const char * argv[] ) {
SceneManager *sceneManager = new SceneManager();
sceneManager->changeScene( 0 );
delete sceneManager;
return 0;
}

// -----[ Scene.h ]----- //
class SceneManager;
class Scene {
public:
SceneManager *sceneManager;
void start( SceneManager *sceneManager );
};

// -----[ SceneManager.h ]----- //
#include "Scene.h"#include "MenuScene.h"#include "GameScene.h"
class Scene;
class MenuScene;
class GameScene;

class SceneManager {
public:
Scene* scene;

void changeScene( short id ) {

if ( scene != NULL ) {
delete scene; // to prevent a memory leak
}

if ( id == 0 ) {
scene = new MenuScene();
} else if ( id == 1 ) {
scene = new GameScene();
}

if (scene) {
scene->start( this );
}
}
};// -----[ MenuScene.h ]----- //
class MenuScene: public Scene {
public:
void start( SceneManager *sceneManager ) {
this->sceneManager = sceneManager;
}
};

// -----[ GameScene.h ]----- //
class GameScene: public Scene {
public:
void start( SceneManager *sceneManager ) {
this->sceneManager = sceneManager;
}
};

Это не работает из-за ошибки (XCode 4.6, MacOS X):

Apple Match-O Linker (id) Error
Undefined symbols for architecture x86_64:
"Scene::start(SceneManager*)", referenced from:
SceneManager::changeScene(short) in main.o
ld: symbol(s) not found for architecture x86_64

Что я делаю не так? Как это исправить? Может быть, кто-то знает о некоторых популярных проблемах на эту тему?

0

Решение

Как уже упоминалось в комментариях, я считаю, что ваш дизайн концептуально нуждается в другом классе. Вот грубый пример.

class Scene {
public:
virtual void start() = 0;
};

class SceneManager {
public:
void changeScene( short id ) {

Scene* scene = NULL;
if ( id == 0 ) {
scene = new MenuScene(); // undeclared yet
} else if ( id == 1 ) {
scene = new GameScene(); // undeclared yet
}

if (scene) {
// TODO: make the scene visible.
scene->start();
}
}
};

class MenuScene: public Scene {
public:
virtual void start() {
// Draw menu stuff
}
};

class GameScene: public Scene {
public:
void start() {
// Draw game stuff
}
};

Трудно быть более конкретным, чем это, не зная больше контекста о вашей конкретной среде.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]