From 867414de0e2e963b0d1c35b3a46884a8a03a9294 Mon Sep 17 00:00:00 2001
From: JAROWMR <jarorutjes07@gmail.com>
Date: Mon, 6 Jan 2025 19:09:52 +0100
Subject: popup window

---
 game/menus/endgame/EndGameSubScene.cpp | 163 +++++++++++++++++++++++++++++++++
 1 file changed, 163 insertions(+)
 create mode 100644 game/menus/endgame/EndGameSubScene.cpp

(limited to 'game/menus/endgame/EndGameSubScene.cpp')

diff --git a/game/menus/endgame/EndGameSubScene.cpp b/game/menus/endgame/EndGameSubScene.cpp
new file mode 100644
index 0000000..029bf1c
--- /dev/null
+++ b/game/menus/endgame/EndGameSubScene.cpp
@@ -0,0 +1,163 @@
+
+#include "EndGameSubScene.h"
+
+#include "../MenusConfig.h"
+#include "../../Config.h"
+#include "api/GameObject.h"
+#include "api/Scene.h"
+#include "api/Sprite.h"
+
+#include <crepe/api/Camera.h>
+
+using namespace crepe;
+using namespace std;
+
+void EndGameSubScene::create(Scene & scn){
+	const vec2 SIZE = {200,100};
+	const float THICKNESS_BANNER = 34;
+	const float MIDDLE_OFFSET_FACTOR_TICKNESS = 0.83;
+	const float MIDDLE_OFFSET_FACTOR_OFFSET = 1.2;
+	const float MIDDLE_OFFSET_TICKNESS_ADDITION = -8;
+	const float MIDDLE_OFFSET_OFFSET_ADDITION = -0.5;
+	const float BOTTOM_OFFSET_X = 3;
+	const float BOTTOM_OFFSET_Y = -5;
+
+	GameObject endgame = scn.new_object("EndGameSubScene");
+
+	// Top_middle
+	endgame.add_component<Sprite>(
+		Asset("asset/ui/settings_container/top_middle_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
+		.size = {SIZE.x,THICKNESS_BANNER},
+		.position_offset = {0,0},
+		});
+
+	// Top_Left
+	endgame.add_component<Sprite>(
+		Asset("asset/ui/settings_container/top_left_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
+		.size = {THICKNESS_BANNER,THICKNESS_BANNER},
+		.position_offset = {-SIZE.x/2-THICKNESS_BANNER/2,0},
+		});
+
+	// Top_Right
+	endgame.add_component<Sprite>(
+		Asset("asset/ui/settings_container/top_right_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
+		.size = {THICKNESS_BANNER,THICKNESS_BANNER},
+		.position_offset = {SIZE.x/2+THICKNESS_BANNER/2,0},
+		});
+
+	// Top_middle_2
+	endgame.add_component<Sprite>(
+		Asset("asset/ui/settings_container/top_2_middle_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
+		.size = {SIZE.x,THICKNESS_BANNER},
+		.position_offset = {0,THICKNESS_BANNER},
+		});
+
+	// Top_Left_2
+	endgame.add_component<Sprite>(
+		Asset("asset/ui/settings_container/top_2_left_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
+		.size = {THICKNESS_BANNER,THICKNESS_BANNER},
+		.position_offset = {-SIZE.x/2-THICKNESS_BANNER/2,THICKNESS_BANNER},
+		});
+
+	// Top_Right_2
+	endgame.add_component<Sprite>(
+		Asset("asset/ui/settings_container/top_2_right_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
+		.size = {THICKNESS_BANNER,THICKNESS_BANNER},
+		.position_offset = {SIZE.x/2+THICKNESS_BANNER/2,THICKNESS_BANNER},
+		});
+
+	// Top_middle_3
+	endgame.add_component<Sprite>(
+		Asset("asset/ui/settings_container/top_3_middle_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
+		.size = {SIZE.x,THICKNESS_BANNER},
+		.position_offset = {0,THICKNESS_BANNER*2},
+		});
+
+	// Top_Left_3
+	endgame.add_component<Sprite>(
+		Asset("asset/ui/settings_container/top_3_left_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
+		.size = {THICKNESS_BANNER,THICKNESS_BANNER},
+		.position_offset = {-SIZE.x/2-THICKNESS_BANNER/2,THICKNESS_BANNER*2},
+		});
+
+	// Top_Right_3
+	endgame.add_component<Sprite>(
+		Asset("asset/ui/settings_container/top_3_right_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
+		.size = {THICKNESS_BANNER,THICKNESS_BANNER},
+		.position_offset = {SIZE.x/2+THICKNESS_BANNER/2,THICKNESS_BANNER*2},
+		});
+
+	// Middle_Mid
+	endgame.add_component<Sprite>(
+		Asset("asset/ui/settings_container/middle_mid_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+7,
+		.size = {SIZE.x*MIDDLE_OFFSET_FACTOR_OFFSET+MIDDLE_OFFSET_TICKNESS_ADDITION,SIZE.y},
+		.position_offset = {0,THICKNESS_BANNER*3+SIZE.y/2-THICKNESS_BANNER/2},
+		});
+
+	// Middle_Left
+	endgame.add_component<Sprite>(
+		Asset("asset/ui/settings_container/middle_left_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
+		.size = {THICKNESS_BANNER*MIDDLE_OFFSET_FACTOR_TICKNESS,SIZE.y},
+		.position_offset = {-SIZE.x/2-THICKNESS_BANNER/2*MIDDLE_OFFSET_FACTOR_OFFSET-MIDDLE_OFFSET_OFFSET_ADDITION,THICKNESS_BANNER*3+SIZE.y/2-THICKNESS_BANNER/2},
+		});
+
+	// Middle_Right
+	endgame.add_component<Sprite>(
+		Asset("asset/ui/settings_container/middle_right_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
+		.size = {THICKNESS_BANNER*MIDDLE_OFFSET_FACTOR_TICKNESS,SIZE.y},
+		.position_offset = {SIZE.x/2+THICKNESS_BANNER/2*MIDDLE_OFFSET_FACTOR_OFFSET+MIDDLE_OFFSET_OFFSET_ADDITION,THICKNESS_BANNER*3+SIZE.y/2-THICKNESS_BANNER/2},
+		});
+
+	// Bot_Middle
+	endgame.add_component<Sprite>(
+		Asset("asset/ui/settings_container/bot_middle_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+7,
+		.size = {SIZE.x*MIDDLE_OFFSET_FACTOR_OFFSET+MIDDLE_OFFSET_TICKNESS_ADDITION,THICKNESS_BANNER*MIDDLE_OFFSET_FACTOR_TICKNESS},
+		.position_offset = {0,THICKNESS_BANNER*3+SIZE.y-5},
+		});
+
+	// Bot_Left
+	endgame.add_component<Sprite>(
+		Asset("asset/ui/settings_container/bot_left_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
+		.size = {THICKNESS_BANNER*MIDDLE_OFFSET_FACTOR_TICKNESS,THICKNESS_BANNER*MIDDLE_OFFSET_FACTOR_TICKNESS},
+		.position_offset = {-SIZE.x/2-THICKNESS_BANNER/2-BOTTOM_OFFSET_X,THICKNESS_BANNER*3+SIZE.y+BOTTOM_OFFSET_Y},
+		});
+
+	// Bot_Right
+	endgame.add_component<Sprite>(
+		Asset("asset/ui/settings_container/bot_right_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
+		.size = {THICKNESS_BANNER*MIDDLE_OFFSET_FACTOR_TICKNESS,THICKNESS_BANNER*MIDDLE_OFFSET_FACTOR_TICKNESS},
+		.position_offset = {SIZE.x/2+THICKNESS_BANNER/2+BOTTOM_OFFSET_X,THICKNESS_BANNER*3+SIZE.y+BOTTOM_OFFSET_Y},
+		});
+}
+
+
-- 
cgit v1.2.3


From 126c402548281f3a97e3a9e0ef60c45147c87fa0 Mon Sep 17 00:00:00 2001
From: JAROWMR <jarorutjes07@gmail.com>
Date: Mon, 6 Jan 2025 20:52:39 +0100
Subject: endgamesubscene finished

---
 game/CMakeLists.txt                    |   1 +
 game/GameScene.cpp                     |   5 +
 game/coins/CoinSubScene.cpp            |   3 -
 game/coins/CoinSystemScript.cpp        |   6 +-
 game/menus/ButtonSubScene.cpp          |  38 +++++--
 game/menus/ButtonSubScene.h            |   4 +-
 game/menus/FloatingWindowSubScene.cpp  | 178 +++++++++++++++++++++++++++++
 game/menus/FloatingWindowSubScene.h    |  16 +++
 game/menus/MenusConfig.h               |   2 +-
 game/menus/endgame/EndGameSubScene.cpp | 199 ++++++++-------------------------
 game/menus/endgame/EndGameSubScene.h   |   7 +-
 11 files changed, 284 insertions(+), 175 deletions(-)
 create mode 100644 game/menus/FloatingWindowSubScene.cpp
 create mode 100644 game/menus/FloatingWindowSubScene.h

(limited to 'game/menus/endgame/EndGameSubScene.cpp')

diff --git a/game/CMakeLists.txt b/game/CMakeLists.txt
index 4c5bd53..9886973 100644
--- a/game/CMakeLists.txt
+++ b/game/CMakeLists.txt
@@ -27,6 +27,7 @@ add_executable(main
 	menus/IButtonScript.cpp
 	menus/ButtonSetShopScript.cpp
 	menus/ButtonSetMainMenuScript.cpp
+	menus/FloatingWindowSubScene.cpp
 	menus/shop/ShopMenuScene.cpp
 	menus/mainmenu/ButtonTransitionPreviewScript.cpp
 	menus/mainmenu/ITransitionScript.cpp
diff --git a/game/GameScene.cpp b/game/GameScene.cpp
index bd12d50..24b4287 100644
--- a/game/GameScene.cpp
+++ b/game/GameScene.cpp
@@ -10,6 +10,7 @@
 #include "hud/HudScript.h"
 #include "hud/HudSubScene.h"
 #include "hud/SpeedScript.h"
+#include "menus/endgame/EndGameSubScene.h"
 #include "player/PlayerSubScene.h"
 
 #include <cmath>
@@ -133,6 +134,10 @@ void GameScene::load_scene() {
 		.collision_layer = COLL_LAY_MISSILE,
 	});
 	missile.add_component<BoxCollider>(vec2(100, 100));
+
+
+	EndGameSubScene test;
+	test.create(*this);
 }
 
 string GameScene::get_name() const { return "scene1"; }
diff --git a/game/coins/CoinSubScene.cpp b/game/coins/CoinSubScene.cpp
index 604af78..3914921 100644
--- a/game/coins/CoinSubScene.cpp
+++ b/game/coins/CoinSubScene.cpp
@@ -5,8 +5,6 @@
 #include "api/Rigidbody.h"
 #include "api/Scene.h"
 #include "api/AudioSource.h"
-#include <concepts>
-#include <iostream>
 #include "CoinScript.h"
 #include "../Config.h"
 
@@ -18,7 +16,6 @@ int CoinSubScene::create(Scene & scn){
 
 	static int coin_counter = 0;
 	string unique_name = "coin_" + to_string(coin_counter++);
-	cout << "new coin: "<< unique_name << endl;
 
 	GameObject coin = scn.new_object(unique_name.c_str(),"coin",vec2{650,0},0,1);
 	coin.add_component<Rigidbody>(Rigidbody::Data{
diff --git a/game/coins/CoinSystemScript.cpp b/game/coins/CoinSystemScript.cpp
index b77c597..c9c301e 100644
--- a/game/coins/CoinSystemScript.cpp
+++ b/game/coins/CoinSystemScript.cpp
@@ -5,7 +5,6 @@
 #include "api/Sprite.h"
 #include "api/Transform.h"
 #include <random>
-#include "iostream"
 
 using namespace crepe;
 using namespace std;
@@ -239,10 +238,7 @@ void CoinSystemScript::generate_locations(){
 
 	std::uniform_real_distribution<float> space_dist(SPAWN_SPACING_MIN, SPAWN_SPACING_MAX);
 	float spacing = space_dist(engine);
-
-
-	cout << "selected " << selected_index << std::endl;
-	cout << "spacing " << spacing << std::endl;
+	
 	// Call the corresponding function and return the new x position
 	this->system_position += functions[selected_index]({this->system_position,0});
 	this->system_position += spacing;
diff --git a/game/menus/ButtonSubScene.cpp b/game/menus/ButtonSubScene.cpp
index d735d08..8574b9b 100644
--- a/game/menus/ButtonSubScene.cpp
+++ b/game/menus/ButtonSubScene.cpp
@@ -56,7 +56,7 @@ void ButtonSubScene::set_icon(crepe::GameObject & button_object,const Data & dat
 	switch (data.icon_type) {
 		case IconSelect::SHOP:
 			button_object.add_component<Sprite>(Asset("asset/ui/buttonCoinsSmall.png"),Sprite::Data{
-				.sorting_in_layer = STARTING_SORTING_IN_LAYER+3,
+				.sorting_in_layer = STARTING_SORTING_IN_LAYER+3 + data.sorting_layer_offset,
 				.size = ICON_SIZE,
 				.position_offset = data.icon_offset,
 				.world_space = data.worldspace,
@@ -64,7 +64,7 @@ void ButtonSubScene::set_icon(crepe::GameObject & button_object,const Data & dat
 			break;
 		case IconSelect::COINS:
 			button_object.add_component<Sprite>(Asset("asset/ui/buttonCoinsSmall.png"),Sprite::Data{
-				.sorting_in_layer = STARTING_SORTING_IN_LAYER+3,
+				.sorting_in_layer = STARTING_SORTING_IN_LAYER+3 + data.sorting_layer_offset,
 				.size = ICON_SIZE,
 				.position_offset = data.icon_offset,
 				.world_space = data.worldspace,
@@ -81,17 +81,17 @@ void ButtonSubScene::set_button_overlay(crepe::GameObject & button_object,const
 			this->large_btn_overlay(button_object,data);
 			break;
 		case ButtonSelect::BACK:
-			this->small_btn_overlay(button_object,data);
+			this->back_btn_overlay(button_object,data);
 			break;
 		case ButtonSelect::NEXT:
-			this->small_btn_overlay(button_object,data);
+			this->next_btn_overlay(button_object,data);
 			break;
 	}
 }
 
 void ButtonSubScene::large_btn_overlay(crepe::GameObject & button_object,const Data & data){
 	button_object.add_component<Sprite>(Asset("asset/ui/buttonBacking.png"),Sprite::Data{
-		.sorting_in_layer = STARTING_SORTING_IN_LAYER+1,
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+1 + data.sorting_layer_offset,
 		.size = LARGE_OVERLAY_SIZE,
 		.world_space = data.worldspace,
 	});
@@ -100,15 +100,15 @@ void ButtonSubScene::large_btn_overlay(crepe::GameObject & button_object,const D
 	this->btn_color_side(button_object,SIDE_PANEL_OFFSET,data);
 }
 
-void ButtonSubScene::small_btn_overlay(crepe::GameObject & button_object,const Data & data){
+void ButtonSubScene::back_btn_overlay(crepe::GameObject & button_object,const Data & data){
 	button_object.add_component<Sprite>(Asset("asset/ui/backbuttonright.png"),Sprite::Data{
-		.sorting_in_layer = STARTING_SORTING_IN_LAYER+1,
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+1+ data.sorting_layer_offset,
 		.size = SMALL_OVERLAY_SIZE_RIGHT,
 		.position_offset = {20,0},
 		.world_space = data.worldspace,
 	});
 	button_object.add_component<Sprite>(Asset("asset/ui/backbuttonleft.png"),Sprite::Data{
-		.sorting_in_layer = STARTING_SORTING_IN_LAYER+1,
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+1+ data.sorting_layer_offset,
 		.size = SMALL_OVERLAY_SIZE_LEFT,
 		.position_offset = {-80,0},
 		.world_space = data.worldspace,
@@ -116,16 +116,34 @@ void ButtonSubScene::small_btn_overlay(crepe::GameObject & button_object,const D
 	button_object.add_component<Button>(vec2{SMALL_OVERLAY_SIZE_LEFT.x+SMALL_OVERLAY_SIZE_RIGHT.x,SMALL_OVERLAY_SIZE_LEFT.y},Button::Data{});
 }
 
+void ButtonSubScene::next_btn_overlay(crepe::GameObject & button_object,const Data & data){
+	button_object.add_component<Sprite>(Asset("asset/ui/backbuttonright.png"),Sprite::Data{
+		.flip = {true,false},
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+1+ data.sorting_layer_offset,
+		.size = SMALL_OVERLAY_SIZE_RIGHT,
+		.position_offset = {-20,0},
+		.world_space = data.worldspace,
+	});
+	button_object.add_component<Sprite>(Asset("asset/ui/backbuttonleft.png"),Sprite::Data{
+		.flip = {true,false},
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+1+ data.sorting_layer_offset,
+		.size = SMALL_OVERLAY_SIZE_LEFT,
+		.position_offset = {80,0},
+		.world_space = data.worldspace,
+	});
+	button_object.add_component<Button>(vec2{SMALL_OVERLAY_SIZE_LEFT.x+SMALL_OVERLAY_SIZE_RIGHT.x,SMALL_OVERLAY_SIZE_LEFT.y},Button::Data{});
+}
+
 void ButtonSubScene::btn_color_side(crepe::GameObject & button_object,const vec2 & offset,const Data & data){
 	button_object.add_component<Sprite>(Asset("asset/ui/buttonSmallBlue.png"),Sprite::Data{
-		.sorting_in_layer = STARTING_SORTING_IN_LAYER+2,
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER + 2 + data.sorting_layer_offset,
 		.size = SIDE_PANEL_SIZE,
 		.position_offset = offset,
 		.world_space = data.worldspace,
 	});
 	button_object.add_component<Sprite>(Asset("asset/ui/buttonSmallBlue.png"),Sprite::Data{
 		.flip = {true,false},
-		.sorting_in_layer = STARTING_SORTING_IN_LAYER+2,
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+2 + data.sorting_layer_offset,
 		.size = SIDE_PANEL_SIZE,
 		.position_offset = {-offset.x,offset.y},
 		.world_space = data.worldspace,
diff --git a/game/menus/ButtonSubScene.h b/game/menus/ButtonSubScene.h
index 6781d19..28daed2 100644
--- a/game/menus/ButtonSubScene.h
+++ b/game/menus/ButtonSubScene.h
@@ -43,12 +43,14 @@ public:
 		const bool worldspace = true;
 		const bool color_side = true;
 		const std::string & tag = "";
+		const int sorting_layer_offset = 0;
 	};
 public:
 	void create(crepe::Scene & scn,const Data & data);
 private:
 	void large_btn_overlay(crepe::GameObject & button_object,const Data & data);
-	void small_btn_overlay(crepe::GameObject & button_object,const Data & data);
+	void back_btn_overlay(crepe::GameObject & button_object,const Data & data);
+	void next_btn_overlay(crepe::GameObject & button_object,const Data & data);
 	void btn_color_side(crepe::GameObject & button_object,const crepe::vec2 & offset,const Data & data);
 	void btn_text(crepe::GameObject & button_object,const Data & data);
 	void set_script(crepe::GameObject & button_object,const Data & data);
diff --git a/game/menus/FloatingWindowSubScene.cpp b/game/menus/FloatingWindowSubScene.cpp
new file mode 100644
index 0000000..16963bb
--- /dev/null
+++ b/game/menus/FloatingWindowSubScene.cpp
@@ -0,0 +1,178 @@
+
+#include "FloatingWindowSubScene.h"
+#include "MenusConfig.h"
+#include "types.h"
+
+#include <crepe/api/GameObject.h>
+#include <crepe/api/Scene.h>
+#include <crepe/api/Sprite.h>
+#include <crepe/api/Camera.h>
+
+using namespace crepe;
+using namespace std;
+
+void FloatingWindowSubScene::create(Scene & scn,const Data & data){
+	const vec2 SIZE = {data.width,data.width*0.75f};
+	const vec2 POSITION_CORRECTION = vec2{0,-SIZE.y/2} + data.offset;
+	const float THICKNESS_BANNER = 34;
+	const float MIDDLE_OFFSET_FACTOR_TICKNESS = 0.83;
+	const float MIDDLE_OFFSET_FACTOR_OFFSET = 1.2;
+	const float MIDDLE_OFFSET_FACTOR_MIDDLE_WIDTH = 0.86;
+	const float MIDDLE_OFFSET_OFFSET_ADDITION = -0.5;
+	const float BOTTOM_OFFSET_X = 3;
+	const float BOTTOM_OFFSET_Y = -3;
+
+	GameObject floatingwindow = scn.new_object("FloatingWindow",data.group_tag);
+
+	// Top_middle
+	floatingwindow.add_component<Sprite>(
+		Asset("asset/ui/settings_container/top_middle_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
+		.size = {SIZE.x,THICKNESS_BANNER},
+		.position_offset = POSITION_CORRECTION + vec2{0,0},
+		.world_space = false,
+		});
+
+	// Top_Left
+	floatingwindow.add_component<Sprite>(
+		Asset("asset/ui/settings_container/top_left_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
+		.size = {THICKNESS_BANNER,THICKNESS_BANNER},
+		.position_offset = POSITION_CORRECTION + vec2{-SIZE.x/2-THICKNESS_BANNER/2,0},
+		.world_space = false,
+		});
+
+	// Top_Right
+	floatingwindow.add_component<Sprite>(
+		Asset("asset/ui/settings_container/top_right_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
+		.size = {THICKNESS_BANNER,THICKNESS_BANNER},
+		.position_offset = POSITION_CORRECTION + vec2{SIZE.x/2+THICKNESS_BANNER/2,0},
+		.world_space = false,
+		});
+
+	// Top_middle_2
+	floatingwindow.add_component<Sprite>(
+		Asset("asset/ui/settings_container/top_2_middle_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
+		.size = {SIZE.x,THICKNESS_BANNER},
+		.position_offset = POSITION_CORRECTION + vec2{0,THICKNESS_BANNER},
+		.world_space = false,
+		});
+
+	// Top_Left_2
+	floatingwindow.add_component<Sprite>(
+		Asset("asset/ui/settings_container/top_2_left_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
+		.size = {THICKNESS_BANNER,THICKNESS_BANNER},
+		.position_offset = POSITION_CORRECTION + vec2{-SIZE.x/2-THICKNESS_BANNER/2,THICKNESS_BANNER},
+		.world_space = false,
+		});
+
+	// Top_Right_2
+	floatingwindow.add_component<Sprite>(
+		Asset("asset/ui/settings_container/top_2_right_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
+		.size = {THICKNESS_BANNER,THICKNESS_BANNER},
+		.position_offset = POSITION_CORRECTION + vec2{SIZE.x/2+THICKNESS_BANNER/2,THICKNESS_BANNER},
+		.world_space = false,
+		});
+
+	// Top_middle_3
+	floatingwindow.add_component<Sprite>(
+		Asset("asset/ui/settings_container/top_3_middle_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
+		.size = {SIZE.x,THICKNESS_BANNER},
+		.position_offset = POSITION_CORRECTION + vec2{0,THICKNESS_BANNER*2},
+		.world_space = false,
+		});
+
+	// Top_Left_3
+	floatingwindow.add_component<Sprite>(
+		Asset("asset/ui/settings_container/top_3_left_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
+		.size = {THICKNESS_BANNER,THICKNESS_BANNER},
+		.position_offset = POSITION_CORRECTION + vec2{-SIZE.x/2-THICKNESS_BANNER/2,THICKNESS_BANNER*2},
+		.world_space = false,
+		});
+
+	// Top_Right_3
+	floatingwindow.add_component<Sprite>(
+		Asset("asset/ui/settings_container/top_3_right_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
+		.size = {THICKNESS_BANNER,THICKNESS_BANNER},
+		.position_offset = POSITION_CORRECTION + vec2{SIZE.x/2+THICKNESS_BANNER/2,THICKNESS_BANNER*2},
+		.world_space = false,
+		});
+
+	// Middle_Mid
+	floatingwindow.add_component<Sprite>(
+		Asset("asset/ui/settings_container/middle_mid_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+7,
+		.size = {SIZE.x*MIDDLE_OFFSET_FACTOR_OFFSET*MIDDLE_OFFSET_FACTOR_MIDDLE_WIDTH+data.width_middle_offset,SIZE.y},
+		.position_offset = POSITION_CORRECTION + vec2{0,THICKNESS_BANNER*3+SIZE.y/2-THICKNESS_BANNER/2},
+		.world_space = false,
+		});
+
+	// Middle_Left
+	floatingwindow.add_component<Sprite>(
+		Asset("asset/ui/settings_container/middle_left_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
+		.size = {THICKNESS_BANNER*MIDDLE_OFFSET_FACTOR_TICKNESS,SIZE.y},
+		.position_offset = POSITION_CORRECTION + vec2{-SIZE.x/2-THICKNESS_BANNER/2*MIDDLE_OFFSET_FACTOR_OFFSET-MIDDLE_OFFSET_OFFSET_ADDITION,THICKNESS_BANNER*3+SIZE.y/2-THICKNESS_BANNER/2},
+		.world_space = false,
+		});
+
+	// Middle_Right
+	floatingwindow.add_component<Sprite>(
+		Asset("asset/ui/settings_container/middle_right_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
+		.size = {THICKNESS_BANNER*MIDDLE_OFFSET_FACTOR_TICKNESS,SIZE.y},
+		.position_offset = POSITION_CORRECTION + vec2{SIZE.x/2+THICKNESS_BANNER/2*MIDDLE_OFFSET_FACTOR_OFFSET+MIDDLE_OFFSET_OFFSET_ADDITION,THICKNESS_BANNER*3+SIZE.y/2-THICKNESS_BANNER/2},
+		.world_space = false,
+		});
+
+	// Bot_Middle
+	floatingwindow.add_component<Sprite>(
+		Asset("asset/ui/settings_container/bot_middle_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+7,
+		.size = {SIZE.x*MIDDLE_OFFSET_FACTOR_OFFSET*MIDDLE_OFFSET_FACTOR_MIDDLE_WIDTH+data.width_middle_offset,THICKNESS_BANNER*MIDDLE_OFFSET_FACTOR_TICKNESS},
+		.position_offset = POSITION_CORRECTION + vec2{0,THICKNESS_BANNER*3+SIZE.y+BOTTOM_OFFSET_Y},
+		.world_space = false,
+		});
+
+	// Bot_Left
+	floatingwindow.add_component<Sprite>(
+		Asset("asset/ui/settings_container/bot_left_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
+		.size = {THICKNESS_BANNER*MIDDLE_OFFSET_FACTOR_TICKNESS,THICKNESS_BANNER*MIDDLE_OFFSET_FACTOR_TICKNESS},
+		.position_offset = POSITION_CORRECTION + vec2{-SIZE.x/2-THICKNESS_BANNER/2-BOTTOM_OFFSET_X,THICKNESS_BANNER*3+SIZE.y+BOTTOM_OFFSET_Y},
+		.world_space = false,
+		});
+
+	// Bot_Right
+	floatingwindow.add_component<Sprite>(
+		Asset("asset/ui/settings_container/bot_right_setting.png"),
+		Sprite::Data{
+		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
+		.size = {THICKNESS_BANNER*MIDDLE_OFFSET_FACTOR_TICKNESS,THICKNESS_BANNER*MIDDLE_OFFSET_FACTOR_TICKNESS},
+		.position_offset = POSITION_CORRECTION + vec2{SIZE.x/2+THICKNESS_BANNER/2+BOTTOM_OFFSET_X,THICKNESS_BANNER*3+SIZE.y+BOTTOM_OFFSET_Y},
+		.world_space = false,
+		});
+}
+
+
diff --git a/game/menus/FloatingWindowSubScene.h b/game/menus/FloatingWindowSubScene.h
new file mode 100644
index 0000000..a0bd854
--- /dev/null
+++ b/game/menus/FloatingWindowSubScene.h
@@ -0,0 +1,16 @@
+#pragma once
+
+#include "types.h"
+#include <crepe/api/Scene.h>
+
+class FloatingWindowSubScene  {
+public:
+	struct Data{
+		const std::string group_tag = "";
+		float width = 200;
+		crepe::vec2 offset = {0,0};
+		float width_middle_offset = 0;
+	};
+public:
+	void create(crepe::Scene & scn,const Data & data);
+};
diff --git a/game/menus/MenusConfig.h b/game/menus/MenusConfig.h
index ffcbc34..9e0c99b 100644
--- a/game/menus/MenusConfig.h
+++ b/game/menus/MenusConfig.h
@@ -2,7 +2,7 @@
 #include <crepe/types.h>
 
 //generic menu config
-static constexpr unsigned int STARTING_SORTING_IN_LAYER = 7;
+static constexpr int STARTING_SORTING_IN_LAYER = 7;
 static constexpr const char* CAMERA_NAME = "camera";
 //Scene names
 static constexpr const char* START_SCENE = "scene1";
diff --git a/game/menus/endgame/EndGameSubScene.cpp b/game/menus/endgame/EndGameSubScene.cpp
index 029bf1c..8d785ed 100644
--- a/game/menus/endgame/EndGameSubScene.cpp
+++ b/game/menus/endgame/EndGameSubScene.cpp
@@ -1,163 +1,62 @@
 
 #include "EndGameSubScene.h"
-
-#include "../MenusConfig.h"
+#include "../FloatingWindowSubScene.h"
+#include "../ButtonSubScene.h"
+#include <crepe/api/Text.h>
+#include <string>
+#include <crepe/api/GameObject.h>
+#include "types.h"
 #include "../../Config.h"
-#include "api/GameObject.h"
-#include "api/Scene.h"
-#include "api/Sprite.h"
-
-#include <crepe/api/Camera.h>
 
 using namespace crepe;
 using namespace std;
 
 void EndGameSubScene::create(Scene & scn){
-	const vec2 SIZE = {200,100};
-	const float THICKNESS_BANNER = 34;
-	const float MIDDLE_OFFSET_FACTOR_TICKNESS = 0.83;
-	const float MIDDLE_OFFSET_FACTOR_OFFSET = 1.2;
-	const float MIDDLE_OFFSET_TICKNESS_ADDITION = -8;
-	const float MIDDLE_OFFSET_OFFSET_ADDITION = -0.5;
-	const float BOTTOM_OFFSET_X = 3;
-	const float BOTTOM_OFFSET_Y = -5;
-
-	GameObject endgame = scn.new_object("EndGameSubScene");
-
-	// Top_middle
-	endgame.add_component<Sprite>(
-		Asset("asset/ui/settings_container/top_middle_setting.png"),
-		Sprite::Data{
-		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
-		.size = {SIZE.x,THICKNESS_BANNER},
-		.position_offset = {0,0},
-		});
-
-	// Top_Left
-	endgame.add_component<Sprite>(
-		Asset("asset/ui/settings_container/top_left_setting.png"),
-		Sprite::Data{
-		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
-		.size = {THICKNESS_BANNER,THICKNESS_BANNER},
-		.position_offset = {-SIZE.x/2-THICKNESS_BANNER/2,0},
-		});
-
-	// Top_Right
-	endgame.add_component<Sprite>(
-		Asset("asset/ui/settings_container/top_right_setting.png"),
-		Sprite::Data{
-		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
-		.size = {THICKNESS_BANNER,THICKNESS_BANNER},
-		.position_offset = {SIZE.x/2+THICKNESS_BANNER/2,0},
-		});
-
-	// Top_middle_2
-	endgame.add_component<Sprite>(
-		Asset("asset/ui/settings_container/top_2_middle_setting.png"),
-		Sprite::Data{
-		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
-		.size = {SIZE.x,THICKNESS_BANNER},
-		.position_offset = {0,THICKNESS_BANNER},
-		});
-
-	// Top_Left_2
-	endgame.add_component<Sprite>(
-		Asset("asset/ui/settings_container/top_2_left_setting.png"),
-		Sprite::Data{
-		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
-		.size = {THICKNESS_BANNER,THICKNESS_BANNER},
-		.position_offset = {-SIZE.x/2-THICKNESS_BANNER/2,THICKNESS_BANNER},
-		});
-
-	// Top_Right_2
-	endgame.add_component<Sprite>(
-		Asset("asset/ui/settings_container/top_2_right_setting.png"),
-		Sprite::Data{
-		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
-		.size = {THICKNESS_BANNER,THICKNESS_BANNER},
-		.position_offset = {SIZE.x/2+THICKNESS_BANNER/2,THICKNESS_BANNER},
-		});
-
-	// Top_middle_3
-	endgame.add_component<Sprite>(
-		Asset("asset/ui/settings_container/top_3_middle_setting.png"),
-		Sprite::Data{
-		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
-		.size = {SIZE.x,THICKNESS_BANNER},
-		.position_offset = {0,THICKNESS_BANNER*2},
-		});
-
-	// Top_Left_3
-	endgame.add_component<Sprite>(
-		Asset("asset/ui/settings_container/top_3_left_setting.png"),
-		Sprite::Data{
-		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
-		.size = {THICKNESS_BANNER,THICKNESS_BANNER},
-		.position_offset = {-SIZE.x/2-THICKNESS_BANNER/2,THICKNESS_BANNER*2},
-		});
-
-	// Top_Right_3
-	endgame.add_component<Sprite>(
-		Asset("asset/ui/settings_container/top_3_right_setting.png"),
-		Sprite::Data{
-		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
-		.size = {THICKNESS_BANNER,THICKNESS_BANNER},
-		.position_offset = {SIZE.x/2+THICKNESS_BANNER/2,THICKNESS_BANNER*2},
-		});
-
-	// Middle_Mid
-	endgame.add_component<Sprite>(
-		Asset("asset/ui/settings_container/middle_mid_setting.png"),
-		Sprite::Data{
-		.sorting_in_layer = STARTING_SORTING_IN_LAYER+7,
-		.size = {SIZE.x*MIDDLE_OFFSET_FACTOR_OFFSET+MIDDLE_OFFSET_TICKNESS_ADDITION,SIZE.y},
-		.position_offset = {0,THICKNESS_BANNER*3+SIZE.y/2-THICKNESS_BANNER/2},
-		});
-
-	// Middle_Left
-	endgame.add_component<Sprite>(
-		Asset("asset/ui/settings_container/middle_left_setting.png"),
-		Sprite::Data{
-		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
-		.size = {THICKNESS_BANNER*MIDDLE_OFFSET_FACTOR_TICKNESS,SIZE.y},
-		.position_offset = {-SIZE.x/2-THICKNESS_BANNER/2*MIDDLE_OFFSET_FACTOR_OFFSET-MIDDLE_OFFSET_OFFSET_ADDITION,THICKNESS_BANNER*3+SIZE.y/2-THICKNESS_BANNER/2},
-		});
-
-	// Middle_Right
-	endgame.add_component<Sprite>(
-		Asset("asset/ui/settings_container/middle_right_setting.png"),
-		Sprite::Data{
-		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
-		.size = {THICKNESS_BANNER*MIDDLE_OFFSET_FACTOR_TICKNESS,SIZE.y},
-		.position_offset = {SIZE.x/2+THICKNESS_BANNER/2*MIDDLE_OFFSET_FACTOR_OFFSET+MIDDLE_OFFSET_OFFSET_ADDITION,THICKNESS_BANNER*3+SIZE.y/2-THICKNESS_BANNER/2},
-		});
-
-	// Bot_Middle
-	endgame.add_component<Sprite>(
-		Asset("asset/ui/settings_container/bot_middle_setting.png"),
-		Sprite::Data{
-		.sorting_in_layer = STARTING_SORTING_IN_LAYER+7,
-		.size = {SIZE.x*MIDDLE_OFFSET_FACTOR_OFFSET+MIDDLE_OFFSET_TICKNESS_ADDITION,THICKNESS_BANNER*MIDDLE_OFFSET_FACTOR_TICKNESS},
-		.position_offset = {0,THICKNESS_BANNER*3+SIZE.y-5},
-		});
 
-	// Bot_Left
-	endgame.add_component<Sprite>(
-		Asset("asset/ui/settings_container/bot_left_setting.png"),
-		Sprite::Data{
-		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
-		.size = {THICKNESS_BANNER*MIDDLE_OFFSET_FACTOR_TICKNESS,THICKNESS_BANNER*MIDDLE_OFFSET_FACTOR_TICKNESS},
-		.position_offset = {-SIZE.x/2-THICKNESS_BANNER/2-BOTTOM_OFFSET_X,THICKNESS_BANNER*3+SIZE.y+BOTTOM_OFFSET_Y},
-		});
+	// Window
+	FloatingWindowSubScene window;
+	window.create(scn, FloatingWindowSubScene::Data{
+		.group_tag = "end_game_window",
+		.width = 500,
+		.offset = {0,-50},
+		.width_middle_offset = -2,
+	});
+
+	// Titel
+	const string TITEL_STRING = "GAME OVER";
+	GameObject titel = scn.new_object("titel");
+	crepe::vec2 size = {200,(200.0f/TITEL_STRING.size())*2};
+	titel.add_component<Text>(size, FONT,Text::Data{
+		.world_space = false,
+		.text_color = Color::WHITE,
+	}, vec2{0,-207}+FONTOFFSET, TITEL_STRING);
+
+
+	// Buttons
+	vec2 button_position = {190,190};
+	ButtonSubScene button;
+	button.create(scn,ButtonSubScene::Data{
+		.text = "NEXT",
+		.text_width = 100,
+		.position = button_position,
+		.script_type = ButtonSubScene::ScriptSelect::MAINMENU,
+		.button_type = ButtonSubScene::ButtonSelect::NEXT,
+		.scale = 0.6,
+		.worldspace = false,
+		.sorting_layer_offset = 20,
+	});
+
+	button.create(scn,ButtonSubScene::Data{
+		.text = "REPLAY",
+		.text_width = 150,
+		.position = {-button_position.x,button_position.y},
+		.script_type = ButtonSubScene::ScriptSelect::MAINMENU,
+		.button_type = ButtonSubScene::ButtonSelect::BACK,
+		.scale = 0.6,
+		.worldspace = false,
+		.sorting_layer_offset = 20,
+	});
 
-	// Bot_Right
-	endgame.add_component<Sprite>(
-		Asset("asset/ui/settings_container/bot_right_setting.png"),
-		Sprite::Data{
-		.sorting_in_layer = STARTING_SORTING_IN_LAYER+8,
-		.size = {THICKNESS_BANNER*MIDDLE_OFFSET_FACTOR_TICKNESS,THICKNESS_BANNER*MIDDLE_OFFSET_FACTOR_TICKNESS},
-		.position_offset = {SIZE.x/2+THICKNESS_BANNER/2+BOTTOM_OFFSET_X,THICKNESS_BANNER*3+SIZE.y+BOTTOM_OFFSET_Y},
-		});
 }
 
 
diff --git a/game/menus/endgame/EndGameSubScene.h b/game/menus/endgame/EndGameSubScene.h
index 5c727a7..aa60a49 100644
--- a/game/menus/endgame/EndGameSubScene.h
+++ b/game/menus/endgame/EndGameSubScene.h
@@ -1,12 +1,9 @@
 #pragma once
 
-#include "Component.h"
-#include <string>
-
 #include <crepe/api/Scene.h>
-#include <vector>
 
 class EndGameSubScene  {
+
 public:
-	void create(crepe::Scene & scn);	
+	void create(crepe::Scene & scn);
 };
-- 
cgit v1.2.3


From fcae8934916c9f429e58c8e178ab14fcf65a2bbc Mon Sep 17 00:00:00 2001
From: JAROWMR <jarorutjes07@gmail.com>
Date: Tue, 7 Jan 2025 11:20:58 +0100
Subject: added end game

---
 game/CMakeLists.txt                     |  2 ++
 game/Events.h                           |  5 ++++
 game/GameScene.cpp                      |  6 ++--
 game/menus/IFloatingWindowScript.cpp    | 23 +++++++++++++++
 game/menus/IFloatingWindowScript.h      | 15 ++++++++++
 game/menus/endgame/EndGameSubScene.cpp  | 14 +++++++--
 game/menus/endgame/EndGameSubScript.cpp | 51 +++++++++++++++++++++++++++++++++
 game/menus/endgame/EndGameSubScript.h   | 16 +++++++++++
 game/menus/mainmenu/MainMenuScene.cpp   |  3 --
 game/player/PlayerEndScript.cpp         |  5 ++++
 10 files changed, 131 insertions(+), 9 deletions(-)
 create mode 100644 game/Events.h
 create mode 100644 game/menus/IFloatingWindowScript.cpp
 create mode 100644 game/menus/IFloatingWindowScript.h
 create mode 100644 game/menus/endgame/EndGameSubScript.cpp
 create mode 100644 game/menus/endgame/EndGameSubScript.h

(limited to 'game/menus/endgame/EndGameSubScene.cpp')

diff --git a/game/CMakeLists.txt b/game/CMakeLists.txt
index 9886973..fffe6d3 100644
--- a/game/CMakeLists.txt
+++ b/game/CMakeLists.txt
@@ -28,12 +28,14 @@ add_executable(main
 	menus/ButtonSetShopScript.cpp
 	menus/ButtonSetMainMenuScript.cpp
 	menus/FloatingWindowSubScene.cpp
+	menus/IFloatingWindowScript.cpp
 	menus/shop/ShopMenuScene.cpp
 	menus/mainmenu/ButtonTransitionPreviewScript.cpp
 	menus/mainmenu/ITransitionScript.cpp
 	menus/mainmenu/MainMenuScene.cpp
 	menus/mainmenu/TransitionStartScript.cpp
 	menus/endgame/EndGameSubScene.cpp
+	menus/endgame/EndGameSubScript.cpp
 	coins/CoinSubScene.cpp
 	coins/CoinPool.cpp
 	coins/CoinSystemScript.cpp
diff --git a/game/Events.h b/game/Events.h
new file mode 100644
index 0000000..cf0be68
--- /dev/null
+++ b/game/Events.h
@@ -0,0 +1,5 @@
+#pragma once
+
+#include "api/Event.h"
+
+struct EndGameEvent : public crepe::Event {};
diff --git a/game/GameScene.cpp b/game/GameScene.cpp
index 24b4287..a1f3fa6 100644
--- a/game/GameScene.cpp
+++ b/game/GameScene.cpp
@@ -11,6 +11,7 @@
 #include "hud/HudSubScene.h"
 #include "hud/SpeedScript.h"
 #include "menus/endgame/EndGameSubScene.h"
+#include "menus/endgame/EndGameSubScript.h"
 #include "player/PlayerSubScene.h"
 
 #include <cmath>
@@ -135,9 +136,8 @@ void GameScene::load_scene() {
 	});
 	missile.add_component<BoxCollider>(vec2(100, 100));
 
-
-	EndGameSubScene test;
-	test.create(*this);
+	EndGameSubScene endgamewindow;
+	endgamewindow.create(*this);
 }
 
 string GameScene::get_name() const { return "scene1"; }
diff --git a/game/menus/IFloatingWindowScript.cpp b/game/menus/IFloatingWindowScript.cpp
new file mode 100644
index 0000000..ce84de7
--- /dev/null
+++ b/game/menus/IFloatingWindowScript.cpp
@@ -0,0 +1,23 @@
+#include "IFloatingWindowScript.h"
+#include "api/Sprite.h"
+#include "types.h"
+
+using namespace crepe;
+
+void IFloatingWindowScript::init(){
+ this->disable_all_sprites();
+}
+
+void IFloatingWindowScript::disable_all_sprites(){
+	RefVector<Sprite> sprites = this->get_components_by_tag<Sprite>(this->tag);
+	for(Sprite & sprite : sprites){
+		sprite.active = false;
+	}
+}
+
+void IFloatingWindowScript::enable_all_sprites(){
+	RefVector<Sprite> sprites = this->get_components_by_tag<Sprite>(this->tag);
+	for(Sprite & sprite : sprites){
+		sprite.active = true;
+	}
+}
diff --git a/game/menus/IFloatingWindowScript.h b/game/menus/IFloatingWindowScript.h
new file mode 100644
index 0000000..9775726
--- /dev/null
+++ b/game/menus/IFloatingWindowScript.h
@@ -0,0 +1,15 @@
+#pragma once
+
+#include <crepe/api/Script.h>
+#include <string>
+
+class IFloatingWindowScript : public virtual crepe::Script {
+public:
+	virtual void init();
+	void disable_all_sprites();
+	void enable_all_sprites();
+protected:
+	std::string tag = "";
+};
+
+
diff --git a/game/menus/endgame/EndGameSubScene.cpp b/game/menus/endgame/EndGameSubScene.cpp
index 8d785ed..41556af 100644
--- a/game/menus/endgame/EndGameSubScene.cpp
+++ b/game/menus/endgame/EndGameSubScene.cpp
@@ -5,6 +5,8 @@
 #include <crepe/api/Text.h>
 #include <string>
 #include <crepe/api/GameObject.h>
+#include <crepe/api/BehaviorScript.h>
+#include "EndGameSubScript.h"
 #include "types.h"
 #include "../../Config.h"
 
@@ -13,10 +15,14 @@ using namespace std;
 
 void EndGameSubScene::create(Scene & scn){
 
+	const std::string TAG = "end_game_tag";
+	GameObject script = scn.new_object("script");
+	script.add_component<BehaviorScript>().set_script<EndGameSubScript>(TAG);
+
 	// Window
 	FloatingWindowSubScene window;
 	window.create(scn, FloatingWindowSubScene::Data{
-		.group_tag = "end_game_window",
+		.group_tag = TAG,
 		.width = 500,
 		.offset = {0,-50},
 		.width_middle_offset = -2,
@@ -24,7 +30,7 @@ void EndGameSubScene::create(Scene & scn){
 
 	// Titel
 	const string TITEL_STRING = "GAME OVER";
-	GameObject titel = scn.new_object("titel");
+	GameObject titel = scn.new_object("titel",TAG);
 	crepe::vec2 size = {200,(200.0f/TITEL_STRING.size())*2};
 	titel.add_component<Text>(size, FONT,Text::Data{
 		.world_space = false,
@@ -43,6 +49,7 @@ void EndGameSubScene::create(Scene & scn){
 		.button_type = ButtonSubScene::ButtonSelect::NEXT,
 		.scale = 0.6,
 		.worldspace = false,
+		.tag = TAG,
 		.sorting_layer_offset = 20,
 	});
 
@@ -50,10 +57,11 @@ void EndGameSubScene::create(Scene & scn){
 		.text = "REPLAY",
 		.text_width = 150,
 		.position = {-button_position.x,button_position.y},
-		.script_type = ButtonSubScene::ScriptSelect::MAINMENU,
+		// .script_type = ButtonSubScene::ScriptSelect::MAINMENU,
 		.button_type = ButtonSubScene::ButtonSelect::BACK,
 		.scale = 0.6,
 		.worldspace = false,
+		.tag = TAG,
 		.sorting_layer_offset = 20,
 	});
 
diff --git a/game/menus/endgame/EndGameSubScript.cpp b/game/menus/endgame/EndGameSubScript.cpp
new file mode 100644
index 0000000..2be6931
--- /dev/null
+++ b/game/menus/endgame/EndGameSubScript.cpp
@@ -0,0 +1,51 @@
+#include "EndGameSubScript.h"
+#include "../IFloatingWindowScript.h"
+#include "api/Button.h"
+#include "api/Sprite.h"
+#include "api/Text.h"
+#include "types.h"
+#include "../../Events.h"
+#include <string>
+
+using namespace crepe;
+
+EndGameSubScript::EndGameSubScript(const std::string & tag){
+	this->tag = tag;
+}
+
+void EndGameSubScript::init(){
+	this->disable_all();
+	this->subscribe<EndGameEvent>([this](const EndGameEvent e) { return this->enable_all(); });
+	this->subscribe<EndGameEvent>([this](const EndGameEvent e) { return this->reset_timescale(); });
+}
+
+bool EndGameSubScript::disable_all(){
+	IFloatingWindowScript::disable_all_sprites();
+	RefVector<Button> buttons = this->get_components_by_tag<Button>(this->tag);
+	for(Button & button : buttons){
+		button.active = false;
+	}
+	RefVector<Text> texts = this->get_components_by_tag<Text>(this->tag);
+	for(Text & text : texts){
+		text.active = false;
+	}
+	return false;
+}
+
+bool EndGameSubScript::enable_all(){
+	IFloatingWindowScript::enable_all_sprites();
+	RefVector<Button> buttons = this->get_components_by_tag<Button>(this->tag);
+	for(Button & button : buttons){
+		button.active = true;
+	}
+	RefVector<Text> texts = this->get_components_by_tag<Text>(this->tag);
+	for(Text & text : texts){
+		text.active = true;
+	}
+	return false;
+}
+
+bool EndGameSubScript::reset_timescale(){
+	this->get_loop_timer().set_time_scale(1);
+	return false;
+}
diff --git a/game/menus/endgame/EndGameSubScript.h b/game/menus/endgame/EndGameSubScript.h
new file mode 100644
index 0000000..2ce3ec7
--- /dev/null
+++ b/game/menus/endgame/EndGameSubScript.h
@@ -0,0 +1,16 @@
+#pragma once
+
+#include "../IFloatingWindowScript.h"
+#include "api/Event.h"
+#include <crepe/api/Script.h>
+
+class EndGameSubScript : public IFloatingWindowScript {
+public:
+	EndGameSubScript(const std::string & tag);
+ 	void init() override;
+	bool disable_all();
+	bool enable_all();
+	bool reset_timescale();
+};
+
+
diff --git a/game/menus/mainmenu/MainMenuScene.cpp b/game/menus/mainmenu/MainMenuScene.cpp
index a515b45..15cf6d5 100644
--- a/game/menus/mainmenu/MainMenuScene.cpp
+++ b/game/menus/mainmenu/MainMenuScene.cpp
@@ -98,9 +98,6 @@ void MainMenuScene::load_scene(){
 		.color_side = false,
 		.tag = MENU_INFO_TAG,
 	});
-	
-	EndGameSubScene test;
-	test.create(*this);
 
 }
 
diff --git a/game/player/PlayerEndScript.cpp b/game/player/PlayerEndScript.cpp
index e04fb9d..1554c84 100644
--- a/game/player/PlayerEndScript.cpp
+++ b/game/player/PlayerEndScript.cpp
@@ -1,6 +1,7 @@
 #include "PlayerEndScript.h"
 
 #include "../Config.h"
+#include "../Events.h"
 #include "manager/LoopTimerManager.h"
 
 #include <crepe/api/Animator.h>
@@ -89,6 +90,10 @@ bool PlayerEndScript::on_collision(const crepe::CollisionEvent & ev) {
 			jump++;
 		}
 
+		if(rb_player.data.linear_velocity.x < 5){
+			this->trigger_event<EndGameEvent>();
+		}
+
 		return true;
 	}
 
-- 
cgit v1.2.3