From 6d79b0427755b0e5ffb6765c2fd67d5a05916328 Mon Sep 17 00:00:00 2001 From: nico-dev Date: Sat, 10 Feb 2024 15:11:08 +0100 Subject: [PATCH] :sparkles: added visibility manager --- .../Helpers/VisibilityManager.cs | 148 ++++++++++++++ PenaltyMaster3000/PenaltyMaster3000.csproj | 1 + PenaltyMaster3000/View/MainView.xaml | 2 +- PenaltyMaster3000/ViewModel/MainVM.cs | 185 ++++++++---------- 4 files changed, 232 insertions(+), 104 deletions(-) create mode 100644 PenaltyMaster3000/Helpers/VisibilityManager.cs diff --git a/PenaltyMaster3000/Helpers/VisibilityManager.cs b/PenaltyMaster3000/Helpers/VisibilityManager.cs new file mode 100644 index 0000000..cd5dbb2 --- /dev/null +++ b/PenaltyMaster3000/Helpers/VisibilityManager.cs @@ -0,0 +1,148 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; + +namespace PenaltyMaster3000.Helpers +{ + // [TODO] Change 'Goal' to 'Keeper' to avoid confusion. + + /// + /// Manages the visibility of the goal's four corners + middle zone. + /// + public class VisibilityManager : ObservableObject + { + // Top right + private Visibility ballTopRightVisibility; + public Visibility BallTopRightVisibility + { + get => ballTopRightVisibility; + set => SetProperty(ref ballTopRightVisibility, value); + } + + private Visibility goalTopRightVisibility; + public Visibility GoalTopRightVisibility + { + get => goalTopRightVisibility; + set => SetProperty(ref goalTopRightVisibility, value); + } + + // Top Left + private Visibility ballTopLeftVisibility; + public Visibility BallTopLeftVisibility + { + get => ballTopLeftVisibility; + set => SetProperty(ref ballTopLeftVisibility, value); + } + + private Visibility goalTopLeftVisibility; + public Visibility GoalTopLeftVisibility + { + get => goalTopLeftVisibility; + set => SetProperty(ref goalTopLeftVisibility, value); + } + // --- + + // Middle + private Visibility ballTopMiddleVisibility; + public Visibility BallTopMiddleVisibility + { + get => ballTopMiddleVisibility; + set => SetProperty(ref ballTopMiddleVisibility, value); + } + + private Visibility goalTopMiddleVisibility; + public Visibility GoalTopMiddleVisibility + { + get => goalTopMiddleVisibility; + set => SetProperty(ref goalTopMiddleVisibility, value); + } + + // Down middle + private Visibility ballDownMiddleVisibility; + public Visibility BallDownMiddleVisibility + { + get => ballDownMiddleVisibility; + set => SetProperty(ref ballDownMiddleVisibility, value); + } + + private Visibility goalDownMiddleVisibility; + public Visibility GoalDownMiddleVisibility + { + get => goalDownMiddleVisibility; + set => SetProperty(ref goalDownMiddleVisibility, value); + } + // --- + + // Down right + private Visibility ballDownRightVisibility; + public Visibility BallDownRightVisibility + { + get => ballDownRightVisibility; + set => SetProperty(ref ballDownRightVisibility, value); + } + + private Visibility goalDownRightVisibility; + public Visibility GoalDownRightVisibility + { + get => goalDownRightVisibility; + set => SetProperty(ref goalDownRightVisibility, value); + } + + // Down left + private Visibility ballDownLeftVisibility; + public Visibility BallDownLeftVisibility + { + get => ballDownLeftVisibility; + set => SetProperty(ref ballDownLeftVisibility, value); + } + + private Visibility goalDownLeftVisibility; + public Visibility GoalDownLeftVisibility + { + get => goalDownLeftVisibility; + set => SetProperty(ref goalDownLeftVisibility, value); + } + /// --- + + + /// Starting ball and GoalKeeper + private Visibility starterBall; + public Visibility StarterBall + { + get => starterBall; + set => SetProperty(ref starterBall, value); + } + + private Visibility starterGoal; + public Visibility StarterGoal + { + get => starterGoal; + set => SetProperty(ref starterGoal, value); + } + + public void GameStartedVisibility() + { + // Starter attributes visible + StarterBall = Visibility.Visible; + StarterGoal = Visibility.Visible; + + // Rest should be hidden + BallTopRightVisibility = Visibility.Hidden; + GoalTopRightVisibility = Visibility.Hidden; + BallTopMiddleVisibility = Visibility.Hidden; + GoalTopMiddleVisibility = Visibility.Hidden; + BallTopLeftVisibility = Visibility.Hidden; + GoalTopLeftVisibility = Visibility.Hidden; + BallDownRightVisibility = Visibility.Hidden; + GoalDownRightVisibility = Visibility.Hidden; + BallDownMiddleVisibility = Visibility.Hidden; + GoalDownMiddleVisibility = Visibility.Hidden; + BallDownLeftVisibility = Visibility.Hidden; + GoalDownLeftVisibility = Visibility.Hidden; + } + } +} diff --git a/PenaltyMaster3000/PenaltyMaster3000.csproj b/PenaltyMaster3000/PenaltyMaster3000.csproj index 00867e1..8659834 100644 --- a/PenaltyMaster3000/PenaltyMaster3000.csproj +++ b/PenaltyMaster3000/PenaltyMaster3000.csproj @@ -87,6 +87,7 @@ App.xaml Code + diff --git a/PenaltyMaster3000/View/MainView.xaml b/PenaltyMaster3000/View/MainView.xaml index b15650c..4475a07 100644 --- a/PenaltyMaster3000/View/MainView.xaml +++ b/PenaltyMaster3000/View/MainView.xaml @@ -157,7 +157,7 @@ Grid.Column="0" Background="Red" FontWeight="Bold" - FontSize="100" + FontSize="20" VerticalAlignment="Center" HorizontalAlignment="Center" Visibility="{Binding ActionTextVisibility}"/> diff --git a/PenaltyMaster3000/ViewModel/MainVM.cs b/PenaltyMaster3000/ViewModel/MainVM.cs index f25556c..af270dc 100644 --- a/PenaltyMaster3000/ViewModel/MainVM.cs +++ b/PenaltyMaster3000/ViewModel/MainVM.cs @@ -2,6 +2,7 @@ using CommunityToolkit.Mvvm.Input; using KinectUtils; using MyGestureBank; +using PenaltyMaster3000.Helpers; using System; using System.Collections.Generic; using System.Linq; @@ -42,36 +43,46 @@ namespace PenaltyMaster3000.ViewModel private int numberOfShoots = 0; - public string ActionText { get; private set; } - - public Visibility ActionTextVisibility { get; private set; } - - public Visibility WhistleImageVisibility { get; private set; } - - public Visibility ScoreBoardVisibility { get; private set; } + private string actionText; + public string ActionText + { + get => actionText; + set => SetProperty(ref actionText, value); + } - public Visibility FinalResultVisibility { get; private set; } + private Visibility actionTextVisibility; + public Visibility ActionTextVisibility + { + get => actionTextVisibility; + set => SetProperty(ref actionTextVisibility, value); + } - public Visibility BallStartingVisibility { get; private set; } - public Visibility GoalStartingVisibility { get; private set; } + private Visibility whistleImageVisibility; + public Visibility WhistleImageVisibility + { + get => whistleImageVisibility; + set => SetProperty(ref whistleImageVisibility, value); + } - public Visibility BallTopRightVisibility { get; private set; } - public Visibility GoalTopRightVisibility { get; private set; } + private Visibility scoreBoardVisibility; + public Visibility ScoreBoardVisibility + { + get => scoreBoardVisibility; + set => SetProperty(ref scoreBoardVisibility, value); + } - public Visibility BallTopMiddleVisibility { get; private set; } - public Visibility GoalTopMiddleVisibility { get; private set; } - - public Visibility BallTopLeftVisibility { get; private set; } - public Visibility GoalTopLeftVisibility { get; private set; } - - public Visibility BallDownRightVisibility { get; private set; } - public Visibility GoalDownRightVisibility { get; private set; } + private Visibility finalResultVisibility; + public Visibility FinalResultVisibility + { + get => finalResultVisibility; + set => SetProperty(ref finalResultVisibility, value); + } - public Visibility BallDownMiddleVisibility { get; private set; } - public Visibility GoalDownMiddleVisibility { get; private set; } + /// + /// The goal's visibility manager. + /// + public VisibilityManager VsMgr; - public Visibility BallDownLeftVisibility { get; private set; } - public Visibility GoalDownLeftVisibility { get; private set; } public string Player1ScoreText { get; private set; } @@ -166,9 +177,13 @@ namespace PenaltyMaster3000.ViewModel OnPropertyChanged(nameof(CurrentImageSource)); } + /// + /// Hides the action text when it expires. + /// + /// + /// private void RefereeTimer_Tick(object sender, EventArgs e) { - // Rendre le texte invisible lorsque le timer expire ActionTextVisibility = Visibility.Hidden; WhistleImageVisibility = Visibility.Hidden; OnPropertyChanged(nameof(ActionTextVisibility)); @@ -188,29 +203,27 @@ namespace PenaltyMaster3000.ViewModel scoreBoardTimer.Stop(); } - private void Shoot() + private async void Shoot() { StartupVisibility(); - displayTextOnScreen(2, "Get Ready to Shoot !"); // Après que le timer a expiré, marquez le tir comme terminé IsShootCompleted = true; OnPropertyChanged(nameof(IsShootCompleted)); - // Liste des propriétés de visibilité des éléments Goal List goalVisibilities = new List { - GoalTopRightVisibility, GoalTopMiddleVisibility, GoalTopLeftVisibility, - GoalDownRightVisibility, GoalDownMiddleVisibility, GoalDownLeftVisibility + VsMgr.GoalTopRightVisibility, VsMgr.GoalTopMiddleVisibility, VsMgr.GoalTopLeftVisibility, + VsMgr.GoalDownRightVisibility, VsMgr.GoalDownMiddleVisibility, VsMgr.GoalDownLeftVisibility }; // Générez un index aléatoire pour choisir l'élément Goal à rendre visible //int randomIndex = random.Next(goalVisibilities.Count); // Let the player choose a angle to shoot - displayTextOnScreen(2, "Choose an angle to shoot."); - + await DisplayActionText("Shooter's Turn. Get ready !", 3); + await DisplayActionText("Choose an angle to shoot.", 5); // Définissez la visibilité de l'élément Goal choisi sur Visible //goalVisibilities[randomIndex] = Visibility.Visible; @@ -220,20 +233,12 @@ namespace PenaltyMaster3000.ViewModel OnPropertyChanged(nameof(BallStartingVisibility)); OnPropertyChanged(nameof(GoalStartingVisibility)); - GoalTopRightVisibility = goalVisibilities[0]; - GoalTopMiddleVisibility = goalVisibilities[1]; - GoalTopLeftVisibility = goalVisibilities[2]; - GoalDownRightVisibility = goalVisibilities[3]; - GoalDownMiddleVisibility = goalVisibilities[4]; - GoalDownLeftVisibility = goalVisibilities[5]; - - // A DEPLACER POUR APRES - OnPropertyChanged(nameof(GoalTopRightVisibility)); - OnPropertyChanged(nameof(GoalTopMiddleVisibility)); - OnPropertyChanged(nameof(GoalTopLeftVisibility)); - OnPropertyChanged(nameof(GoalDownRightVisibility)); - OnPropertyChanged(nameof(GoalDownMiddleVisibility)); - OnPropertyChanged(nameof(GoalDownLeftVisibility)); + VsMgr.GoalTopRightVisibility = goalVisibilities[0]; + VsMgr.GoalTopMiddleVisibility = goalVisibilities[1]; + VsMgr.GoalTopLeftVisibility = goalVisibilities[2]; + VsMgr.GoalDownRightVisibility = goalVisibilities[3]; + VsMgr.GoalDownMiddleVisibility = goalVisibilities[4]; + VsMgr.GoalDownLeftVisibility = goalVisibilities[5]; IsShootCompleted = false; OnPropertyChanged(nameof(IsShootCompleted)); @@ -272,8 +277,8 @@ namespace PenaltyMaster3000.ViewModel // Liste des propriétés de visibilité des éléments Ball [TEMPORAIRE !] List ballVisibilities = new List { - BallTopRightVisibility, BallTopMiddleVisibility, BallTopLeftVisibility, - BallDownRightVisibility, BallDownMiddleVisibility, BallDownLeftVisibility + VsMgr.BallTopRightVisibility, VsMgr.BallTopMiddleVisibility, VsMgr.BallTopLeftVisibility, + VsMgr.BallDownRightVisibility, VsMgr.BallDownMiddleVisibility, VsMgr.BallDownLeftVisibility }; // Générez un index aléatoire pour choisir l'élément Goal à rendre visible @@ -287,19 +292,12 @@ namespace PenaltyMaster3000.ViewModel OnPropertyChanged(nameof(BallStartingVisibility)); OnPropertyChanged(nameof(GoalStartingVisibility)); - BallTopRightVisibility = ballVisibilities[0]; - BallTopMiddleVisibility = ballVisibilities[1]; - BallTopLeftVisibility = ballVisibilities[2]; - BallDownRightVisibility = ballVisibilities[3]; - BallDownMiddleVisibility = ballVisibilities[4]; - BallDownLeftVisibility = ballVisibilities[5]; - - OnPropertyChanged(nameof(BallTopRightVisibility)); - OnPropertyChanged(nameof(BallTopMiddleVisibility)); - OnPropertyChanged(nameof(BallTopLeftVisibility)); - OnPropertyChanged(nameof(BallDownRightVisibility)); - OnPropertyChanged(nameof(BallDownMiddleVisibility)); - OnPropertyChanged(nameof(BallDownLeftVisibility)); + VsMgr.BallTopRightVisibility = ballVisibilities[0]; + VsMgr.BallTopMiddleVisibility = ballVisibilities[1]; + VsMgr.BallTopLeftVisibility = ballVisibilities[2]; + VsMgr.BallDownRightVisibility = ballVisibilities[3]; + VsMgr.BallDownMiddleVisibility = ballVisibilities[4]; + VsMgr.BallDownLeftVisibility = ballVisibilities[5]; IsSaveCompleted = false; OnPropertyChanged(nameof(IsSaveCompleted)); @@ -307,12 +305,12 @@ namespace PenaltyMaster3000.ViewModel private void Result() { - bool isBallAndGoalVisible = AreElementsVisible(BallTopRightVisibility, GoalTopRightVisibility) || - AreElementsVisible(BallTopMiddleVisibility, GoalTopMiddleVisibility) || - AreElementsVisible(BallTopLeftVisibility, GoalTopLeftVisibility) || - AreElementsVisible(BallDownRightVisibility, GoalDownRightVisibility) || - AreElementsVisible(BallDownMiddleVisibility, GoalDownMiddleVisibility) || - AreElementsVisible(BallDownLeftVisibility, GoalDownLeftVisibility); + bool isBallAndGoalVisible = AreElementsVisible(VsMgr.BallTopRightVisibility, VsMgr.GoalTopRightVisibility) || + AreElementsVisible(VsMgr.BallTopMiddleVisibility, VsMgr.GoalTopMiddleVisibility) || + AreElementsVisible(VsMgr.BallTopLeftVisibility, VsMgr.GoalTopLeftVisibility) || + AreElementsVisible(VsMgr.BallDownRightVisibility, VsMgr.GoalDownRightVisibility) || + AreElementsVisible(VsMgr.BallDownMiddleVisibility, VsMgr.GoalDownMiddleVisibility) || + AreElementsVisible(VsMgr.BallDownLeftVisibility, VsMgr.GoalDownLeftVisibility); // Vérifiez si toutes les paires d'éléments Ball et Goal sont visibles if (!isPlayer1Goalkeeper && !isBallAndGoalVisible) @@ -378,35 +376,7 @@ namespace PenaltyMaster3000.ViewModel private void StartupVisibility() { - BallStartingVisibility = Visibility.Visible; - GoalStartingVisibility = Visibility.Visible; - BallTopRightVisibility = Visibility.Hidden; - GoalTopRightVisibility = Visibility.Hidden; - BallTopMiddleVisibility = Visibility.Hidden; - GoalTopMiddleVisibility = Visibility.Hidden; - BallTopLeftVisibility = Visibility.Hidden; - GoalTopLeftVisibility = Visibility.Hidden; - BallDownRightVisibility = Visibility.Hidden; - GoalDownRightVisibility = Visibility.Hidden; - BallDownMiddleVisibility = Visibility.Hidden; - GoalDownMiddleVisibility = Visibility.Hidden; - BallDownLeftVisibility = Visibility.Hidden; - GoalDownLeftVisibility = Visibility.Hidden; - - OnPropertyChanged(nameof(BallStartingVisibility)); - OnPropertyChanged(nameof(GoalStartingVisibility)); - OnPropertyChanged(nameof(BallTopRightVisibility)); - OnPropertyChanged(nameof(GoalTopRightVisibility)); - OnPropertyChanged(nameof(BallTopMiddleVisibility)); - OnPropertyChanged(nameof(GoalTopMiddleVisibility)); - OnPropertyChanged(nameof(BallTopLeftVisibility)); - OnPropertyChanged(nameof(GoalTopLeftVisibility)); - OnPropertyChanged(nameof(BallDownRightVisibility)); - OnPropertyChanged(nameof(GoalDownRightVisibility)); - OnPropertyChanged(nameof(BallDownMiddleVisibility)); - OnPropertyChanged(nameof(GoalDownMiddleVisibility)); - OnPropertyChanged(nameof(BallDownLeftVisibility)); - OnPropertyChanged(nameof(GoalDownLeftVisibility)); + VsMgr.GameStartedVisibility(); } private void GameEnded() @@ -427,15 +397,21 @@ namespace PenaltyMaster3000.ViewModel // new stuff - private void displayTextOnScreen(int timeToBeDisplayedInSeconds, string textToBeDisplayed) + /// + /// Display an Action text. + /// + /// + /// + private Task DisplayActionText(string textToBeDisplayed, int timeToBeDisplayedInSeconds) { + var tcs = new TaskCompletionSource(); + + // Set text to be displayed ActionText = textToBeDisplayed; ActionTextVisibility = Visibility.Visible; - WhistleImageVisibility = Visibility.Visible; + + // Hide scoreboard ScoreBoardVisibility = Visibility.Hidden; - OnPropertyChanged(nameof(ActionText)); - OnPropertyChanged(nameof(ActionTextVisibility)); - OnPropertyChanged(nameof(WhistleImageVisibility)); OnPropertyChanged(nameof(ScoreBoardVisibility)); // Arrêter le timer précédent s'il était en cours @@ -444,17 +420,19 @@ namespace PenaltyMaster3000.ViewModel refereeTimer.Stop(); } - // Démarrer un nouveau timer pour rendre le texte invisible après 2 secondes + // Démarrer un nouveau timer pour rendre le texte invisible après x secondes refereeTimer = new DispatcherTimer(); refereeTimer.Interval = TimeSpan.FromSeconds(timeToBeDisplayedInSeconds); refereeTimer.Tick += (sender, args) => { RefereeTimer_Tick(sender, args); + tcs.SetResult(true); }; refereeTimer.Start(); - } + return tcs.Task; + } /* * Use the gesture manager to read a gesture */ @@ -473,6 +451,7 @@ namespace PenaltyMaster3000.ViewModel // If new gesture read, replace th gesture name if(gestureRead != args.GestureName) { + // [TODO?] Display gesture on screen gestureRead = args.GestureName; } };