diff --git a/Source/vampires/Widgets/MainMenuWidget.cpp b/Source/vampires/Widgets/MainMenuWidget.cpp new file mode 100644 index 0000000..c7aaa30 --- /dev/null +++ b/Source/vampires/Widgets/MainMenuWidget.cpp @@ -0,0 +1,67 @@ +// Louis Hobbs | 2024-2025 + + +#include "MainMenuWidget.h" + +#include "Blueprint/WidgetBlueprintLibrary.h" +#include "Components/Button.h" +#include "Kismet/GameplayStatics.h" + +void UMainMenuWidget::NativeConstruct() +{ + Super::NativeConstruct(); + + if (NewGameButton) + { + NewGameButton->OnClicked.AddUniqueDynamic(this, &UMainMenuWidget::NewGameButtonOnClicked); + NewGameButton->OnClicked.AddUniqueDynamic(this, &UMainMenuWidget::PlayClickedSound); + + NewGameButton->OnHovered.AddUniqueDynamic(this, &UMainMenuWidget::PlayHoveredSound); + NewGameButton->OnHovered.AddUniqueDynamic(this, &UMainMenuWidget::NewGameTextBlockHoveredDelegate); + + NewGameButton->OnUnhovered.AddUniqueDynamic(this, &UMainMenuWidget::NewGameTextBlockUnhoveredDelegate); + NewGameButton->OnUnhovered.AddUniqueDynamic(this, &UMainMenuWidget::PlayUnhoveredSound); + } + + if (QuitButton) + { + QuitButton->OnClicked.AddUniqueDynamic(this, &UMainMenuWidget::QuitButtonOnClicked); + QuitButton->OnClicked.AddUniqueDynamic(this, &UMainMenuWidget::PlayClickedSound); + + QuitButton->OnHovered.AddUniqueDynamic(this, &UMainMenuWidget::PlayHoveredSound); + QuitButton->OnHovered.AddUniqueDynamic(this, &UMainMenuWidget::QuitTextBlockHoveredDelegate); + + QuitButton->OnUnhovered.AddUniqueDynamic(this, &UMainMenuWidget::QuitTextBlockUnhoveredDelegate); + QuitButton->OnUnhovered.AddUniqueDynamic(this, &UMainMenuWidget::PlayUnhoveredSound); + } + + if (APlayerController* PlayerController = UGameplayStatics::GetPlayerController(GetWorld(), 0)) + { + UWidgetBlueprintLibrary::SetInputMode_UIOnlyEx(PlayerController, this, EMouseLockMode::LockAlways); + PlayerController->bShowMouseCursor = true; + } +} + +void UMainMenuWidget::NewGameButtonOnClicked() +{ + if (!NewGameLevel.IsNull()) + { + UGameplayStatics::OpenLevelBySoftObjectPtr(GetWorld(), NewGameLevel); + } + + if (APlayerController* PlayerController = UGameplayStatics::GetPlayerController(GetWorld(), 0)) + { + PlayerController->bShowMouseCursor = false; + UWidgetBlueprintLibrary::SetInputMode_GameOnly(PlayerController); + } + + SetIsFocusable(false); +} + +void UMainMenuWidget::QuitButtonOnClicked() +{ + // TODO: Add platform specific Exit requests + // This is not a bit deal for the moment as we are only building for windows + // For some reason the generic version does not work the same as FWindowsPlatformMisc + FWindowsPlatformMisc::RequestExit(false); +} diff --git a/Source/vampires/Widgets/MainMenuWidget.h b/Source/vampires/Widgets/MainMenuWidget.h new file mode 100644 index 0000000..e2050f8 --- /dev/null +++ b/Source/vampires/Widgets/MainMenuWidget.h @@ -0,0 +1,64 @@ +// Louis Hobbs | 2024-2025 + +#pragma once + +#include "CoreMinimal.h" +#include "VampireInteractiveWidget.h" +#include "MainMenuWidget.generated.h" + +class UButton; +/** + * + */ +UCLASS() +class VAMPIRES_API UMainMenuWidget : public UVampireInteractiveWidget +{ + GENERATED_BODY() + + // TODO: Add options menu + +public: + UPROPERTY(BlueprintReadWrite, meta = (BindWidget)) + TObjectPtr NewGameButton; + + UPROPERTY(BlueprintReadWrite, meta = (BindWidget)) + TObjectPtr NewGameTextBlock; + + UPROPERTY(BlueprintReadWrite, meta = (BindWidget)) + TObjectPtr QuitButton; + + UPROPERTY(BlueprintReadWrite, meta = (BindWidget)) + TObjectPtr QuitTextBlock; + + UPROPERTY(EditDefaultsOnly, BlueprintReadWrite) + TSubclassOf NewGameMenuWidget; + + UPROPERTY(EditDefaultsOnly, BlueprintReadWrite) + TSoftObjectPtr NewGameLevel; + +private: + UPROPERTY() + TObjectPtr currentNewGameWidget; + +public: + virtual void NativeConstruct() override; + +private: + UFUNCTION() + void NewGameButtonOnClicked(); + + UFUNCTION() + void QuitButtonOnClicked(); + + UFUNCTION() + void NewGameTextBlockHoveredDelegate() { SetTextBlockHovered(NewGameTextBlock); } + + UFUNCTION() + void NewGameTextBlockUnhoveredDelegate() { SetTextBlockUnhovered(NewGameTextBlock); } + + UFUNCTION() + void QuitTextBlockHoveredDelegate() { SetTextBlockHovered(QuitTextBlock); } + + UFUNCTION() + void QuitTextBlockUnhoveredDelegate() { SetTextBlockUnhovered(QuitTextBlock); } +};