diff --git a/godot/Main.tscn b/godot/Main.tscn index 5babece..de0bf8a 100644 --- a/godot/Main.tscn +++ b/godot/Main.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=4 format=2] +[gd_scene load_steps=5 format=2] [ext_resource path="res://Main.gdns" type="Script" id=1] [ext_resource path="res://levels/Prototype.tscn" type="PackedScene" id=2] -[ext_resource path="res://GUI/GameOver.tscn" type="PackedScene" id=3] +[ext_resource path="res://gui/GameOver.tscn" type="PackedScene" id=3] +[ext_resource path="res://gui/GameWon.tscn" type="PackedScene" id=4] [node name="Main" type="Node"] pause_mode = 2 @@ -14,3 +15,6 @@ pause_mode = 1 [node name="GameOver" parent="." instance=ExtResource( 3 )] visible = false + +[node name="GameWon" parent="." instance=ExtResource( 4 )] +visible = false diff --git a/godot/gui/GameOver.tscn b/godot/gui/GameOver.tscn new file mode 100644 index 0000000..bff3216 --- /dev/null +++ b/godot/gui/GameOver.tscn @@ -0,0 +1,48 @@ +[gd_scene load_steps=7 format=2] + +[ext_resource path="res://assets/fonts/ttf/PixelOperator8.ttf" type="DynamicFontData" id=1] +[ext_resource path="res://assets/fonts/ttf/PixelOperatorHB8.ttf" type="DynamicFontData" id=2] +[ext_resource path="res://gui/GameOverScreen.gdns" type="Script" id=3] + +[sub_resource type="DynamicFont" id=1] +size = 50 +font_data = ExtResource( 1 ) + +[sub_resource type="DynamicFont" id=2] +font_data = ExtResource( 2 ) + +[sub_resource type="StyleBoxFlat" id=3] +bg_color = Color( 0.0705882, 0.917647, 0, 1 ) + +[node name="GameOver" type="CanvasLayer"] +script = ExtResource( 3 ) + +[node name="Control" type="Control" parent="."] +margin_right = 40.0 +margin_bottom = 40.0 + +[node name="ColorRect" type="ColorRect" parent="Control"] +margin_right = 512.0 +margin_bottom = 288.0 +rect_min_size = Vector2( 512, 288 ) +color = Color( 0, 0, 0, 1 ) + +[node name="Label" type="Label" parent="Control"] +margin_left = 66.0 +margin_top = 17.0 +margin_right = 456.0 +margin_bottom = 71.0 +custom_fonts/font = SubResource( 1 ) +text = "GAME OVER" +align = 1 + +[node name="RestartButton" type="Button" parent="Control"] +margin_left = 194.0 +margin_top = 150.0 +margin_right = 338.0 +margin_bottom = 180.0 +custom_fonts/font = SubResource( 2 ) +custom_styles/hover = SubResource( 3 ) +text = "REINICIAR" + +[connection signal="pressed" from="Control/RestartButton" to="." method="_on_restart_button_pressed"] diff --git a/godot/gui/GameOverScreen.gdns b/godot/gui/GameOverScreen.gdns new file mode 100644 index 0000000..750e9bf --- /dev/null +++ b/godot/gui/GameOverScreen.gdns @@ -0,0 +1,8 @@ +[gd_resource type="NativeScript" load_steps=2 format=2] + +[ext_resource path="res://gdnative/alai.tres" type="GDNativeLibrary" id=1] + +[resource] +resource_name = "GameOverScreen" +class_name = "GameOverScreen" +library = ExtResource( 1 ) diff --git a/godot/gui/GameWon.tscn b/godot/gui/GameWon.tscn new file mode 100644 index 0000000..49889fc --- /dev/null +++ b/godot/gui/GameWon.tscn @@ -0,0 +1,48 @@ +[gd_scene load_steps=7 format=2] + +[ext_resource path="res://assets/fonts/ttf/PixelOperator8.ttf" type="DynamicFontData" id=1] +[ext_resource path="res://assets/fonts/ttf/PixelOperatorHB8.ttf" type="DynamicFontData" id=2] +[ext_resource path="res://gui/GameWonScreen.gdns" type="Script" id=3] + +[sub_resource type="DynamicFont" id=1] +size = 50 +font_data = ExtResource( 1 ) + +[sub_resource type="DynamicFont" id=2] +font_data = ExtResource( 2 ) + +[sub_resource type="StyleBoxFlat" id=3] +bg_color = Color( 0.0705882, 0.917647, 0, 1 ) + +[node name="GameWon" type="CanvasLayer"] +script = ExtResource( 3 ) + +[node name="Control" type="Control" parent="."] +margin_right = 40.0 +margin_bottom = 40.0 + +[node name="ColorRect" type="ColorRect" parent="Control"] +margin_right = 512.0 +margin_bottom = 288.0 +rect_min_size = Vector2( 512, 288 ) +color = Color( 0, 0, 0, 1 ) + +[node name="Label" type="Label" parent="Control"] +margin_left = 66.0 +margin_top = 17.0 +margin_right = 456.0 +margin_bottom = 71.0 +custom_fonts/font = SubResource( 1 ) +text = "GANASTE!" +align = 1 + +[node name="QuitButton" type="Button" parent="Control"] +margin_left = 194.0 +margin_top = 150.0 +margin_right = 338.0 +margin_bottom = 180.0 +custom_fonts/font = SubResource( 2 ) +custom_styles/hover = SubResource( 3 ) +text = "SALIR" + +[connection signal="pressed" from="Control/QuitButton" to="." method="_on_quit_button_pressed"] diff --git a/godot/gui/GameWonScreen.gdns b/godot/gui/GameWonScreen.gdns new file mode 100644 index 0000000..1d6223b --- /dev/null +++ b/godot/gui/GameWonScreen.gdns @@ -0,0 +1,8 @@ +[gd_resource type="NativeScript" load_steps=2 format=2] + +[ext_resource path="res://gdnative/alai.tres" type="GDNativeLibrary" id=1] + +[resource] +resource_name = "GameWonScreen" +class_name = "GameWonScreen" +library = ExtResource( 1 ) diff --git a/src/CameraLimit.cpp b/src/CameraLimit.cpp index cdc4add..e981127 100644 --- a/src/CameraLimit.cpp +++ b/src/CameraLimit.cpp @@ -7,7 +7,7 @@ void alai::CameraLimit::_register_methods() { - register_method("_ready", &CameraLimit::_ready); + godot::register_method("_ready", &CameraLimit::_ready); } alai::CameraLimit::CameraLimit() diff --git a/src/Event.cpp b/src/Event.cpp index 6561979..e457ae7 100644 --- a/src/Event.cpp +++ b/src/Event.cpp @@ -7,7 +7,7 @@ void alai::Event::_register_methods() godot::register_signal("object_removed", "name", GODOT_VARIANT_TYPE_STRING); godot::register_signal("coin_collected", "amount", GODOT_VARIANT_TYPE_INT); godot::register_signal("player_died"); - + godot::register_signal("player_won"); } alai::Event::Event() diff --git a/src/coin/CoinCollected.cpp b/src/coin/CoinCollected.cpp index 5c30b82..cc6155e 100644 --- a/src/coin/CoinCollected.cpp +++ b/src/coin/CoinCollected.cpp @@ -6,9 +6,9 @@ void alai::CoinCollected::_register_methods() { - register_method("_state_enter", &CoinCollected::_state_enter); - register_method("_state_exit", &CoinCollected::_state_exit); - register_method("_on_animation_finished", &CoinCollected::_on_animation_finished); + godot::register_method("_state_enter", &CoinCollected::_state_enter); + godot::register_method("_state_exit", &CoinCollected::_state_exit); + godot::register_method("_on_animation_finished", &CoinCollected::_on_animation_finished); } alai::CoinCollected::CoinCollected() @@ -37,7 +37,6 @@ void alai::CoinCollected::_state_enter() void alai::CoinCollected::_state_exit() { - } void alai::CoinCollected::_on_animation_finished(godot::String anim_name) diff --git a/src/coin/CoinCounter.cpp b/src/coin/CoinCounter.cpp index 667ea9e..c0f5cbe 100644 --- a/src/coin/CoinCounter.cpp +++ b/src/coin/CoinCounter.cpp @@ -6,8 +6,8 @@ void alai::CoinCounter::_register_methods() { - register_method("_on_coin_collected", &CoinCounter::_on_coin_collected); - register_method("_ready", &CoinCounter::_ready); + godot::register_method("_on_coin_collected", &CoinCounter::_on_coin_collected); + godot::register_method("_ready", &CoinCounter::_ready); } alai::CoinCounter::CoinCounter() diff --git a/src/coin/CoinNotCollected.cpp b/src/coin/CoinNotCollected.cpp index c03aa0b..b1c84ee 100644 --- a/src/coin/CoinNotCollected.cpp +++ b/src/coin/CoinNotCollected.cpp @@ -4,9 +4,9 @@ void alai::CoinNotCollected::_register_methods() { - register_method("_state_enter", &CoinNotCollected::_state_enter); - register_method("_state_exit", &CoinNotCollected::_state_exit); - register_method("_on_body_entered", &CoinNotCollected::_on_body_entered); + godot::register_method("_state_enter", &CoinNotCollected::_state_enter); + godot::register_method("_state_exit", &CoinNotCollected::_state_exit); + godot::register_method("_on_body_entered", &CoinNotCollected::_on_body_entered); } alai::CoinNotCollected::CoinNotCollected() diff --git a/src/goal/GoalNotReached.cpp b/src/goal/GoalNotReached.cpp index 08d55f3..8fbec1f 100644 --- a/src/goal/GoalNotReached.cpp +++ b/src/goal/GoalNotReached.cpp @@ -4,9 +4,9 @@ void alai::GoalNotReached::_register_methods() { - register_method("_state_enter", &GoalNotReached::_state_enter); - register_method("_state_exit", &GoalNotReached::_state_exit); - register_method("_on_Goal_body_entered", &GoalNotReached::_on_Goal_body_entered); + godot::register_method("_state_enter", &GoalNotReached::_state_enter); + godot::register_method("_state_exit", &GoalNotReached::_state_exit); + godot::register_method("_on_Goal_body_entered", &GoalNotReached::_on_Goal_body_entered); } alai::GoalNotReached::GoalNotReached() diff --git a/src/goal/GoalReached.cpp b/src/goal/GoalReached.cpp index 06f882c..6afb5f0 100644 --- a/src/goal/GoalReached.cpp +++ b/src/goal/GoalReached.cpp @@ -1,11 +1,13 @@ #include "goal/GoalReached.h" +#include "Event.h" + #include void alai::GoalReached::_register_methods() { - register_method("_state_enter", &GoalReached::_state_enter); - register_method("_state_exit", &GoalReached::_state_exit); + godot::register_method("_state_enter", &GoalReached::_state_enter); + godot::register_method("_state_exit", &GoalReached::_state_exit); } alai::GoalReached::GoalReached() @@ -22,7 +24,8 @@ void alai::GoalReached::_init() void alai::GoalReached::_state_enter() { - godot::Godot::print("Flag touched"); + auto event = get_node("/root/Event"); + event->emit_signal("player_won"); } void alai::GoalReached::_state_exit() diff --git a/src/godot.cpp b/src/godot.cpp index bb724e7..5793fee 100644 --- a/src/godot.cpp +++ b/src/godot.cpp @@ -16,6 +16,7 @@ #include "goal/GoalReached.h" #include "goal/GoalNotReached.h" #include "gui/game_over/GameOverScreen.h" +#include "gui/game_won/GameWonScreen.h" /** * @brief This function connects the gdnative init function. @@ -62,4 +63,5 @@ extern "C" void GDN_EXPORT godot_nativescript_init(void *handle) godot::register_class(); godot::register_class(); godot::register_class(); + godot::register_class(); } diff --git a/src/gui/game_over/GameOverScreen.cpp b/src/gui/game_over/GameOverScreen.cpp index fc35153..f6f604f 100644 --- a/src/gui/game_over/GameOverScreen.cpp +++ b/src/gui/game_over/GameOverScreen.cpp @@ -1,7 +1,6 @@ #include "gui/game_over/GameOverScreen.h" #include "Event.h" -#include #include #include #include @@ -10,10 +9,10 @@ void alai::GameOverScreen::_register_methods() { - register_method("_on_restart_button_pressed", &GameOverScreen::_on_restart_button_pressed); - register_method("_ready", &GameOverScreen::_ready); - register_method("connect_signal", &GameOverScreen::connect_signal); - register_method("_on_player_died", &GameOverScreen::_on_player_died); + godot::register_method("_on_restart_button_pressed", &GameOverScreen::_on_restart_button_pressed); + godot::register_method("_ready", &GameOverScreen::_ready); + godot::register_method("connect_signal", &GameOverScreen::connect_signal); + godot::register_method("_on_player_died", &GameOverScreen::_on_player_died); } alai::GameOverScreen::GameOverScreen() diff --git a/src/gui/game_over/GameOverScreen.h b/src/gui/game_over/GameOverScreen.h index 892a316..cb79374 100644 --- a/src/gui/game_over/GameOverScreen.h +++ b/src/gui/game_over/GameOverScreen.h @@ -1,5 +1,5 @@ -#ifndef ALAI_GAME_OVER_SCREEN_H -#define ALAI_GAME_OVER_SCREEN_H +#ifndef ALAI_GAME_OVER_GAME_OVER_SCREEN_H +#define ALAI_GAME_OVER_GAME_OVER_SCREEN_H #include #include diff --git a/src/gui/game_won/GameWonScreen.cpp b/src/gui/game_won/GameWonScreen.cpp new file mode 100644 index 0000000..d57f950 --- /dev/null +++ b/src/gui/game_won/GameWonScreen.cpp @@ -0,0 +1,65 @@ +#include "gui/game_won/GameWonScreen.h" +#include "Event.h" + +#include +#include + +void alai::GameWonScreen::_register_methods() +{ + godot::register_method("_ready", &GameWonScreen::_ready); + godot::register_method("connect_signal", &GameWonScreen::connect_signal); + godot::register_method("_on_player_won", &GameWonScreen::_on_player_won); + godot::register_method("_on_quit_button_pressed", &GameWonScreen::_on_quit_button_pressed); +} + +alai::GameWonScreen::GameWonScreen() +{ +} + +alai::GameWonScreen::~GameWonScreen() +{ +} + +void alai::GameWonScreen::_init() +{ +} + +void alai::GameWonScreen::_ready() +{ + connect_signal(); +} + +void alai::GameWonScreen::_on_quit_button_pressed() +{ + get_tree()->quit(); +} + +void alai::GameWonScreen::_on_player_won() +{ + auto event = get_node("/root/Event"); + event->disconnect("player_won", this, "_on_player_won"); + set_visible(true); + auto level_node = get_tree()->get_root()->get_node("Main")->find_node("Level"); + if (level_node != nullptr) + { + auto child = level_node->get_child(0); + if (child != nullptr) + { + child->queue_free(); + } + else + { + WARN_PRINT("Child not found!"); + } + } + else + { + WARN_PRINT("Node level not found!"); + } +} + +void alai::GameWonScreen::connect_signal() +{ + auto event = get_node("/root/Event"); + event->connect("player_won", this, "_on_player_won"); +} diff --git a/src/gui/game_won/GameWonScreen.h b/src/gui/game_won/GameWonScreen.h new file mode 100644 index 0000000..987b7a1 --- /dev/null +++ b/src/gui/game_won/GameWonScreen.h @@ -0,0 +1,51 @@ +#ifndef ALAI_GAME_WON_GAME_WON_SCREEN_H +#define ALAI_GAME_WON_GAME_WON_SCREEN_H + +#include +#include + +namespace alai +{ + /** + * @brief This class controls what happens when the game is won. + * + */ + class GameWonScreen : public godot::CanvasLayer + { + GODOT_CLASS(GameWonScreen, godot::CanvasLayer) + + public: + /** + * @brief This method registers classes with Godot. + * + * @details This method registers methods, properties, and signals with the Godot engine. + */ + static void _register_methods(); + + /** + * @brief Construct a new GameWonScreen object. + * + */ + GameWonScreen(); + + /** + * @brief Destroy the GameWonScreen object. + * + */ + ~GameWonScreen(); + + /** + * @brief Initialize the class from Godot. + * + * @details This method is called just once when the Godot engine connects to the instance of the class. + */ + void _init(); + + void _ready(); + void _on_player_won(); + void _on_quit_button_pressed(); + void connect_signal(); + }; +} + +#endif diff --git a/src/player/states/PlayerFall.cpp b/src/player/states/PlayerFall.cpp index cd6775e..adc9671 100644 --- a/src/player/states/PlayerFall.cpp +++ b/src/player/states/PlayerFall.cpp @@ -4,9 +4,9 @@ void alai::player::PlayerFall::_register_methods() { - register_method("_state_enter", &PlayerFall::_state_enter); - register_method("_state_exit", &PlayerFall::_state_exit); - register_method("_physics_process", &PlayerFall::_physics_process); + godot::register_method("_state_enter", &PlayerFall::_state_enter); + godot::register_method("_state_exit", &PlayerFall::_state_exit); + godot::register_method("_physics_process", &PlayerFall::_physics_process); } alai::player::PlayerFall::PlayerFall() diff --git a/src/player/states/PlayerIdle.cpp b/src/player/states/PlayerIdle.cpp index bc8a5ed..1043f52 100644 --- a/src/player/states/PlayerIdle.cpp +++ b/src/player/states/PlayerIdle.cpp @@ -4,9 +4,9 @@ void alai::player::PlayerIdle::_register_methods() { - register_method("_state_enter", &PlayerIdle::_state_enter); - register_method("_state_exit", &PlayerIdle::_state_exit); - register_method("_physics_process", &PlayerIdle::_physics_process); + godot::register_method("_state_enter", &PlayerIdle::_state_enter); + godot::register_method("_state_exit", &PlayerIdle::_state_exit); + godot::register_method("_physics_process", &PlayerIdle::_physics_process); } alai::player::PlayerIdle::PlayerIdle() diff --git a/src/player/states/PlayerJump.cpp b/src/player/states/PlayerJump.cpp index 28e5e24..b5417ac 100644 --- a/src/player/states/PlayerJump.cpp +++ b/src/player/states/PlayerJump.cpp @@ -6,9 +6,9 @@ void alai::player::PlayerJump::_register_methods() { - register_method("_state_enter", &PlayerJump::_state_enter); - register_method("_state_exit", &PlayerJump::_state_exit); - register_method("_physics_process", &PlayerJump::_physics_process); + godot::register_method("_state_enter", &PlayerJump::_state_enter); + godot::register_method("_state_exit", &PlayerJump::_state_exit); + godot::register_method("_physics_process", &PlayerJump::_physics_process); } alai::player::PlayerJump::PlayerJump() diff --git a/src/player/states/PlayerMove.cpp b/src/player/states/PlayerMove.cpp index 720ce91..23014db 100644 --- a/src/player/states/PlayerMove.cpp +++ b/src/player/states/PlayerMove.cpp @@ -4,9 +4,9 @@ void alai::player::PlayerMove::_register_methods() { - register_method("_state_enter", &PlayerMove::_state_enter); - register_method("_state_exit", &PlayerMove::_state_exit); - register_method("_physics_process", &PlayerMove::_physics_process); + godot::register_method("_state_enter", &PlayerMove::_state_enter); + godot::register_method("_state_exit", &PlayerMove::_state_exit); + godot::register_method("_physics_process", &PlayerMove::_physics_process); } alai::player::PlayerMove::PlayerMove() diff --git a/src/state_machine/State.cpp b/src/state_machine/State.cpp index 1c66968..eff2576 100644 --- a/src/state_machine/State.cpp +++ b/src/state_machine/State.cpp @@ -2,11 +2,11 @@ void alai::State::_register_methods() { - register_method("set_parent", &State::set_parent); - register_method("get_parent", &State::get_parent); - register_method("set_state_machine", &State::set_state_machine); - register_method("_state_enter", &State::_state_enter); - register_method("_state_exit", &State::_state_exit); + godot::register_method("set_parent", &State::set_parent); + godot::register_method("get_parent", &State::get_parent); + godot::register_method("set_state_machine", &State::set_state_machine); + godot::register_method("_state_enter", &State::_state_enter); + godot::register_method("_state_exit", &State::_state_exit); } alai::State::State()