// vim:ft=doxygen
namespace crepe {
/**

\defgroup feature_scene Scenes
\ingroup feature
\brief User-defined scenes

Scenes can be used to implement game environments, and allow arbitrary game
objects to be organized as part of the game structure. Scenes are implemented as
derivative classes of Scene, which are added to the game using the SceneManager.
Scenes describe the start of a Scene and cannot modify GameObjects during
runtime of a Scene (use \ref feature_script for this purpose).

\see SceneManager
\see GameObject
\see Script
\see Scene

\par Example

This example demonstrates how to define and add scenes to the loop/scene manager
in the `crepe` framework. Each concrete scene should be derived from Scene. In
the example below, the concrete scene is named MyScene. A concrete scene should,
at least, implement (override) two methods, namely load_scene() and get_name().
The scene is build (using GameObjects) in the load_scene() method. GameObjects
should be made using the component_manager::new_object().

In the example below, two GameObjects (named object1 and object2) are added to
MyScene. object1 and object2 do not have any non-default Components attached to
them, however, if needed, this should also be done in load_scene(). Each
concrete scene must have a unique name. This unique name is used to load a new
concrete scene (via a Script). The unique name is set using the get_name()
method. In the example below, MyScene's unique name is my_scene.

After setting up one or more concrete scene(s), the concrete scene(s) should be
added to the loop/scene manager. This is done in your main(). Firstly, the
LoopManager should be instantiated. Than, all the concrete scene(s) should be
added to the loop/scene manger via loop_mgr::add_scene<>(). The templated
argument should define the concrete scene to be added.

```cpp
#include <crepe/api/LoopManager.h>
#include <crepe/api/GameObject.h>
#include <crepe/api/Scene.h>
#include <crepe/types.h>

using namespace crepe;

class MyScene : public Scene {
public:
	void load_scene() {
		ComponentManager & mgr = this->component_manager;
		GameObject object1 = mgr.new_object("object1", "tag_my_scene", vec2{0, 0}, 0, 1);
		GameObject object2 = mgr.new_object("object2", "tag_my_scene", vec2{1, 0}, 0, 1);
	}

	string get_name() const { return "my_scene"; }
};

int main() {
	LoopManager loop_mgr;
	
	// Add the scenes to the loop manager
	loop_mgr.add_scene<MyScene>();

	loop_mgr.start();
}
```

*/
}