@sorrentix wrote:
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 situationvoid 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); }
Posts: 1
Participants: 1
