Quantcast
Channel: beginners - openFrameworks
Viewing all articles
Browse latest Browse all 4929

Simple sceneManager, problem with c++ polymorphism?

$
0
0

@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 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);
}

Posts: 1

Participants: 1

Read full topic


Viewing all articles
Browse latest Browse all 4929

Trending Articles