using CDSAE3_Lian_Lian_Kan.Forms.Interface; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Timers; using System.Windows.Forms; using CDSAE3_Lian_Lian_Kan.Extensions; using Timer = System.Timers.Timer; using static System.Windows.Forms.VisualStyles.VisualStyleElement; using CDSAE3_Lian_Lian_Kan.Sound; using CDSAE3_Lian_Lian_Kan; namespace CDSAE3_Lian_Lian_Kan.Forms { public partial class Challenge_Mode : Form, IGameMode { GameControl gameControl; public Challenge_Mode() { InitializeComponent(); timer = new Timer { Interval = 500, AutoReset = true, Enabled = false }; timer.Elapsed += TimerTick; Etcs.current_difficulty = Etcs.Difficulty.challenge; Etcs.loadFinished = false; gameControl = new GameControl((t) => Challenge_Mode_LoadAsync(this,new EventArgs())); game_Panel.Controls.Add(gameControl); gameControl.Dock = DockStyle.Fill; } //这里是行动的起源 Timer timer; double curTime = 0; int score = 0; private void TimerTick(object? sender, ElapsedEventArgs e) { curTime += 0.1; timeLine.set_progress(curTime / 140); } private async void Challenge_Mode_LoadAsync(object sender, EventArgs e) { bool loopStop = false; PausePanel.BringToFront(); int oriSongVolume = Etcs.Song_Volume; { while (Etcs.Song_Volume != 0) { Etcs.Song_Volume = Math.Max(Etcs.Song_Volume - 7, 0); Etcs.song_Audio_Processer.volume_change(Etcs.Song_Volume); await Task.Delay(100); } } { Action loopPlay = null!; loopPlay = (s, player) => { if (!loopStop) Etcs.song_Audio_Processer.set_song("Ambient", 50, loopPlay); }; Etcs.info_Audio_Processer.playMusicClip("Ambient", 50, loopPlay); Label label = new Label { TextAlign = ContentAlignment.MiddleCenter, Font = new Font("Microsoft YaHei UI", 20F), ForeColor = Color.White, BackColor = Color.FromArgb(0, 0, 0, 0), AutoSize = false, Size = new Size(1220, 55), Location = new Point(110, 330) }; Controls.Add(label); label.BringToFront(); string[] strings = { "你也许意识到了", "连连看的实现并不如其规则那样简单", "忙碌的CLR,处理着数以千计的事件", "委托,反射,线程冲突不断发生在各处", "代码的堆叠已经到达极限", "这是最后的连连看,集中精力,不要犯错,在歌曲结束前击败它" }; //4* 7 28s 18s in game 10s for (int i = 0; i < 6; i++) { label.Text = strings[i]; Etcs.info_Audio_Processer.playMusicClip("Message", 60); await Task.Delay(4000); if (i == 2) { loopStop = true; while (Etcs.Song_Volume != 0) { Etcs.Song_Volume = Math.Max(Etcs.Song_Volume - 7, 0); Etcs.song_Audio_Processer.volume_change(Etcs.Song_Volume); await Task.Delay(100); } Etcs.song_Audio_Processer.pause_song(); Etcs.song_Audio_Processer.set_albums("Tatsh"); Etcs.song_Audio_Processer.set_song(Etcs.song_Audio_Processer.get_next_song()); Thread thread = new Thread(async () => { for (int n = 0; n < 8; n++) { Etcs.Song_Volume += 7; Etcs.song_Audio_Processer.volume_change(Etcs.Song_Volume); await Task.Delay(500); } await Task.Delay(9000); foreach (var item in new Label[] { 返回主菜单, 继续游戏, 游戏暂停 }) Invoke(() => item.Visible = true); }); thread.Start(); } } _pauseAllow = true; label.SendToBack(); label.Visible = false; label.Dispose(); } PausePanel.Visible = false; Etcs.song_Audio_Processer.SongFinished += Song_Audio_Processer_SongFinished; ShowAudioVisualizer(); Etcs.hunderd_millsecond_timer.Elapsed += TimerTick; } private async void Song_Audio_Processer_SongFinished(Sound.Song_Audio_processer s, Sound.SongFinishedEventArgs e) { foreach (var item in new Label[] { 返回主菜单, 继续游戏, 游戏暂停 }) item.Visible = false; PausePanel.Visible = true; PausePanel.BackgroundImage = Properties.Resources.trans; for(int i=0;i<200;i+=10) { Color animRed = Color.FromArgb(i, 0, 0); game_Panel.BackColor = animRed; PausePanel.BackColor = animRed; await Task.Delay(10); } PausePanel.BringToFront(); for(int i= 200;i<260;i+=10) { Color animRed = Color.FromArgb(i, 0, 0); PausePanel.BackColor = animRed; await Task.Delay(10); } Etcs.info_Audio_Processer.playMusicClip("failed"); Finished_Handler(this, new FinishArgs { finishType = FinishArgs.FinishType.Time_out }); } int cur_score = 0; public void Finished_Handler(object sender, FinishArgs e) { BeginInvoke(() => { switch (e.finishType) { case FinishArgs.FinishType.All_done: DoPause(); Form form = new FinishedMessageBox(cur_score, (int)curTime); form.FormClosed += ((sender, args) => { Dispose(); Close(); Etcs.form?.change_form(Etcs.charts, false, null, null); }); form.ShowDialog(); break; case FinishArgs.FinishType.Time_out: 退出_Click(this, new EventArgs()); break; } }); } private bool _pauseState = false; private bool search_mode; private int search_left_use_time; /// /// 需要测试!! /// private bool _pauseAllow = false; private void DoPause() { if (!_pauseAllow) return; timer.Enabled = false; Etcs.song_Audio_Processer.pause_song(); _pauseState = true; Bitmap bit = new Bitmap(Width, Height); Graphics g = Graphics.FromImage(bit); g.CompositingQuality = CompositingQuality.HighQuality; g.CopyFromScreen(Etcs.form!.Left+5, Etcs.form!.Top+43, 0, 0, new Size(Width, Height)); PausePanel.BringToFront(); Rectangle rectangle = new Rectangle(0, 0, bit.Width,bit.Height); PausePanel.BackgroundImage= bit.GaussianBlur(); PausePanel.Visible = true; GC.Collect(); } private void DePause() { Etcs.song_Audio_Processer.resume_song(); _pauseState = false; timer.Enabled = true; PausePanel.Visible = false; PausePanel.SendToBack(); } public void TogglePause() { if (_pauseState) DePause(); else DoPause(); } private void ShowAudioVisualizer() { Form audioVisualizer = new AudioVisualizer.MainWindow(); audioVisualizer.TopLevel = false; audioVisualizer.Dock = DockStyle.Fill; AudioVisualizerPanel.Controls.Add(audioVisualizer); audioVisualizer.Show(); } private void 继续游戏_Click(object sender, EventArgs e) { DePause(); } private void 退出_Click(object sender, EventArgs e) { Dispose(); Close(); Etcs.hunderd_millsecond_timer.Elapsed -= TimerTick; Etcs.gameMenuForm!.playFormToMenu(); } private void CanClickLabel_MouseEnter(object sender, EventArgs e) { (sender as Label)!.BackColor = Color.FromArgb(100, 100, 100); } private void CanClickLabel_MouseLeave(object sender, EventArgs e) { (sender as Label)!.BackColor = Color.FromArgb(0, 0, 0, 0); } public void De_pause(object sender, EventArgs e) { } public void Score_Change(object sender, ChangeScoreArgs e) { if (e.add) { score += e.score; if(search_mode) { search_left_use_time--; if(search_left_use_time==0) { search_mode = false; gameControl.Search_Handler(this, new SearchEventArgs { set_search = false }); } } } else score = Math.Min(0, score - e.score); } public void SetTheme() { Etcs.current_block_theme = Etcs.Theme.code; Etcs.gameModeForm = this; } private void DoSearch() { gameControl.Search_Handler(this, new SearchEventArgs { set_search = true }); search_mode = true; search_left_use_time = 3; } private void DoRemake() { Task.Run(() => gameControl.Exchange_Handler(this, new EventArgs())); } public void GetGift_Handler(object sender, GiftArgs e) { Etcs.info_Audio_Processer.playMusicClip("HitSong"); switch (e.giftType) { case GiftArgs.GiftType.Search: DoSearch(); break; case GiftArgs.GiftType.ReMake: DoRemake(); break; } } } }