This commit is contained in:
tanglong 2025-10-21 17:14:28 +08:00
parent 540bc3813b
commit e202153a25
5 changed files with 82 additions and 92 deletions

View File

@ -8,6 +8,7 @@ namespace Enum
{
NotStarted, // 游戏未开始
Running, // 游戏进行中
Finished // 游戏完成
Finished, // 游戏完成
RaiseHand
}
}

View File

@ -142,11 +142,16 @@ namespace Wpf_AiSportsMicrospace
var newPage = new GroupJumpRope();
mainWin?.SwitchPageWithMaskAnimation(newPage, true);
}
else
else if (coverFlow.SelectedIndex == 1)
{
var newPage = new MusicJumpRope();
mainWin?.SwitchPageWithMaskAnimation(newPage, true);
}
else
{
var newPage = new TrainingRecords();
mainWin?.SwitchPageWithMaskAnimation(newPage, true);
}
}
//跳转二级页面

View File

@ -162,14 +162,19 @@ namespace Wpf_AiSportsMicrospace.Views
// 可在这里绑定抽帧事件
_mainWin.HumanFrameUpdated += OnHumanFrameUpdated;
}
private bool _isCountdownStarted = false; // 新增标记
private void OnHumanFrameUpdated(object sender, List<Human> humans)
{
try
{
if (humans == null || humans.Count == 0) return;
switch (_currentGameState)
{
case GameState.NotStarted: // 未开始
if (!_isCountdownStarted) // 只有倒计时未开始才检测左手
{
int leftWaving = DetectLeftHandRaise(humans);
if (leftWaving == 5)
{
@ -179,8 +184,10 @@ namespace Wpf_AiSportsMicrospace.Views
// 举左手逻辑,例如结束动画或退出
var newPage = new Home();
_mainWin?.SwitchPageWithMaskAnimation(newPage, true);
return; // 提前退出
}
else {
}
int rightWaving = DetectRightHandRaise(humans);
if (rightWaving >= 3)
{
@ -188,6 +195,7 @@ namespace Wpf_AiSportsMicrospace.Views
{
case (int)WavingAction.FirstHand:
StartCountdown(3);
_isCountdownStarted = true; // 倒计时开始,停止左手检测
break;
case (int)WavingAction.Raising:
UpdateCountdown();
@ -198,28 +206,11 @@ namespace Wpf_AiSportsMicrospace.Views
break;
}
}
}
break;
case GameState.Running: // 游戏进行中
UpdateCircleCounts(humans);
// 可选:判断游戏结束条件,将状态切换到 Finished
// if (CheckGameFinished()) _currentGameState = GameState.Finished;
break;
//case GameState.Finished: // 游戏完成
// int leftWaving = DetectLeftHandRaise(humans);
// if (leftWaving == 5)
// {
// _mainWin.HumanFrameUpdated -= OnHumanFrameUpdated;
// _mainWin.WebcamClient.StopExtract();
// // 举左手逻辑,例如结束动画或退出
// var newPage = new Home();
// _mainWin?.SwitchPageWithMaskAnimation(newPage, true);
// }
// break;
}
}
catch (Exception ex)
@ -296,6 +287,8 @@ namespace Wpf_AiSportsMicrospace.Views
Utils.StopBackgroundMusic();
_currentGameState = GameState.NotStarted;
_isCountdownStarted = false;
_mainWin.HumanFrameUpdated += OnHumanFrameUpdated;
_mainWin.WebcamClient.StartExtract();
}
@ -657,7 +650,7 @@ namespace Wpf_AiSportsMicrospace.Views
* time:
* name:
*/
public void HideElement(string name , int time)
public void HideElement(string name, int time)
{
var Element = FindName(name) as Grid;
if (Element == null) return;
@ -672,7 +665,7 @@ namespace Wpf_AiSportsMicrospace.Views
* time:
* name:
*/
public void showElement(string name, int time = 600 )
public void showElement(string name, int time = 600)
{
var Element = FindName(name) as FrameworkElement;
if (Element == null) return;

View File

@ -25,7 +25,7 @@
<Grid Width="260" Height="130" VerticalAlignment="Top" HorizontalAlignment="Center" Margin="00,830,00,0" Visibility="Visible" x:Name="countdownGrid">
<Border Background="#9e4ff9" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Opacity="0.5" CornerRadius="30" />
<TextBlock x:Name="countdownText"
Text="100"
Text="00"
FontSize="120"
FontWeight="Bold"
Foreground="#fff"

View File

@ -162,14 +162,18 @@ namespace Wpf_AiSportsMicrospace.Views.JumpRope
// 可在这里绑定抽帧事件
_mainWin.HumanFrameUpdated += OnHumanFrameUpdated;
}
private bool _isCountdownStarted = false; // 新增标记
private void OnHumanFrameUpdated(object sender, List<Human> humans)
{
try
{
if (humans == null || humans.Count == 0) return;
switch (_currentGameState)
{
case GameState.NotStarted: // 未开始
if (!_isCountdownStarted) // 只有倒计时未开始才检测左手
{
int leftWaving = DetectLeftHandRaise(humans);
if (leftWaving == 5)
{
@ -179,9 +183,10 @@ namespace Wpf_AiSportsMicrospace.Views.JumpRope
// 举左手逻辑,例如结束动画或退出
var newPage = new Home();
_mainWin?.SwitchPageWithMaskAnimation(newPage, true);
return; // 提前退出
}
else
{
}
int rightWaving = DetectRightHandRaise(humans);
if (rightWaving >= 3)
{
@ -189,6 +194,7 @@ namespace Wpf_AiSportsMicrospace.Views.JumpRope
{
case (int)WavingAction.FirstHand:
StartCountdown(3);
_isCountdownStarted = true; // 倒计时开始,停止左手检测
break;
case (int)WavingAction.Raising:
UpdateCountdown();
@ -199,28 +205,11 @@ namespace Wpf_AiSportsMicrospace.Views.JumpRope
break;
}
}
}
break;
case GameState.Running: // 游戏进行中
UpdateCircleCounts(humans);
// 可选:判断游戏结束条件,将状态切换到 Finished
// if (CheckGameFinished()) _currentGameState = GameState.Finished;
break;
//case GameState.Finished: // 游戏完成
// int leftWaving = DetectLeftHandRaise(humans);
// if (leftWaving == 5)
// {
// _mainWin.HumanFrameUpdated -= OnHumanFrameUpdated;
// _mainWin.WebcamClient.StopExtract();
// // 举左手逻辑,例如结束动画或退出
// var newPage = new Home();
// _mainWin?.SwitchPageWithMaskAnimation(newPage, true);
// }
// break;
}
}
catch (Exception ex)
@ -229,13 +218,14 @@ namespace Wpf_AiSportsMicrospace.Views.JumpRope
}
}
private int _currentCountdown = 3;
private DateTime _lastUpdateTime = DateTime.Now;
private void StartCountdown(int start = 4)
{
_currentCountdown = start;
countdownText.Text = _currentCountdown.ToString();
countdownGrid.Visibility = Visibility.Visible;
//countdownText.Text = _currentCountdown.ToString();
//countdownGrid.Visibility = Visibility.Visible;
_lastUpdateTime = DateTime.Now;
_mainWin.ShowCountDownAnimation();
Utils.PlayBackgroundMusic("countdown_3.mp3", false);
@ -264,7 +254,7 @@ namespace Wpf_AiSportsMicrospace.Views.JumpRope
countdownText.Text = "GO!";
countdownGrid.Visibility = Visibility.Hidden;
// 启动60秒倒计时独立任务
StartGameCountdown(105);
StartGameCountdown(108);
ShowMusicAnimation();
}
@ -301,6 +291,7 @@ namespace Wpf_AiSportsMicrospace.Views.JumpRope
// 更新游戏状态
_currentGameState = GameState.NotStarted;
_isCountdownStarted = false;
// 恢复视频流
Application.Current.Dispatcher.Invoke(() =>