Hello everyone,
I’m try to develop a very simple sceneManager. I know there are many options on the web, I’m simply doing it to better grasp some c++ concepts.
I’m facing a problem with pointers and polymorphism I can’t figure out what it is.
Please bear with me if I’m too verbose with code pasting.
The following image is intended to sum up the situation:
In ofApp.cpp I have the following situation
void ofApp::setup(){
sm = SceneManager();
sm.addScene(0, SceneZero()); //<--This doesn't work
//sm.addScene(0, *new SceneZero()); <--This works but I'd like to avoid dynamic allocation
sm.setup();
}
void ofApp::update(){
sm.draw();
}
void ofApp::draw(){
sm.draw();
}
ofApp.h
class ofApp : public ofBaseApp{
public:
.
.
SceneManager sm;
};
SceneManager.h
#pragma once
#include<unordered_map>
#include "Scene.h"
#include "SceneCounter.h"
class SceneManager{
private:
//hash table to mantain "storyboard"
std::unordered_map <int, Scene*> scenes;
//currentScene index, had to define it this way to avoid circular dependency
int * csptr = &SceneCounter::currentScene;
public:
SceneManager();
~SceneManager();
void addScene(int id, Scene & scene);
void removeScene(int id);
void setCurrentScene(int id);
Scene * getCurrentScene();
void setup();
void update();
void draw();
};
SceneManager.cpp
#include "SceneManager.h"
SceneManager::SceneManager(){}
SceneManager::~SceneManager(){}
void SceneManager::addScene(int id, Scene &scene){
scenes.emplace(id, &scene);
}
Scene * SceneManager::getCurrentScene(){
return scenes.at(*csptr);
}
void SceneManager::removeScene(int id) {
scenes.erase(id);
}
void SceneManager::setCurrentScene(int id) {
*csptr = id;
}
void SceneManager::setup(){
scenes.at(*csptr)->setup();
}
void SceneManager::update(){
scenes.at(*csptr)->update();
}
void SceneManager::draw(){
scenes.at(*csptr)->draw();
}
Scene.h
#pragma once
#include<iostream>
#include "SceneCounter.h"
class Scene{
protected:
int * csptr = &SceneCounter::currentScene;
public:
Scene();
virtual ~Scene();
virtual void setup();
virtual void update();
virtual void draw();
};
Scene.cpp
#include "Scene.h"
Scene::Scene(){}
Scene::~Scene(){}
void Scene::setup(){
printf("Scene setup");
}
void Scene::update(){
printf("Scene update");
}
void Scene::draw(){
printf("Scene draw");
}
SceneZero.h
#pragma once
#include "Scene.h"
class SceneZero :
public Scene
{
public:
SceneZero();
virtual ~SceneZero();
virtual void setup() override;
virtual void update() override;
virtual void draw() override;
};
SceneZero.cpp
#include "SceneZero.h"
#include "ofMain.h"
SceneZero::SceneZero() : Scene(){}
SceneZero::~SceneZero(){}
void SceneZero::setup() {}
void SceneZero::update() {}
void SceneZero::draw() {
ofBackground(0);
ofSetColor(242);
ofDrawCircle(0, 0, 100);
}