diff --git a/src/sj/AbstractGame.d b/src/sj/AbstractGame.d index 58ce4dd..4ae41a3 100644 --- a/src/sj/AbstractGame.d +++ b/src/sj/AbstractGame.d @@ -11,15 +11,13 @@ class AbstractGame { public: /// this(SceneInterface first_scene) in (first_scene) { - scene_ = first_scene; + next_scene_ = first_scene; } /// void Update(KeyInput input) { - if (auto next = scene_.TakeNextScene()) { - scene_ = next; - } - scene_.Update(input); + scene_ = next_scene_; + next_scene_ = scene_.Update(input); } /// void Draw() { @@ -29,4 +27,6 @@ class AbstractGame { private: SceneInterface scene_; + + SceneInterface next_scene_; } diff --git a/src/sj/AbstractScene.d b/src/sj/AbstractScene.d deleted file mode 100644 index 0e87727..0000000 --- a/src/sj/AbstractScene.d +++ /dev/null @@ -1,31 +0,0 @@ -/// License: MIT -module sj.AbstractScene; - -import sj.KeyInput, - sj.SceneInterface; - -/// -class AbstractScene : SceneInterface { - public: - /// - this() { - } - - abstract override { - void Update(KeyInput input); - void Draw(); - } - - override SceneInterface TakeNextScene() { - scope(exit) next_ = null; - return next_; - } - - protected: - void GoNextScene(SceneInterface next) in (next) { - next_ = next; - } - - private: - SceneInterface next_; -} diff --git a/src/sj/Game.d b/src/sj/Game.d index e51dc74..ffe1f22 100644 --- a/src/sj/Game.d +++ b/src/sj/Game.d @@ -24,6 +24,7 @@ class Game : AbstractGame { title_.SetupSceneDependency(select_); select_.SetupSceneDependency(title_); + title_.Initialize(); super(title_); } diff --git a/src/sj/SceneInterface.d b/src/sj/SceneInterface.d index b20c42f..a54df98 100644 --- a/src/sj/SceneInterface.d +++ b/src/sj/SceneInterface.d @@ -7,10 +7,7 @@ import sj.KeyInput; interface SceneInterface { public: /// - void Update(KeyInput input); + SceneInterface Update(KeyInput input); /// void Draw(); - - /// - SceneInterface TakeNextScene(); } diff --git a/src/sj/SelectScene.d b/src/sj/SelectScene.d index fed267a..9318fc5 100644 --- a/src/sj/SelectScene.d +++ b/src/sj/SelectScene.d @@ -3,15 +3,15 @@ module sj.SelectScene; import derelict.sfml2.audio; -import sj.AbstractScene, - sj.KeyInput, +import sj.KeyInput, sj.LobbyWorld, sj.ProgramSet, sj.SceneInterface, + sj.TitleScene, sj.util.audio; /// -class SelectScene : AbstractScene { +class SelectScene : SceneInterface { public: /// @@ -27,12 +27,19 @@ class SelectScene : AbstractScene { } /// - void SetupSceneDependency(SceneInterface title_scene) { + void SetupSceneDependency(TitleScene title_scene) { title_scene_ = title_scene; } - override void Update(KeyInput input) { - if (input.up) GoNextScene(title_scene_); + /// + void Initialize() { + } + override SceneInterface Update(KeyInput input) { + if (input.up) { + title_scene_.Initialize(); + return title_scene_; + } + return this; } override void Draw() { lobby_.Draw(); @@ -53,7 +60,7 @@ class SelectScene : AbstractScene { } } - SceneInterface title_scene_; + TitleScene title_scene_; LobbyWorld lobby_; diff --git a/src/sj/TitleScene.d b/src/sj/TitleScene.d index 562fb1b..114ae0f 100644 --- a/src/sj/TitleScene.d +++ b/src/sj/TitleScene.d @@ -5,15 +5,15 @@ import std.math; import gl4d; -import sj.AbstractScene, - sj.KeyInput, +import sj.KeyInput, sj.LobbyWorld, sj.ProgramSet, + sj.SelectScene, sj.SceneInterface, sj.TitleTextProgram; /// -class TitleScene : AbstractScene { +class TitleScene : SceneInterface { public: /// enum TitleMatrix = { @@ -26,20 +26,40 @@ class TitleScene : AbstractScene { /// this(LobbyWorld lobby, ProgramSet program) { lobby_ = lobby; - SetupLobby(lobby); - title_ = program.Get!TitleTextProgram; } /// - void SetupSceneDependency(SceneInterface next_scene) { - next_scene_ = next_scene; + void SetupSceneDependency(SelectScene select) { + select_scene_ = select; } - override void Update(KeyInput input) { + /// + void Initialize() { + lobby_.view.pos = vec3(0, -0.15, -1); + lobby_.view.target = vec3(0, -0.15, 0); + lobby_.view.up = vec3(0, 1, 0); + + lobby_.background.inner_color = vec4(0.9, 0.9, 0.9, 1); + lobby_.background.outer_color = vec4(-0.1, -0.1, -0.1, 1); + + lobby_.light_pos = vec3(0, 9, -1); + lobby_.cube_material.diffuse_color = vec3(0.1, 0.1, 0.1); + lobby_.cube_material.light_color = vec3(1, 0.8, 0.8); + lobby_.cube_material.light_power = vec3(100, 100, 100); + lobby_.cube_material.ambient_color = vec3(0.2, 0.2, 0.2); + lobby_.cube_material.specular_color = vec3(0.5, 0.2, 0.2); + + frame_ = 0; + } + override SceneInterface Update(KeyInput input) { lobby_.cube_matrix.rotation += vec3(PI/600, PI/600, PI/600); - if (input.down) GoNextScene(next_scene_); + if (input.down) { + select_scene_.Initialize(); + return select_scene_; + } + return this; } override void Draw() { lobby_.Draw(); @@ -47,23 +67,7 @@ class TitleScene : AbstractScene { } private: - static void SetupLobby(LobbyWorld lobby) { - lobby.view.pos = vec3(0, -0.15, -1); - lobby.view.target = vec3(0, -0.15, 0); - lobby.view.up = vec3(0, 1, 0); - - lobby.background.inner_color = vec4(0.9, 0.9, 0.9, 1); - lobby.background.outer_color = vec4(-0.1, -0.1, -0.1, 1); - - lobby.light_pos = vec3(0, 9, -1); - lobby.cube_material.diffuse_color = vec3(0.1, 0.1, 0.1); - lobby.cube_material.light_color = vec3(1, 0.8, 0.8); - lobby.cube_material.light_power = vec3(100, 100, 100); - lobby.cube_material.ambient_color = vec3(0.2, 0.2, 0.2); - lobby.cube_material.specular_color = vec3(0.5, 0.2, 0.2); - } - - SceneInterface next_scene_; + SelectScene select_scene_; LobbyWorld lobby_;