added visibility manager

begin_project_view
nico-dev 1 year ago
parent 8b45bc52da
commit 6d79b04277

@ -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.
/// <summary>
/// Manages the visibility of the goal's four corners + middle zone.
/// </summary>
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;
}
}
}

@ -87,6 +87,7 @@
<DependentUpon>App.xaml</DependentUpon> <DependentUpon>App.xaml</DependentUpon>
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
<Compile Include="Helpers\VisibilityManager.cs" />
<Compile Include="Navigation\INavigationService.cs" /> <Compile Include="Navigation\INavigationService.cs" />
<Compile Include="Navigation\NavigationService.cs" /> <Compile Include="Navigation\NavigationService.cs" />
<Compile Include="ViewModel\MainVM.cs" /> <Compile Include="ViewModel\MainVM.cs" />

@ -157,7 +157,7 @@
Grid.Column="0" Grid.Column="0"
Background="Red" Background="Red"
FontWeight="Bold" FontWeight="Bold"
FontSize="100" FontSize="20"
VerticalAlignment="Center" VerticalAlignment="Center"
HorizontalAlignment="Center" HorizontalAlignment="Center"
Visibility="{Binding ActionTextVisibility}"/> Visibility="{Binding ActionTextVisibility}"/>

@ -2,6 +2,7 @@
using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Input;
using KinectUtils; using KinectUtils;
using MyGestureBank; using MyGestureBank;
using PenaltyMaster3000.Helpers;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -42,36 +43,46 @@ namespace PenaltyMaster3000.ViewModel
private int numberOfShoots = 0; private int numberOfShoots = 0;
public string ActionText { get; private set; } private string actionText;
public string ActionText
public Visibility ActionTextVisibility { get; private set; } {
get => actionText;
public Visibility WhistleImageVisibility { get; private set; } set => SetProperty(ref actionText, value);
}
public Visibility ScoreBoardVisibility { get; private set; }
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; } private Visibility whistleImageVisibility;
public Visibility GoalStartingVisibility { get; private set; } public Visibility WhistleImageVisibility
{
get => whistleImageVisibility;
set => SetProperty(ref whistleImageVisibility, value);
}
public Visibility BallTopRightVisibility { get; private set; } private Visibility scoreBoardVisibility;
public Visibility GoalTopRightVisibility { get; private set; } public Visibility ScoreBoardVisibility
{
get => scoreBoardVisibility;
set => SetProperty(ref scoreBoardVisibility, value);
}
public Visibility BallTopMiddleVisibility { get; private set; } private Visibility finalResultVisibility;
public Visibility GoalTopMiddleVisibility { get; private set; } public Visibility FinalResultVisibility
{
public Visibility BallTopLeftVisibility { get; private set; } get => finalResultVisibility;
public Visibility GoalTopLeftVisibility { get; private set; } set => SetProperty(ref finalResultVisibility, value);
}
public Visibility BallDownRightVisibility { get; private set; }
public Visibility GoalDownRightVisibility { get; private set; }
public Visibility BallDownMiddleVisibility { get; private set; } /// <summary>
public Visibility GoalDownMiddleVisibility { get; private set; } /// The goal's visibility manager.
/// </summary>
public VisibilityManager VsMgr;
public Visibility BallDownLeftVisibility { get; private set; }
public Visibility GoalDownLeftVisibility { get; private set; }
public string Player1ScoreText { get; private set; } public string Player1ScoreText { get; private set; }
@ -166,9 +177,13 @@ namespace PenaltyMaster3000.ViewModel
OnPropertyChanged(nameof(CurrentImageSource)); OnPropertyChanged(nameof(CurrentImageSource));
} }
/// <summary>
/// Hides the action text when it expires.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void RefereeTimer_Tick(object sender, EventArgs e) private void RefereeTimer_Tick(object sender, EventArgs e)
{ {
// Rendre le texte invisible lorsque le timer expire
ActionTextVisibility = Visibility.Hidden; ActionTextVisibility = Visibility.Hidden;
WhistleImageVisibility = Visibility.Hidden; WhistleImageVisibility = Visibility.Hidden;
OnPropertyChanged(nameof(ActionTextVisibility)); OnPropertyChanged(nameof(ActionTextVisibility));
@ -188,29 +203,27 @@ namespace PenaltyMaster3000.ViewModel
scoreBoardTimer.Stop(); scoreBoardTimer.Stop();
} }
private void Shoot() private async void Shoot()
{ {
StartupVisibility(); StartupVisibility();
displayTextOnScreen(2, "Get Ready to Shoot !");
// Après que le timer a expiré, marquez le tir comme terminé // Après que le timer a expiré, marquez le tir comme terminé
IsShootCompleted = true; IsShootCompleted = true;
OnPropertyChanged(nameof(IsShootCompleted)); OnPropertyChanged(nameof(IsShootCompleted));
// Liste des propriétés de visibilité des éléments Goal // Liste des propriétés de visibilité des éléments Goal
List<Visibility> goalVisibilities = new List<Visibility> List<Visibility> goalVisibilities = new List<Visibility>
{ {
GoalTopRightVisibility, GoalTopMiddleVisibility, GoalTopLeftVisibility, VsMgr.GoalTopRightVisibility, VsMgr.GoalTopMiddleVisibility, VsMgr.GoalTopLeftVisibility,
GoalDownRightVisibility, GoalDownMiddleVisibility, GoalDownLeftVisibility VsMgr.GoalDownRightVisibility, VsMgr.GoalDownMiddleVisibility, VsMgr.GoalDownLeftVisibility
}; };
// Générez un index aléatoire pour choisir l'élément Goal à rendre visible // Générez un index aléatoire pour choisir l'élément Goal à rendre visible
//int randomIndex = random.Next(goalVisibilities.Count); //int randomIndex = random.Next(goalVisibilities.Count);
// Let the player choose a angle to shoot // 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 // Définissez la visibilité de l'élément Goal choisi sur Visible
//goalVisibilities[randomIndex] = Visibility.Visible; //goalVisibilities[randomIndex] = Visibility.Visible;
@ -220,20 +233,12 @@ namespace PenaltyMaster3000.ViewModel
OnPropertyChanged(nameof(BallStartingVisibility)); OnPropertyChanged(nameof(BallStartingVisibility));
OnPropertyChanged(nameof(GoalStartingVisibility)); OnPropertyChanged(nameof(GoalStartingVisibility));
GoalTopRightVisibility = goalVisibilities[0]; VsMgr.GoalTopRightVisibility = goalVisibilities[0];
GoalTopMiddleVisibility = goalVisibilities[1]; VsMgr.GoalTopMiddleVisibility = goalVisibilities[1];
GoalTopLeftVisibility = goalVisibilities[2]; VsMgr.GoalTopLeftVisibility = goalVisibilities[2];
GoalDownRightVisibility = goalVisibilities[3]; VsMgr.GoalDownRightVisibility = goalVisibilities[3];
GoalDownMiddleVisibility = goalVisibilities[4]; VsMgr.GoalDownMiddleVisibility = goalVisibilities[4];
GoalDownLeftVisibility = goalVisibilities[5]; VsMgr.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));
IsShootCompleted = false; IsShootCompleted = false;
OnPropertyChanged(nameof(IsShootCompleted)); OnPropertyChanged(nameof(IsShootCompleted));
@ -272,8 +277,8 @@ namespace PenaltyMaster3000.ViewModel
// Liste des propriétés de visibilité des éléments Ball [TEMPORAIRE !] // Liste des propriétés de visibilité des éléments Ball [TEMPORAIRE !]
List<Visibility> ballVisibilities = new List<Visibility> List<Visibility> ballVisibilities = new List<Visibility>
{ {
BallTopRightVisibility, BallTopMiddleVisibility, BallTopLeftVisibility, VsMgr.BallTopRightVisibility, VsMgr.BallTopMiddleVisibility, VsMgr.BallTopLeftVisibility,
BallDownRightVisibility, BallDownMiddleVisibility, BallDownLeftVisibility VsMgr.BallDownRightVisibility, VsMgr.BallDownMiddleVisibility, VsMgr.BallDownLeftVisibility
}; };
// Générez un index aléatoire pour choisir l'élément Goal à rendre visible // 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(BallStartingVisibility));
OnPropertyChanged(nameof(GoalStartingVisibility)); OnPropertyChanged(nameof(GoalStartingVisibility));
BallTopRightVisibility = ballVisibilities[0]; VsMgr.BallTopRightVisibility = ballVisibilities[0];
BallTopMiddleVisibility = ballVisibilities[1]; VsMgr.BallTopMiddleVisibility = ballVisibilities[1];
BallTopLeftVisibility = ballVisibilities[2]; VsMgr.BallTopLeftVisibility = ballVisibilities[2];
BallDownRightVisibility = ballVisibilities[3]; VsMgr.BallDownRightVisibility = ballVisibilities[3];
BallDownMiddleVisibility = ballVisibilities[4]; VsMgr.BallDownMiddleVisibility = ballVisibilities[4];
BallDownLeftVisibility = ballVisibilities[5]; VsMgr.BallDownLeftVisibility = ballVisibilities[5];
OnPropertyChanged(nameof(BallTopRightVisibility));
OnPropertyChanged(nameof(BallTopMiddleVisibility));
OnPropertyChanged(nameof(BallTopLeftVisibility));
OnPropertyChanged(nameof(BallDownRightVisibility));
OnPropertyChanged(nameof(BallDownMiddleVisibility));
OnPropertyChanged(nameof(BallDownLeftVisibility));
IsSaveCompleted = false; IsSaveCompleted = false;
OnPropertyChanged(nameof(IsSaveCompleted)); OnPropertyChanged(nameof(IsSaveCompleted));
@ -307,12 +305,12 @@ namespace PenaltyMaster3000.ViewModel
private void Result() private void Result()
{ {
bool isBallAndGoalVisible = AreElementsVisible(BallTopRightVisibility, GoalTopRightVisibility) || bool isBallAndGoalVisible = AreElementsVisible(VsMgr.BallTopRightVisibility, VsMgr.GoalTopRightVisibility) ||
AreElementsVisible(BallTopMiddleVisibility, GoalTopMiddleVisibility) || AreElementsVisible(VsMgr.BallTopMiddleVisibility, VsMgr.GoalTopMiddleVisibility) ||
AreElementsVisible(BallTopLeftVisibility, GoalTopLeftVisibility) || AreElementsVisible(VsMgr.BallTopLeftVisibility, VsMgr.GoalTopLeftVisibility) ||
AreElementsVisible(BallDownRightVisibility, GoalDownRightVisibility) || AreElementsVisible(VsMgr.BallDownRightVisibility, VsMgr.GoalDownRightVisibility) ||
AreElementsVisible(BallDownMiddleVisibility, GoalDownMiddleVisibility) || AreElementsVisible(VsMgr.BallDownMiddleVisibility, VsMgr.GoalDownMiddleVisibility) ||
AreElementsVisible(BallDownLeftVisibility, GoalDownLeftVisibility); AreElementsVisible(VsMgr.BallDownLeftVisibility, VsMgr.GoalDownLeftVisibility);
// Vérifiez si toutes les paires d'éléments Ball et Goal sont visibles // Vérifiez si toutes les paires d'éléments Ball et Goal sont visibles
if (!isPlayer1Goalkeeper && !isBallAndGoalVisible) if (!isPlayer1Goalkeeper && !isBallAndGoalVisible)
@ -378,35 +376,7 @@ namespace PenaltyMaster3000.ViewModel
private void StartupVisibility() private void StartupVisibility()
{ {
BallStartingVisibility = Visibility.Visible; VsMgr.GameStartedVisibility();
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));
} }
private void GameEnded() private void GameEnded()
@ -427,15 +397,21 @@ namespace PenaltyMaster3000.ViewModel
// new stuff // new stuff
private void displayTextOnScreen(int timeToBeDisplayedInSeconds, string textToBeDisplayed) /// <summary>
/// Display an Action text.
/// </summary>
/// <param name="textToBeDisplayed"></param>
/// <param name="timeToBeDisplayedInSeconds"></param>
private Task DisplayActionText(string textToBeDisplayed, int timeToBeDisplayedInSeconds)
{ {
var tcs = new TaskCompletionSource<bool>();
// Set text to be displayed
ActionText = textToBeDisplayed; ActionText = textToBeDisplayed;
ActionTextVisibility = Visibility.Visible; ActionTextVisibility = Visibility.Visible;
WhistleImageVisibility = Visibility.Visible;
// Hide scoreboard
ScoreBoardVisibility = Visibility.Hidden; ScoreBoardVisibility = Visibility.Hidden;
OnPropertyChanged(nameof(ActionText));
OnPropertyChanged(nameof(ActionTextVisibility));
OnPropertyChanged(nameof(WhistleImageVisibility));
OnPropertyChanged(nameof(ScoreBoardVisibility)); OnPropertyChanged(nameof(ScoreBoardVisibility));
// Arrêter le timer précédent s'il était en cours // Arrêter le timer précédent s'il était en cours
@ -444,17 +420,19 @@ namespace PenaltyMaster3000.ViewModel
refereeTimer.Stop(); 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 = new DispatcherTimer();
refereeTimer.Interval = TimeSpan.FromSeconds(timeToBeDisplayedInSeconds); refereeTimer.Interval = TimeSpan.FromSeconds(timeToBeDisplayedInSeconds);
refereeTimer.Tick += (sender, args) => refereeTimer.Tick += (sender, args) =>
{ {
RefereeTimer_Tick(sender, args); RefereeTimer_Tick(sender, args);
tcs.SetResult(true);
}; };
refereeTimer.Start(); refereeTimer.Start();
}
return tcs.Task;
}
/* /*
* Use the gesture manager to read a gesture * Use the gesture manager to read a gesture
*/ */
@ -473,6 +451,7 @@ namespace PenaltyMaster3000.ViewModel
// If new gesture read, replace th gesture name // If new gesture read, replace th gesture name
if(gestureRead != args.GestureName) if(gestureRead != args.GestureName)
{ {
// [TODO?] Display gesture on screen
gestureRead = args.GestureName; gestureRead = args.GestureName;
} }
}; };

Loading…
Cancel
Save